更新時間:2022-11-30 來源:黑馬程序員 瀏覽量:
高級語言被廣泛應用于眾多領(lǐng)域,但使用高級語言編寫的程序無法被計算機識別與執(zhí)行。在執(zhí)行之前需要先將高級語言代碼翻譯成機器語言代碼。根據(jù)不同的翻譯方式,執(zhí)行分為編譯執(zhí)行和解釋執(zhí)行兩種。
編譯執(zhí)行是指通過編譯程序(也稱為編譯器)將源代碼(source code)一次性編譯成目標程序(objectcode),再由計算機運行目標程序的過程,其中源代碼指由高級語言編寫的代碼。編譯執(zhí)行過程如圖1所示。
圖1 編譯執(zhí)行
圖1中的“執(zhí)行”指計算機運行程序的一次過程,其中編譯器內(nèi)部的執(zhí)行過程大致可分為以下5個階段。
(1)詞法分析。詞法分析程序逐個讀取源代碼中的字符產(chǎn)生助記符表,例如逐個讀取的5個字符w、h、il、e會被作為助記符 while放人助記符表,x、a等無法串成字符串的字符也會被視為由單個字符構(gòu)成的助記符放人助記符表。詞法分析完成后,源程序由單個字符組成的字符串轉(zhuǎn)換成由助記符串聯(lián)而成的符號串。
(2)語法分析。語法分析程序以詞法分析程序生成的單詞符號串作為輸人,分析單詞符號串是否能夠形成指令。例如num、=、5這3個助記符經(jīng)語法分析后構(gòu)成賦值語句“num=5。
(3)語義檢查和中間代碼生成。語義分析程序?qū)φZ法分析程序生成的語句進行檢查,確保語句不存在二義性,之后生成中間代碼。中間代碼也稱為中間語言,是源程序在計算機內(nèi)部的一種表現(xiàn)形式,其作用是幫助編譯程序優(yōu)化代碼、產(chǎn)生目標代碼常用的中間語言有逆波蘭記號、四元式、三元式和樹。
(4)代碼優(yōu)化。代碼優(yōu)化是指對程序進行多種等價變換,在不改變程序運行結(jié)果的前提下提升代碼運行效率、降低代碼所占空間。經(jīng)優(yōu)化后的代碼更易于生成有效的目標代碼。
(5)目標代碼生成。目標代碼生成程序?qū)⒔?jīng)語法分析或優(yōu)化后的中間代碼轉(zhuǎn)換成目標代碼并存儲在計算機中。大多數(shù)編譯程序直接生成由機器語言編寫的目標代碼但也有編譯程序先生成匯編語言代碼,再調(diào)用匯編程序?qū)R編語言代碼翻譯成機器語言編寫的目標代碼。
簡而言之,編譯即編譯器讀取源代碼至生成目標程序的過程。
編譯執(zhí)行方式的特點是:一次解釋,多次執(zhí)行。源程序經(jīng)編譯后不再需要編譯器和源代碼,目標程序可以在同類型操作系統(tǒng)中自由使用。編譯過程只執(zhí)行一次。相比編譯速度,更重要的是編譯后生成的目標代碼的執(zhí)行效率。因此編譯器一般會集成盡可能多的優(yōu)化技術(shù),以提高目標代碼的性能。
解釋執(zhí)行(interpreter)與編譯執(zhí)行主要的區(qū)別是翻譯時的解釋程序不產(chǎn)生目代碼,且解釋器在翻譯源代碼的同時執(zhí)行中間代碼。解釋執(zhí)行過程如圖 2所示。
圖2 解釋器執(zhí)行過程
解釋器在讀入源程序時會先調(diào)用語言分析程序進行詞法分析和部分語法檢查,建立助記符表,將源程序字符串轉(zhuǎn)換為中間代碼;再調(diào)用解釋執(zhí)行程序進行語法檢查并逐條解釋執(zhí)行中間代碼。簡而言之,解釋器逐條讀取源程序中的語句并翻譯,同時逐條執(zhí)行翻譯好的代碼。
解釋執(zhí)行的特點是:邊解釋,邊執(zhí)行。解釋器中通常不會集成過多優(yōu)化技術(shù),以免解釋過程過多耗費時間,影響程序的執(zhí)行速度。與編譯執(zhí)行相比,解釋執(zhí)行主要具有以下優(yōu)點。
(1)保留源代碼,程序維護和糾錯比較方便。
(2)可移植性好,只要存在解釋器,源代碼可以在任意系統(tǒng)上運行。
根據(jù)不同的翻譯執(zhí)行方式,高級語言被分為靜態(tài)語言和腳本語言兩類。靜態(tài)語言采用編譯執(zhí)行方式,常見的靜態(tài)語言有 C、Java等;腳本語言采用解釋執(zhí)行方式,常見的腳本語言有JavaScript、PHP等。