草稿
1.介紹編譯器和解釋器的區(qū)別,以及各自優(yōu)點(diǎn)
2.介紹編譯器的基本結(jié)構(gòu):詞法分析(token stream),語法分析(syntax tree),語義分析(syntax tree),中間代碼生成(intermddiate representation),優(yōu)化(intermddiate representation),目標(biāo)代碼產(chǎn)生(target-machine code)。
如下圖所示,所有圖片均來自英文編譯原理第二版。

3.其中編譯階段可以分為前段和后端,前者主要是分析(analysis),后者主要是合成(synthesis),其中整個階段都會對符號表進(jìn)行讀出和寫入操作
詞法分析
作用:讀入組成源程序的字符流,找出每個詞素(lexemes),也就是有語法意義最小單位的字符或者字符串。統(tǒng)一格式,備用。
產(chǎn)出:<token-name , sttribute-value>,前者代表抽象符號,后者代表前者的符號表的入口地址。
構(gòu)造方法:正則表達(dá)式,有限自動機(jī)
例:position = initial + rate * 60
經(jīng)過詞法分析之后將會變成<id,1> <=> <id,2> <+> <id,3> <*> <60>
上面的賦值語句經(jīng)過一輪完整的編譯過程如下表所示

語法分析(syntax analysis或者parsing)
作用:在詞法分析基礎(chǔ)上根據(jù)語法規(guī)則把單詞符號組成各類的語法單位,例如短語,句子,程序塊等。
過程:語法分析器利用詞法分析器產(chǎn)生的token form中的第一部分token name來創(chuàng)建語法樹,目的是用來表示token stream的語法結(jié)構(gòu)。一個典型的語法樹的內(nèi)節(jié)點(diǎn)代表一個操作符,其子節(jié)點(diǎn)代表的是作用于操作符的操作數(shù),樣本可參看Figure 1.7中的語法分析部分。
產(chǎn)出:語法樹
構(gòu)造方法:推導(dǎo)和規(guī)約。用上下文無關(guān)文法和描述程序語言的語法結(jié)構(gòu)。
語義分析
作用:利用語法樹和符號表來檢查源程序是否符合程序語言的規(guī)則,其中一個重要的過程就是類型檢查。
產(chǎn)出:語法樹(注意語義分析產(chǎn)生的語法樹和語法分析產(chǎn)生的語法樹的不同)
例:螞蟻帶上眼鏡。這句話語法正確,但是語義卻是錯誤的。
中間代碼生成
暫略。
代碼優(yōu)化
暫略。
目標(biāo)代碼生成
暫略。
符號表管理
暫略。
4.過程組合
在實(shí)際編寫編譯器的過程中,可以不必按照上訴所說把每一步分的那么精細(xì),可以將有些在邏輯上相同的步驟合并成一個稱為遍的過程中,例如將詞法分析、語法分析、語義分析組合成一個遍,代碼優(yōu)化組合成另外一個遍,等等。這樣組合分類的好處是:
- 邏輯清晰
- 增加代碼移植性
- 交叉語言:將前端組合成一個遍,把用語言A寫的程序分析完成之后,后端我使用能夠產(chǎn)生B語言的后端,這樣就可以將一個語言編寫的程序編譯成適合其它機(jī)器使用的程序了?;蛘邔⒃S多不同語言編程的程序進(jìn)行前端翻譯,完成之后統(tǒng)一使用一個相同后端編譯,這樣就實(shí)現(xiàn)了多種語言對特定機(jī)器的編譯過程。(類似Java的bytecode的生成和作用)
5.語言的發(fā)展和分類
第一代語言:機(jī)器語言
第二代語言:匯編語言
第三代語言:高級語言,例如C,C++,Fortran,Cobol,Lisp
第四代語言:應(yīng)用語言,例如SQL for databse queries , Postscript for text formatting
第五代語言:邏輯語言,例如Prolog
命令式語言:告訴計算機(jī)應(yīng)該如何一步步做來完成目標(biāo)。例如C,C++
聲明式語言:告訴計算機(jī)做什么來完成目標(biāo)。例如SQL,包括后面的函數(shù)式語言和邏輯語言
區(qū)別:舉個例子,隨便寫一個SQL的selecet語句就明白了。
函數(shù)式語言:ML,Haskell
邏輯語言:prolog
馮洛伊曼語言
面向?qū)ο笳Z言:C++
腳本語言:shell