之前一直忙於比賽項目,疏忽對編譯原理的學習,從此日更編譯原理,往監督。
一,萬惡的開始
語言 | 特點 | 舉例 |
高級語言 | 符合人們的習慣,更容易理解和修改。 | int x = 2; |
彙編語言 | 具有一定意義的文字命令,與機器語言一一對應。 | MOV x 2 |
機器語言 | 二進制命令,能被計算機直接識別。 | C706 0000 0002 |
二,編譯過程
編譯:將高級語言翻譯成彙編語言或機器語言的過程。
翻譯:把一種語言轉換成另一種語言,兩種 語言在邏輯上是等價的。
詞法分析閱讀構成源程序的字符流,按編程語言的詞法規則把它們組成詞法記號(token)流。
語法分析它檢查詞法分析輸出的記號流是否符合編程語言的語法規則,並依據這些規則所體現出的語言構造(construct,如函數、語句、表達式等)的層次性,用各記號的第一元建成一種樹形的中間表示。
語義分析階段使用語法樹和符號表中的信息,依據語言定義來檢查源程序各部分語義之間的語義一致性,以保證程序各部分能有意義地結合在一起。
中間代碼生成經過語法分析和語義分析後,許多編譯器爲源程序產生更低級的顯示中間表示,可以把這種中間表示想象成一種抽象機的程序。
代碼優化獨立於機器的代碼優化階段試圖改進中間代碼,以便產生較好的目標代碼。
代碼生成是指源程序的一種中間表示作爲輸入並把它映射到一種目標語言。
三,編譯和解釋
區別 | 編譯 | 解釋 |
效率 |
一般大於解釋效率 |
純解釋<=解釋效率<=純編譯 |
執行 | 詞法分析,語法分析,語義分析只進行一次 | 反覆執行 |
跨平臺 | 不支持,換平臺必須重新修改編譯 | 支持 |
編譯型語言:運行前先由編譯器將高級語言代碼編譯爲對應機器的cpu彙編指令集,再由彙編器彙編爲目標機器碼,生成可執行文件,然最後運行生成的可執行文件。最典型的代表語言爲C/C++,一般生成的可執行文件及.exe文件。
解釋型語言:在運行時由翻譯器將高級語言代碼翻譯成易於執行的中間代碼,並由解釋器(例如瀏覽器、虛擬機)逐一將該中間代碼解釋成機器碼並執行(可看做是將編譯、運行合二爲一了)。最典型的代表語言爲JavaScript、Python、Ruby和Perl等
舉個例子:
編譯代表——C,對於x86和x64兩種機器,不同的平臺上需要重新編譯連接成可執行文件,才能運行。
解釋代表——JS,幾乎能在所有的操作系統上執行,而無需根據操作系統做修改。
Java也是解釋型,它首先由編譯器編譯成.class(字節碼)文件,然後在通過JVM從.class文件中讀一行解釋執行一行,所以它是解釋型的語言。也正是由於java對於多種不同的操作系統有不同的JVM,所以實現了真正意義上的跨平臺。
Java是解釋型的語言,因爲雖然java也需要編譯,編譯成.class文件,但是並不是機器可以識別的語言,而是字節碼,最終還是需要 jvm的解釋,才能在各個平臺執行,這同時也是java跨平臺的原因。所以可是說java即是編譯型的,也是解釋型,但是假如非要歸類的話,從概念上的定義,恐怕java應該歸到解釋型的語言中。
四,編譯器,解釋器,混合編譯器
能夠完成從一種語言到另一種語言的保語義變換的軟件稱爲翻譯器,這兩種語言分別稱爲翻譯器的源語言和目標語言。
編譯器是一種翻譯器,它的特點是目標語言比源語言低級。
eg:C,C++
解釋器不像編譯器那樣通過翻譯來生成目標程序,而是直接執行源程序所指定的運算。
eg:JS
混合編譯器綜合了編譯器和解釋器的優點