自然语言

人类讲的语言,这类语言不是人为设计(虽然有人试图强加一些规则)而是自然进化的。

形式语言(Formal Language)

是为了特定应用而人为设计的语言。例如数学家用的数字和运算符号、化学家用的分子式等。编程语言也是一种形式语言,是专门设计用来表达计算过程的形式语言。

  • 形式语言有严格的语法(Syntax)规则
  • 语法规则是由符号(Token)和结构(Structure)的规则所组成的。
  • 关于Token的规则称为词法(Lexical)规则,而关于结构的规则称为语法(Grammar)规则[1]。[1] Syntax和Grammar通常都翻译成“语法”,这让初学者非常混乱,Syntax的含义其实包含了Lexical和Grammar的规则

    虽然形式语言和自然语言有很多共同之处,包括Token、结构和语义,但是也有很多不一样的地方。

  1. 歧义性(Ambiguity)自然语言充满歧义,人们通过上下文的线索和自己的常识来解决这个问题。形式语言的设计要求是清晰的、毫无歧义的,这意味着每个语句都必须有确切的含义而不管上下文如何。
  2. 冗余性(Redundancy)为了消除歧义减少误解,自然语言引入了相当多的冗余。结果是自然语言经常说得啰里啰嗦,而形式语言则更加紧凑,极少有冗余。
  3. 与字面意思的一致性自然语言充斥着成语和隐喻(Metaphor),我在某种场合下说“The other shoe fell”,可能并不是说谁的鞋掉了。而形式语言中字面(Literal)意思基本上就是真实意思,也会有一些例外,例如下一章要讲的C语言转义序列,但即使有例外也会明确规定哪些字面意思不是真实意思,它们所表示的真实意思又是什么。

    现在给出一些关于阅读程序(包括其它形式语言)的建议。

  4. 首先请记住形式语言远比自然语言紧凑,所以要多花点时间来读。

  5. 其次,结构很重要,从上到下从左到右读往往不是一个好办法,而应该学会在大脑里解析:识别Token,分解结构。
  6. 最后,请记住细节的影响,诸如拼写错误和标点错误这些在自然语言中可以忽略的小毛病会把形式语言搞得面目全非。