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