<b>本節書摘來自華章出版社《編譯與反編譯技術》一書中的第1章,第1.1節,作者龐建民,陶紅偉,劉曉楠,嶽峰。更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。</b>
<b></b>
人類之間的交流是通過語言進行的,但語言不是唯一的,不同的語言之間需要翻譯,這就導緻了翻譯行業的建立。人與計算機之間也是通過語言進行交流的,但人類能了解的語言與機器能了解的語言是不同的,也需要翻譯,這就導緻了系列編譯器的誕生。編譯技術所讨論的問題,就是如何把符合人類思維方式的意願(源程式)翻譯成計算機能夠了解和執行的形式(目标程式)。實作從源程式到目标程式轉換的程式,稱為編譯程式或編譯器。反編譯技術所讨論的問題,就是如何把計算機能夠了解和執行的形式(目标程式)翻譯成便于人類了解的形式(進階語言源程式或流程圖)。實作從目标程式到便于人類了解的系列文檔的轉換,稱為反編譯程式或反編譯器。
編譯器這個術語是由grace murray hopper在20世紀50年代初期提出的,現代意義上最早的編譯器是20世紀50年代後期的fortran編譯器,該編譯器驗證了經過編譯的進階語言的生命力,也為後續進階語言和編譯器的大量湧現奠定了基礎。
反編譯技術起源于20世紀60年代,比編譯技術晚10年左右,但反編譯技術的成熟度遠不如編譯技術。在半個世紀的發展過程中,出現了不少實驗性的反編譯器,其中以dcc、boomerang和ida pro的反編譯插件hex_rays最為著名。但這些反編譯器都有這樣或那樣的缺陷。例如,dcc隻能識别最簡單的資料類型;boomerang無法識别複雜的資料結構,如c++的類和多元數組;hex_rays隻能産生可讀性較低的c僞代碼,且同樣無法識别複雜的資料結構。是以,反編譯技術還有很廣闊的研究與發展空間。
本章僅對編譯器和編譯流程方面的知識進行概要闡述,反編譯方面的概要介紹将在第10章給出。
<b>1.1</b><b> 編譯器與解釋器</b><b></b>
計算機的硬體隻能識别和了解由0、1字元串組成的機器指令序列,即目标程式或機器指令程式。在計算機剛剛發明的時期,人們隻能向計算機輸入機器指令程式來讓它進行簡單的計算。由于機器指令程式不易被人類了解,用它編寫程式既困難又容易出錯,于是就引入了代替0、1字元串的由助記符号表示的指令,即彙編指令,彙編指令的集合稱為彙編語言,彙編指令序列稱為彙編語言程式。但彙程式設計式實際上與機器語言程式是一一對應的,均要求程式員按照指令工作的方式來思考和解決問題,兩者之間并無本質差別。是以,它們被稱為面向機器的語言或低級語言。
随着計算機的發展和應用需求的增長,程式員的需求也大幅增長,但能夠用機器語言或彙編語言程式設計的人員數量滿足不了這種需求,許多科技工作者也想自己動手編寫程式,是以,需要抽象度更高、功能更強的語言來作為程式設計語言,于是産生了面向各類應用的便于人類了解與運用的程式設計語言,即進階語言。盡管人類可以借助進階語言來編寫程式,但計算機硬體真正能夠識别和了解的語言還是由0、1組成的機器語言,這就需要在進階語言與機器語言之間建立橋梁,使得進階語言能夠過渡到機器語言。也就是說,需要若幹“翻譯”,把各類進階語言翻譯成機器語言。語言通常被分成三個層次:進階語言、彙編語言、機器語言。進階語言可以翻譯成機器語言,也可以翻譯成彙編語言,這兩種翻譯都稱為編譯。彙編語言到機器語言的翻譯稱為彙編。編譯和彙編屬于正向工程,有時還需要将機器語言翻譯成彙編語言或進階語言,這通常稱為反彙編或反編譯,屬于逆向工程。
在編譯器工作方式下,源程式的翻譯和翻譯後程式的運作是兩個互相獨立的階段。使用者輸入源程式,編譯器對該源程式進行編譯,生成目标程式,這個階段稱為編譯階段。目标程式在适當的輸入下執行,最終得到運作結果的過程稱為運作階段。
解釋器是另一種形式的翻譯器。它把翻譯和運作結合在一起進行,邊翻譯源程式,邊執行翻譯結果,這種工作方式被稱為解釋器工作方式。
換句話說,編譯器的工作相當于翻譯一本原著,原著相當于源程式,譯著相當于目标程式,計算機的運作相當于閱讀一本譯著,這時,原著和翻譯人員并不需要在場,譯著是主角。解釋器的工作相當于現場翻譯,外賓和翻譯都要在場,翻譯邊聽外賓講話,邊翻譯給聽衆,翻譯是主角。解釋器與編譯器的主要差別是:運作目标程式時的控制權在解釋器而不是目标程式。