官术网_书友最值得收藏!

1.3.3 從語法樹到中間代碼再到目標代碼

至此,語法樹已經承載了源程序的全部信息,后續的轉換工作就和源程序沒關系了。

如果希望一步到位,從語法樹轉換為目標代碼,理論上和實際上都是可行的。但計算機存在多種CPU硬件平臺,考慮到程序在不同CPU之間的可移植性,先轉換成一個通用的、抽象的“CPU指令”,這就是中間代碼最初的設計思想。然后根據具體選定的CPU,將中間代碼落實到具體CPU的目標代碼。

語法樹是個二維結構,中間代碼是準一維結構,語法樹到中間代碼的轉換過程,本質上是將二維結構轉換為準一維結構的過程。中間代碼特別是RTL已經可以和運行時結構一一對應了。如圖1-40所示。

圖1-40 中間代碼與目標代碼對應的情景示意

運行時結構也是一維的,圖1-40左側部分的轉換結果將更貼近運行時結構。

選定具體的CPU、操作系統后,中間代碼就可以轉換為目標代碼——匯編代碼(我們配置的是AT&T匯編),這時操作系統的影響還比較小。然后由匯編器依照選定操作系統的目標文件格式,將.s文件轉換為具體的目標文件,對于Linux而言是.o文件,對于Windows而言是.obj文件。目標文件中已經是選定的CPU的機器指令了。

最后鏈接器把一個或多個目標文件(庫文件本質上也是目標文件)鏈接成符合選定操作系統指定格式的可執行文件。

通過操作系統,可執行程序就可以被載入內存執行,形成前兩節我們所看到的運行時結構。

本書后續內容將詳細講解編譯的主要過程:詞法分析、語法分析、中間代碼到目標代碼,然后是匯編與鏈接,最后講解預處理。

主站蜘蛛池模板: 莆田市| 余庆县| 互助| 扶风县| 克山县| 奉节县| 永安市| 金华市| 福鼎市| 库尔勒市| 泰和县| 武陟县| 水富县| 邳州市| 张家口市| 汾西县| 壤塘县| 铜鼓县| 丰镇市| 得荣县| 肥城市| 泗阳县| 古蔺县| 栖霞市| 如东县| 剑川县| 勃利县| 肃宁县| 龙山县| 大渡口区| 富源县| 金溪县| 临洮县| 西昌市| 塘沽区| 博兴县| 万全县| 阿克| 彭泽县| 呼伦贝尔市| 宁陕县|