【编译原理】编译是怎么一个过程?
一、編譯程序的概念與操作
概念:
計算機語言分成:高級語言和低級語言。
低級語言又分成匯編語言和機器語言。
因為計算機只能讀懂機器語言的程序,所以所有高級語言的程序都必須轉成機器語言的程序。
這個轉換過程是由一個程序來自動完成的。
要說計算機要把一個源程序翻譯成機器語言的程序,首先需要讀懂該程序,所以計算機應該怎么去讀懂一個源程序呢?
操作:
第一步:詞法分析
首先明白,計算機翻譯程序開始工作,先需要把待翻譯的程序讀到內存去,由于翻譯程序不知道什么是一個句子或一個單詞,所以讀源程序的時候只能一個一個字符去讀,把源程序的一個一個字符讀進來后,先需要分清楚哪些字符串是一個整體,如main,int,x,10等都是一個獨立的整體,編譯程序把這個字符串整體叫做單詞word,要拼出一個一個稱作單詞的字符串:int,main,(,),
{,int,x,=,10,;,x,=,x,+,10 etc.
這些單詞有都有自己的組成規則,以字母打頭的不是關鍵字就是自定義標識符,以數字大頭的肯定是數字,其他的要么是運算符要么是標點符號等。
程序舉例:
int main() {int x=10;x=x+10... }第二步:語法分析
經過第一步詞法分析后就有了單詞,然后根據語言的句法或者句型結構(每個語言都有)再拼出一個一個的句子。如果拼不出一個完整的句子,就是語法錯誤。
第三步:語義分析
分析判斷前面符合句型結構的句子有沒有語義,簡單點就是你說的符不符合邏輯,有沒有廢話等。
第四步:中間代碼生成
為了方便代碼生成所作的前期準備工作,這個階段可以沒有。
第五步:目標代碼生成和代碼優化
代碼優化就是將生成的目標代碼優化一下,使得生成的目標代碼更加短小精煉,執行速度更快等。代碼優化階段并不是所有編譯程序必須的,現在很多程序的編譯程序中,就沒有包含代碼優化這個步驟,或者是編譯選項等。
第六步:目標代碼生成和代碼優化
所有過程中都會涉及到表格管理和錯誤處理兩個功能模塊。翻譯每一個階段出了問題都會調用錯誤處理來完成相應的提示信息(位置,錯誤代碼和信息等)或者更進一步的自動修正程序等。表格是用來記錄每個自定義標識符的內存地址,初值,作用域,可見性等,這個表格需要記錄,查詢等。
綜上所述,一個編譯程序至少包含詞法分析、語法分析和代碼生成3個階段,其他階段或功能模塊都可以不包含。
二、編譯程序名稱
三、翻譯方法
翻譯程序有2種不同的翻譯方法,分別叫做編譯和解釋。
解釋方法類似于同聲實時翻譯,一句一句翻譯解釋給計算機去執行。這種方法的特點就是計算機一邊翻譯一邊執行,只有執行結果,沒有產生任何中間結果。
編譯方法類似于小說翻譯,首先生成中間結果,就是.obj的目標文件,計算機執行的不是高級語言的程序,而是中間結果(.obj的目標文件)。
翻譯方法的優缺點:
不同高級語言采用不同的翻譯方式,有的語言采用編譯,如c,c++,dephi等,有的采用解釋方式,如Basic,MATLAB,HTML、XML、Perl、Python、Ruby和Java等。
||每次點擊“compile”后等待的那幾秒背后不為人知的故事:||
程序分成系統程序和應用程序,編譯程序屬于系統程序。了解了編譯程序是干什么的以后,我們就需要了解編譯程序到底是怎么一步一步翻譯成機器語言的程序的:
先編輯一個源程序,然后將源程序compile編譯成.obj的目標程序,再接著將.obj的目標程序和庫函數等Linking連接成.exe的可執行程序。最后再執行.exe的可執行程序得到程序運行結果了。
總結
以上是生活随笔為你收集整理的【编译原理】编译是怎么一个过程?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 单链表进阶学习
- 下一篇: 单链表进阶学习 二段