草稿
1.介紹編譯器和解釋器的區(qū)別枣氧,以及各自優(yōu)點
2.介紹編譯器的基本結構:詞法分析(token stream)溢十,語法分析(syntax tree),語義分析(syntax tree)达吞,中間代碼生成(intermddiate representation)张弛,優(yōu)化(intermddiate representation),目標代碼產(chǎn)生(target-machine code)酪劫。
如下圖所示吞鸭,所有圖片均來自英文編譯原理第二版。
3.其中編譯階段可以分為前段和后端覆糟,前者主要是分析(analysis)刻剥,后者主要是合成(synthesis),其中整個階段都會對符號表進行讀出和寫入操作
詞法分析
作用:讀入組成源程序的字符流滩字,找出每個詞素(lexemes)造虏,也就是有語法意義最小單位的字符或者字符串。統(tǒng)一格式麦箍,備用漓藕。
產(chǎn)出:<token-name , sttribute-value>,前者代表抽象符號挟裂,后者代表前者的符號表的入口地址享钞。
構造方法:正則表達式,有限自動機
例:position = initial + rate * 60
經(jīng)過詞法分析之后將會變成<id,1> <=> <id,2> <+> <id,3> <*> <60>
上面的賦值語句經(jīng)過一輪完整的編譯過程如下表所示
語法分析(syntax analysis或者parsing)
作用:在詞法分析基礎上根據(jù)語法規(guī)則把單詞符號組成各類的語法單位诀蓉,例如短語栗竖,句子,程序塊等渠啤。
過程:語法分析器利用詞法分析器產(chǎn)生的token form中的第一部分token name來創(chuàng)建語法樹狐肢,目的是用來表示token stream的語法結構。一個典型的語法樹的內節(jié)點代表一個操作符沥曹,其子節(jié)點代表的是作用于操作符的操作數(shù)份名,樣本可參看Figure 1.7中的語法分析部分。
產(chǎn)出:語法樹
構造方法:推導和規(guī)約架专。用上下文無關文法和描述程序語言的語法結構同窘。
語義分析
作用:利用語法樹和符號表來檢查源程序是否符合程序語言的規(guī)則玄帕,其中一個重要的過程就是類型檢查部脚。
產(chǎn)出:語法樹(注意語義分析產(chǎn)生的語法樹和語法分析產(chǎn)生的語法樹的不同)
例:螞蟻帶上眼鏡。這句話語法正確裤纹,但是語義卻是錯誤的委刘。
中間代碼生成
暫略丧没。
代碼優(yōu)化
暫略。
目標代碼生成
暫略锡移。
符號表管理
暫略呕童。
4.過程組合
在實際編寫編譯器的過程中,可以不必按照上訴所說把每一步分的那么精細淆珊,可以將有些在邏輯上相同的步驟合并成一個稱為遍的過程中夺饲,例如將詞法分析、語法分析施符、語義分析組合成一個遍往声,代碼優(yōu)化組合成另外一個遍,等等戳吝。這樣組合分類的好處是:
- 邏輯清晰
- 增加代碼移植性
- 交叉語言:將前端組合成一個遍浩销,把用語言A寫的程序分析完成之后,后端我使用能夠產(chǎn)生B語言的后端听哭,這樣就可以將一個語言編寫的程序編譯成適合其它機器使用的程序了慢洋。或者將許多不同語言編程的程序進行前端翻譯陆盘,完成之后統(tǒng)一使用一個相同后端編譯普筹,這樣就實現(xiàn)了多種語言對特定機器的編譯過程。(類似Java的bytecode的生成和作用)
5.語言的發(fā)展和分類
第一代語言:機器語言
第二代語言:匯編語言
第三代語言:高級語言礁遣,例如C,C++,Fortran,Cobol,Lisp
第四代語言:應用語言斑芜,例如SQL for databse queries , Postscript for text formatting
第五代語言:邏輯語言,例如Prolog
命令式語言:告訴計算機應該如何一步步做來完成目標祟霍。例如C,C++
聲明式語言:告訴計算機做什么來完成目標杏头。例如SQL,包括后面的函數(shù)式語言和邏輯語言
區(qū)別:舉個例子沸呐,隨便寫一個SQL的selecet語句就明白了醇王。
函數(shù)式語言:ML,Haskell
邏輯語言:prolog
馮洛伊曼語言
面向對象語言:C++
腳本語言:shell