編譯程序指:把某一種高級語言程序等價地轉換成另外一張低級語言程序(如彙編語言或機器代碼)的程序。
高級語言程序-翻譯->機器語言程序-運行->結果。
其中編譯程序又能夠分爲:
診斷編譯程序(Diagnostic Compiler)--專門用於幫助程序員開發和調試,對於目標代碼的效率不關注。
優化編譯程序(Optimizing Compiler)--側重於提升目標代碼的執行效率,可以生成高效的目標代碼。
交叉編譯程序(Cross Compiler)--運行編譯程序的機器叫作宿主機,運行目標代碼的機器咱們稱爲目標機,通常來講宿主機和目標機是同一個機器,若是一個編譯程序產生不屬於宿主機的目標代碼,咱們稱其爲交叉編譯程序。
可變目標編譯程序(Retargetable Compiler)--不須要重寫與機器無關的部分,只要改變與目標機器有關的部分,就能針對不一樣的平臺生成不一樣的代碼。前端
把源語言寫的源程序做爲輸入,但不產生目標程序,而是邊解釋邊執行源程序。
不一樣於編譯程序,解釋程序不會產生完整的目標程序文件。(如python語言)
高級語言程序-解釋->結果python
類比天然語言的翻譯:
把英文翻譯爲中文:
1.識別出句子紅的一個個單詞。
2.分析句子的語法結構。
3.根據句子的含義進行初步翻譯。
4.對譯文進行修飾。
5.寫出最後的譯文。
與編譯程序工做的五個階段對應爲:
1.詞法分析。
2.語法分析。
3.中間代碼產生。
4.優化。
5.目標代母產生。程序員
任務:輸入源程序,對構成源程序的字符進行掃描和分解,識別出單詞符號。
依循的原則:構詞規則。
描述工具:有限自動機。編程
任務:在詞法分析的基礎上,根據語法規則把單詞符號串分解成各種語法單位(語法範疇)。
依循的原則:語法規則。
描述工具:上下文無關文法。後端
任務:對各種不一樣的語法單位按語言的語義進行初步翻譯。
依循的原則:語義規則
描述工具:屬性文法
中間代碼:三元式,四元式,樹,...函數
任務:對前階段產生的中間代碼進行加工變換,以期在最後階段產生更高效的目標代碼。
依循的原則:程序的等價變換原則工具
任務:把中間代碼變換成特定機器上的目標代碼
依賴於硬件系統結構和機器指令的含義
目標代碼的三種形式:
1.彙編指令代碼:須要進行彙編。
2.絕對指令代碼:可直接運行。
3.可重定位指令代碼:須要連接。優化
--源程序--》詞法分析器--單詞符號--》語法分析器--語法單位--》語義分析與中間代碼產生器--中間代碼(四元式)--》優化段--中間代碼(四元式)--》目標代碼生成器--目標代碼--》。
另外還有符號表管理,與出錯處理模塊。翻譯
發現源程序中的錯誤,把有關錯誤信息報告給用戶,錯誤分爲語法錯誤與語義錯誤。設計
所謂「遍」,就是對源程序或源程序的中間表示從頭至尾掃描一次。
階段和遍是不一樣的概念--一遍能夠由若干段組成(詞法分析,語法分析、中間代碼程序能夠合成一遍來處理),一個階段能夠分爲若干遍來完成(好比:優化就可能分爲好多遍)。
詞法分析、語法分析、語義分析和中間代碼生成以及優化中與目標機器無關的部分一塊兒稱爲編譯程序的前端。
而優化中與目標機器有關的部分和目標代碼生成,一塊兒稱爲編譯程序的後端。
這樣分的好處爲:程序邏輯結構清晰、優化更充分,有利於移植。
優勢:能夠針對具體的機器,充分發揮計算機的系統功能;生成的抽象效率高。
缺點:程序難度、難寫、易出錯、難維護、生產效率低。
優勢:程序易讀、容易維護、生產效率高。
關於如何利用現有編譯器產生本身的編譯器
如圖:
關於如何移植:
如LEX:詞法分析程序產生器。
YACC:語法分析程序產生器。
FORTRAN 數值計算
COBOL 事務處理
PASCAL 結構化程序設計
LISP 函數式程序設計
PROLOG 邏輯程序設計
C 系統程序設計
Smalltalk 面向對象程序設計
Java Internet引用,可移植性
Python 解釋型,動態編程
第一位圖靈獎得到者Alan J.Perlis曾經說過:若是一個語言不能改變你進行程序設計的思惟方法的話,那麼你不值得去了解它。
更接近於數學語言和工程語言,更直觀、天然和易於理解。
更容易驗證其正確性。
編寫程序的效率更高。
更容易移植。
程序本質上是必定字符集上的字符串。
語法:一組規則,用它能夠造成和產生一個合式(形式上正確)的程序,分爲詞法規則和語法規則。
單詞符號是語言中具備獨立意義的最基本結構
通常包括:常數、標識符、基本字、算符、界符等。
語法單位一般包括:表達式、語句、分程序、過程、函數、程序的等。
描述工具:上下文無關文法。
一組規則,用它能夠定義一個程序的意義。
描述方法:
1.天然語言描述:二義性、隱藏錯誤和不完整性。
2.形式描述:
操做語義。
指稱語義。
代數語義。
程序,本質上說是描述必定數據的處理過程。
程序語言的基本功能:描述數據和對數據的運算。
程序的層次結構:
程序--》子程序或分程序、過程、函數--》語句--》表達式--》數據引用、運算符、函數調用。
程序語言成分的邏輯和實現意義
抽象的邏輯的意義:數學意義。
計算機實現的意義:具體實現。
計算思惟和數學思惟是不一樣的!。
強制性語言/過程式語言 應用式語言 基於規則的語言 面向對象的語言