編譯器產生的機器語言目標程序一般比解釋器快不少,代碼的優化效果也比解釋器好。可是利用解釋器逐句執行的特色,解釋器更容易進行錯誤診斷,與用戶的交互效果也比編譯器好。前端
一個編譯器能夠分爲前端和後端,前端包括詞法分析,語法分析,語義分析,中間代碼生成。後端包括中間代碼優化,代碼生成,機器相關代碼優化等。sql
2.1詞法分析數據庫
輸入:源程序字符流 輸出:詞法單元和符號表信息
詞法分析讀入組成源程序的字符流,並將它們組織成有意義的詞素序列。對於每一個詞素,詞法分析其產生詞法單元做爲輸出。<token-name,attribute-value>其中token-name是有語法分析步驟使用的抽象符號,attribute-value指向符號表中關於這個詞法單元的條目。後端
2.2語法分析函數
輸入:詞法單元和符號表 輸出:語法樹
語法分析器利用token來產生語法樹。以後會講到利用上下文無關文法來設計語言,而且檢測某次輸入是否符合語法規範。工具
2.3語義分析佈局
輸入:語法樹和符號表 輸出:通過類型檢查和自動類型轉換的語法樹
語義分析器:使用語法樹和符號表中的信息來檢查源程序是否和語言定義的語義一致。學習
2.4中間代碼生成優化
輸入:具與正確語義的語法樹和符號表 輸出:三地址代碼
三地址代碼知足幾點規範:右部最多隻有一個運算符,運算份量小於或等於三個。spa
2.5代碼優化
與機器無關代碼優化:優化中間代碼 與機器有關代碼優化:優化機器碼
2.6代碼生成
輸入:通過優化的三地址代碼 輸出:機器碼(目標語言)
針對地算計體系結構的優化:
並行性:指令集並行和多處理器並行,前者經過流水線等技術將多條指令同時執行以加快程序的執行速度,後者經過在多處理器機器中分發計算任務加快程序的執行速度 內存層次結構:現代計算系統都是由幾層不一樣速度和大小的存儲器構成的,利用編譯器能夠改變數據的佈局或數據訪問代碼順序來提升內存層次結構的效率。
綜上就是經過編譯技術加快程序的執行速度。
程序翻譯
二進制翻譯:不一樣平臺間機器代碼的轉換 硬件合成:實現高級硬件描述語言 數據查詢解釋器:將sql等數據庫查詢語言編譯爲可執行代碼 編譯而後模擬:....?
軟件生產率工具:利用編譯技術製做類型檢查,邊界檢查,內存管理工具等。
4.1環境與狀態
環境其實就是名字到存儲位置的映射,一個相同的名字,在不一樣的環境下的指向不一樣的存儲區域。
狀態就是位置到值的映射,在程序運行過程當中,一個位置不可能老是相同的值,有可能由於數據的刪除和更新致使相同位置的值發生改變。
4.2靜態做用域和塊結構
靜態做用域:一種在詞法分析階段就能夠判斷出來的做用域類型,一個聲明的做用域由該聲明在程序中出現的位置來肯定,靜態做用域與塊結構密切相關。每一個塊結構都有本身的做用域,塊結構的相互嵌套構成了一個程序的靜態做用域。
4.2.1名字,標識符和變量
名字:表明一個內存位置的符號 變量:名字在運行時刻所指的內存位置。 標識符:指向一個實體,好比數據對象,過程,類,全部標識符都是名字,可是不是全部名字都是標識符,好比x.y就是名字不是標識符,由於它是複合的,標識符知識但單一的整個實體。
4.2.2過程,函數和方法
函數:是指能夠有返回值的一段在一塊兒的、能夠作某一件事兒的程序 過程:沒有返回值的函數 方法:僅限於面向對象的程序設計語言,存在於對象中的函數屬性。
4.2.3聲明和定義
聲明:說明事物的類型,好比int a 定義:給事物賦值,好比a=1
4.3動態做用域
動態做用域一般指一下策略:對一個名字x的使用指向的是最近被調用(從函數棧頂端往下的的第一個)但尚未終止聲明瞭x的過程當中的這個聲明。 例子:
var a = 2 function foo(){ console.log(a); } function bar(){ var a=3 foo(); } bar(); //靜態輸出2 //動態輸出3
4.4參數傳遞機制
4.5別名
別名指兩個變量表明同一個數據對象、過程或者類。能夠是變量a與b指向同一塊地址,能夠是變量a與b指向不一樣的地址,可是這個地址都保存同一個的對象的引用。