自然語言(Natural Language)就是人類所講的語言独泞,如漢語亥至、英語、法語等屈溉。這類語言不是認(rèn)為設(shè)計(雖然有人視圖強(qiáng)加一些規(guī)則)塞关,而是自然進(jìn)化的。
形式語言(Formal Language)是為了特定應(yīng)用而人為設(shè)計的語言语婴。如數(shù)學(xué)家用的數(shù)字和運(yùn)算符號描孟、化學(xué)家用的分子式等驶睦。編程語言是一種形式語言砰左,是專門設(shè)計用來表達(dá)計算過程的形式語言。
形式語言有嚴(yán)格的語法(Syntax)規(guī)則场航,例如3+3=6
是一個語法正確的數(shù)學(xué)等式缠导,而3=+6$
則不是。語法規(guī)則是由符號(Token)和結(jié)構(gòu)(Structure)的規(guī)則所組成的溉痢。
Token的概念相當(dāng)于自然語言中的單詞和標(biāo)點(diǎn)僻造、數(shù)學(xué)式中的數(shù)和運(yùn)算符憋他、化學(xué)分子式中的元素名和數(shù)字。例如3+=6$
的問題之一在于$
不是一個合法的數(shù)髓削,也不是一個實(shí)現(xiàn)定義好的運(yùn)算符竹挡。
結(jié)構(gòu)是指Token的排列方式,3+=6$
有一個結(jié)構(gòu)上的錯誤立膛,雖然+
和=
都是合法的運(yùn)算符揪罕,但不能在=
之后緊跟+
。
關(guān)于Token的規(guī)則稱為語法(Lexical)規(guī)則宝泵,關(guān)于結(jié)構(gòu)的規(guī)則稱為詞法(Grammar)規(guī)則好啰。
很不幸的,Syntax和Grammar通常都被翻譯為“語法”儿奶,這讓人非晨蛲混亂。Syntax的含義其實(shí)包含了Lexical和Grammar的規(guī)則闯捎,還包含了一部分語義的規(guī)則椰弊,例如在C程序中變量應(yīng)該先聲明后使用。
即使在英文的文獻(xiàn)中Syntax和Grammar也經(jīng)橙勘牵混用男应,有些文獻(xiàn)中Syntax的含義不包括Lexical規(guī)則,只要注意上下文就不會誤解娱仔。
當(dāng)閱讀一個自然語言的句子或一種形式語言的語句時沐飘,你不僅要搞清楚每個詞(Token)是什么意思,而且必須搞清楚整個句子的結(jié)構(gòu)是什么樣的(在自然語言中你只是沒有意識到牲迫,但的確這樣做了耐朴,尤其是在讀外語時你肯定也意識到了)。整個分析句子結(jié)構(gòu)的過程稱為解析(Parse)盹憎。
例如筛峭,當(dāng)你聽到“The other shoe fell.”時,你理解“the other shoe”是主語而"fell"是謂語動詞陪每,一旦解析完成影晓,你就搞懂了句子的意思。如果知道“shoe”是什么東西檩禾,“fell”意味著什么挂签,這句話是在什么上下文(Context)中說的,你還能理解這個句子主要暗示的內(nèi)容盼产,這些屬于語義(Semantic)的范疇饵婆。
雖然形式語言和自然語言有很多共同之處,包括Token戏售、結(jié)構(gòu)侨核、語義草穆,但也有很多不同之處。
- 歧義性(Ambiguity)
自然語言充滿歧義搓译,人們通過上下文的線索和自己的常識來解決這個問題悲柱。形式語言的設(shè)計要求是清晰的、毫無歧義的些己,這意味著每個語句都必須有確切的含義而不管上下文如何诗祸。
- 冗余性(Redundancy)
為了消除歧義減少誤解,自然語言引入了相當(dāng)多的冗余轴总。結(jié)果是自然語言經(jīng)常說得羅里吧嗦直颅,而形式語言更加緊湊,極少有冗余怀樟。
- 與字面意思一致性
自然語言充斥著成語和隱喻(Metaphor)功偿,在某種場合下說“The other shoe fell”,可能并不是說誰的鞋子掉了往堡。而形式語言中字面(Literal)意思基本上就是真實(shí)意思械荷,也會有些例外,例如轉(zhuǎn)義序列虑灰,但即使有例外也會明確規(guī)定哪些字面意思不是真實(shí)意思吨瞎,它們所表示的真實(shí)意思又是什么。
說自然語言長大的人(實(shí)際上沒人例外)穆咐,往往有一個適用形式語言的困難過程颤诀。某種意義上,形式語言和自然語言之間的不同正像詩歌和說明文的區(qū)別对湃,當(dāng)然崖叫,前者之間的區(qū)別比后者更明顯。
- 詩歌
詞語的發(fā)音和意思一樣重要拍柒,全詩作為一個整體創(chuàng)造出一種效果或表達(dá)一種感情心傀。歧義和非字面意思不僅僅是常見的而且是刻意使用的。
- 說明文
詞語的字面意思顯得更重要拆讯,并且結(jié)構(gòu)能傳遞更多的信息脂男。詩歌只能看一個整體,而說明文更適合逐字逐句分析种呐,但仍然充滿歧義宰翅。
- 程序
計算機(jī)程序是毫無歧義的,字面和本意高度一致陕贮,能夠完全通過對Token和結(jié)果的分析加以理解堕油。
現(xiàn)在給出一些關(guān)于閱讀程序(包括其他形式語言)的建議。首先請記住形式語言遠(yuǎn)比自然語言緊湊肮之,所以要花點(diǎn)兒時間來讀掉缺。其次,結(jié)構(gòu)很重要戈擒,從上到下從左到右往往不是一個好辦法眶明,而應(yīng)該學(xué)會在大腦里理解:識別Token,分解結(jié)構(gòu)筐高。最后搜囱,請記住細(xì)節(jié)的影響,諸如拼寫錯誤和標(biāo)點(diǎn)錯誤這些在自然語言中可以忽略的小毛病會把形式語言搞得面目全非柑土。