《编译与反编译技术》——第一章 引论 1.1节编译器与解释器
本節書摘來自華章出版社《編譯與反編譯技術》一書中的第1章,第1.1節,作者龐建民,陶紅偉,劉曉楠,岳峰。更多章節內容可以訪問云棲社區“華章計算機”公眾號查看。
人類之間的交流是通過語言進行的,但語言不是唯一的,不同的語言之間需要翻譯,這就導致了翻譯行業的建立。人與計算機之間也是通過語言進行交流的,但人類能理解的語言與機器能理解的語言是不同的,也需要翻譯,這就導致了系列編譯器的誕生。編譯技術所討論的問題,就是如何把符合人類思維方式的意愿(源程序)翻譯成計算機能夠理解和執行的形式(目標程序)。實現從源程序到目標程序轉換的程序,稱為編譯程序或編譯器。反編譯技術所討論的問題,就是如何把計算機能夠理解和執行的形式(目標程序)翻譯成便于人類理解的形式(高級語言源程序或流程圖)。實現從目標程序到便于人類理解的系列文檔的轉換,稱為反編譯程序或反編譯器。
編譯器這個術語是由Grace Murray Hopper在20世紀50年代初期提出的,現代意義上最早的編譯器是20世紀50年代后期的Fortran編譯器,該編譯器驗證了經過編譯的高級語言的生命力,也為后續高級語言和編譯器的大量涌現奠定了基礎。
反編譯技術起源于20世紀60年代,比編譯技術晚10年左右,但反編譯技術的成熟度遠不如編譯技術。在半個世紀的發展過程中,出現了不少實驗性的反編譯器,其中以Dcc、Boomerang和IDA Pro的反編譯插件Hex_rays最為著名。但這些反編譯器都有這樣或那樣的缺陷。例如,Dcc只能識別最簡單的數據類型;Boomerang無法識別復雜的數據結構,如C++的類和多維數組;Hex_rays只能產生可讀性較低的C偽代碼,且同樣無法識別復雜的數據結構。因此,反編譯技術還有很廣闊的研究與發展空間。
本章僅對編譯器和編譯流程方面的知識進行概要闡述,反編譯方面的概要介紹將在第10章給出。
1.1 編譯器與解釋器
計算機的硬件只能識別和理解由0、1字符串組成的機器指令序列,即目標程序或機器指令程序。在計算機剛剛發明的時期,人們只能向計算機輸入機器指令程序來讓它進行簡單的計算。由于機器指令程序不易被人類理解,用它編寫程序既困難又容易出錯,于是就引入了代替0、1字符串的由助記符號表示的指令,即匯編指令,匯編指令的集合稱為匯編語言,匯編指令序列稱為匯編語言程序。但匯編程序實際上與機器語言程序是一一對應的,均要求程序員按照指令工作的方式來思考和解決問題,兩者之間并無本質區別。因此,它們被稱為面向機器的語言或低級語言。
隨著計算機的發展和應用需求的增長,程序員的需求也大幅增長,但能夠用機器語言或匯編語言編程的人員數量滿足不了這種需求,許多科技工作者也想自己動手編寫程序,因此,需要抽象度更高、功能更強的語言來作為程序設計語言,于是產生了面向各類應用的便于人類理解與運用的程序設計語言,即高級語言。盡管人類可以借助高級語言來編寫程序,但計算機硬件真正能夠識別和理解的語言還是由0、1組成的機器語言,這就需要在高級語言與機器語言之間建立橋梁,使得高級語言能夠過渡到機器語言。也就是說,需要若干“翻譯”,把各類高級語言翻譯成機器語言。語言通常被分成三個層次:高級語言、匯編語言、機器語言。高級語言可以翻譯成機器語言,也可以翻譯成匯編語言,這兩種翻譯都稱為編譯。匯編語言到機器語言的翻譯稱為匯編。編譯和匯編屬于正向工程,有時還需要將機器語言翻譯成匯編語言或高級語言,這通常稱為反匯編或反編譯,屬于逆向工程。
在編譯器工作方式下,源程序的翻譯和翻譯后程序的運行是兩個相互獨立的階段。用戶輸入源程序,編譯器對該源程序進行編譯,生成目標程序,這個階段稱為編譯階段。目標程序在適當的輸入下執行,最終得到運行結果的過程稱為運行階段。
解釋器是另一種形式的翻譯器。它把翻譯和運行結合在一起進行,邊翻譯源程序,邊執行翻譯結果,這種工作方式被稱為解釋器工作方式。
換句話說,編譯器的工作相當于翻譯一本原著,原著相當于源程序,譯著相當于目標程序,計算機的運行相當于閱讀一本譯著,這時,原著和翻譯人員并不需要在場,譯著是主角。解釋器的工作相當于現場翻譯,外賓和翻譯都要在場,翻譯邊聽外賓講話,邊翻譯給聽眾,翻譯是主角。解釋器與編譯器的主要區別是:運行目標程序時的控制權在解釋器而不是目標程序。
總結
以上是生活随笔為你收集整理的《编译与反编译技术》——第一章 引论 1.1节编译器与解释器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《实施Cisco统一通信管理器(CIPT
- 下一篇: 《CCNP TSHOOT 300-135