第一章、基本概念
01锭硼、對自然語言而言房资,那些只掌握有限語言的人,其思維的復雜程度檀头,特別是其抽象思維的深度轰异,必然受到局限岖沛。換言之,人們對不能口頭或筆頭描述的事物結構必定很難將其概念化搭独。
02婴削、往往只有懂得有關的程序設計語言實現(xiàn)細節(jié)的程序員才可能發(fā)現(xiàn)和改正某些類型的程序錯誤;不懂得遞歸調(diào)用是如何實現(xiàn)的程序員牙肝,常常不知道地柜算法比等價的迭代算法要慢得多唉俗。
03、程序設計語言的正交性指的是惊奇,使用該語言中一組相對少量的基本結構互躬,經(jīng)過相對少的結合步驟,可以構成該語言的控制結構與數(shù)據(jù)結構颂郎。而且吼渡,它的基本結構的任何組合都是合法的和有意義的。
04乓序、正交語言特性的意義是獨立于它在程序中出現(xiàn)的上下文的寺酪。缺乏正交性會導致語言規(guī)則異常。語言的正交性與語言的簡單性是緊密相關的:程序設計語言的正交性設計得越好替劈,該語言規(guī)則中的異常情況就會越少寄雀。
05、過分地追求正交性也會產(chǎn)生問題陨献,極端的正交性會導致不必要的復雜性盒犹。一組較少量的基本結構以及一套相互一致的規(guī)則組合(即正交性),比僅僅具有大量的基本結構要優(yōu)越得多眨业。
06急膀、過分的正交性也會有損于可寫性,當基本結構的任意結合幾乎都是合法時龄捡,程序中的錯誤就很難被檢測出來卓嫂。這也會導致編譯器不能夠發(fā)現(xiàn)代碼中的謬誤。
07聘殖、抽象指的是以合法省略許多細節(jié)的方式晨雳,來定義并且使用復雜結構或復雜運算的能力。
08奸腺、類型檢測是語言可靠性中的一個重要因素餐禁。編譯時的類型檢測要比運行時的類型檢測更為理想,因為運行時的類型檢測是高代價的突照。程序中的錯誤發(fā)現(xiàn)得越早坠宴,改正錯誤的代價就越低。
09绷旗、如果具有中斷運行時錯誤(以及這個程序所發(fā)現(xiàn)的其他非正常情況)并改正錯誤然后繼續(xù)運行的能力喜鼓,將顯然有助于提高程序的可靠性。這種程序設計語言的機制稱之為異常處理衔肢。
10庄岖、無論某語言的編譯器質(zhì)量如何,要求進行大量運行時類型檢測的語言必將阻礙代碼的高速執(zhí)行角骤。
11隅忿、由于運算指令被順序地存儲于相鄰的存儲單元,所以馮諾依曼計算機上迭代式的循環(huán)是高速的邦尊。這種高效率不鼓勵使用遞歸式循環(huán)背桐,盡管遞歸式循環(huán)常常更為自然。
12蝉揍、面向?qū)ο蟮某绦蛟O計方法學始于數(shù)據(jù)抽象链峭。這種方法將數(shù)據(jù)處理和數(shù)據(jù)對象封裝在一起,并控制對數(shù)據(jù)的訪問又沾,并添加了繼承與動態(tài)方法綁定弊仪。
13、Java語言的定義要求杖刷,必須對所有數(shù)組元素的引用進行檢測励饵,以保證所有下標都在合法的范圍之內(nèi)。這個步驟給包含大量數(shù)組元素引用的Java程序增加了很大的執(zhí)行代價滑燃。C語言不要求進行下標范圍檢測役听,所以C程序的執(zhí)行速度要比語義上等價的Java程序要快得多;當然Java程序更為可靠表窘。Java語言的設計人員以程序執(zhí)行效率為代價換取了可靠性典予。
14、一臺計算機的存儲器與它的處理器之間的鏈接速度通常決定著這臺計算機的速度蚊丐,因為執(zhí)行指令的速度往往比將指令傳遞到處理器的速度更快熙参,這一問題被稱為馮諾依曼瓶頸。
15麦备、Java語言的最初實現(xiàn)都是采用混合方法孽椰。其中被稱為字節(jié)碼的中間形式給任何裝有字節(jié)碼的解釋器以及與之相關的運行時系統(tǒng)的機器提供了可移植性。所有這樣的機器都被統(tǒng)稱為Java虛擬機凛篙。而現(xiàn)在有些系統(tǒng)將Java字節(jié)碼翻譯為機器碼黍匾,以便達到更快的執(zhí)行速度。
16呛梆、即使(just-in-time锐涯,JIT)實現(xiàn)系統(tǒng)最初將程序翻譯成一種中間語言。然后在執(zhí)行的過程中填物,當中間語言的方法被調(diào)用時纹腌,這種實現(xiàn)系統(tǒng)再將中間語言的方法翻譯為機器碼■眨現(xiàn)在JIT實現(xiàn)系統(tǒng)被廣泛用于Java程序。所有的.NET語言也都是用JIT系統(tǒng)實現(xiàn)的升薯。
第二章莱褒、主要程序設計語言的發(fā)展
無
第三章、描述語法和語義
01涎劈、語言的使用人員必須能夠通過查閱語言參考手冊來確定如何編寫軟件系統(tǒng)广凸。教科書和培訓課程固然能夠幫助學習語言,然而通常蛛枚,語言手冊是一種語言唯一的權威性信息來源谅海。
02、程序設計語言的語法是它的表達式蹦浦、語句和程序單元的形式扭吁,而它的語義則是這些表達式、語句和程序單元的含義白筹。
03智末、程序設計語言的語法形式描述通常不包括對于最低層次語法單元的描述,這些語法小單元稱為詞素(Lexeme)徒河。詞素的描述由詞法說明給出系馆,它與語言的語法描述是分開的。一種程序設計語言的詞素包括它的字面值顽照、操作符和特殊字由蘑,以及其他。我們也可以認為程序是一些詞素的串代兵,而不是字符的串尼酿。
04、在BNF的描述或文法中植影,抽象通常被稱為非終結符(nonterminal symbol)裳擎,或者簡稱為非終結(nonterminal),而規(guī)則中的詞素和標記則被稱為終結符(terminal symbol)思币,或者簡稱為終結(terminal)鹿响。一個BNF描述,或一種文法谷饿,僅僅是一個規(guī)則的集合惶我。BNF盡管簡單,但它具有充分的表達能力來描述幾乎所有的程序設計語言的語法博投。
05绸贡、數(shù)學中使用省略符號(......)來表示長度可變,BNF中沒有,而是使用遞歸來作為此類替代方法听怕。如果一條規(guī)則中的LHS(Left Hand Side)出現(xiàn)在它的RHS(Right Hand Side)當中捧挺,我們稱這條規(guī)則是遞歸的。
06尿瞭、文法是定義語言的生成裝置松忍。句子的生成則被稱為派生。
07筷厘、語法分析樹的每一個內(nèi)部節(jié)點都由一個非終結符來標記;而它的每一個葉子節(jié)點都由一個終結符來標記宏所。語法分析樹的每一顆子樹都描述語句中抽象的一個實例酥艳。
08、如果由一條文法生成的句子具有兩種或者多種不同的語法分析樹爬骤,就稱這條文法是歧義的充石。
09、語法分析樹與派生之間的聯(lián)系非常緊密:很容易從它們兩者中的任意一個構造出另外一個霞玄。非歧義的文法的每一個派生只有唯一的語法分析樹骤铃,盡管這棵樹能夠被不同的派生所表示。
10坷剧、操作符的結合性:當一條文法的LHS也出現(xiàn)在它的RHS的起始位置惰爬,這條規(guī)則就被稱為左遞歸的,左遞歸說明左結合性惫企。如果一條文法規(guī)則的LHS出現(xiàn)在RHS的最右端撕瞧,則該條文法規(guī)則是右遞歸的,右遞歸說明右結合性狞尔。