c語言編譯原理圖
1、預處理指令:gcc -E file.c -o hello.i<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+IyDJvrP9y/nT0LXE16LKzaOs0tS/1SYjMjY2ODQ7tPrM5jwvcD4KPHA+IyC9q8v509C1xCNkZWZpbmXJvrP9o6yyosfS1bm/qsv509C1xLrqtqjS5TwvcD4KPHA+IyC0psDtzPW8/rHg0uvWuMHuI2lmo6wjaWZkZWajrCNlbGlmo6wjZWxzZaOsI2VuZGlmPC9wPgo8cD4gICAg1rjB7iAgICAgICAgINPDzb48YnI+CiAgICAjICAgICAgICAgICC/1da4we6jrM7eyM66ztCnufs8YnI+CiAgICAjaW5jbHVkZSAgICCw/Lqs0ru49tS0tPrC687EvP48YnI+CiAgICAjZGVmaW5lICAgICC2qNLluuo8YnI+CiAgICAjdW5kZWYgICAgICDIoc/70tG2qNLltcS66jxicj4KICAgICNpZiAgICAgICAgIMjnufu4+LaozPW8/s6q1eajrNTyseDS68/Cw+a0+sLrPGJyPgogICAgI2lmZGVmICAgICAgyOe5+7rq0tG+rbao0uWjrNTyseDS68/Cw+a0+sLrPGJyPgogICAgI2lmbmRlZiAgICAgyOe5+7rqw7vT0Lao0uWjrNTyseDS68/Cw+a0+sLrPGJyPgogICAgI2VsaWYgICAgICAgyOe5+8eww+a1xCNpZrj4tqjM9bz+srvOqtXmo6y1scewzPW8/s6q1eajrNTyseDS68/Cw+a0+sLro6zG5Mq1vs3Kx2Vsc2UgaWa1xLzy0LQ8YnI+CiAgICAjZW5kaWYgICAgICC94cr40ru49iNpZqGtoa0jZWxzZcz1vP6x4NLrv+k8YnI+CiAgICAjZXJyb3IgICAgICDNo9a5seDS67Kiz9TKvrTtzvPQxc+iPGJyPgo8L3A+CjxwPiO0psDtI2luY2x1ZGUs1bm/qrG7sPy6rLXEzsS8/jwvcD4KPHA+I7GjwfSx4NLrxvfQ6NKqyrnTw7XEI3ByYWdtYda4we48L3A+CjxwPg=="#pragma'它的作用是設定編譯器的狀態或者是指示編譯器完成一些特定的動作。
2、編譯指令:gcc -S file.c -o hello.S
# 對預處理文件進行一系列詞法分析,語法分析和語義分析
詞法分析主要分析關鍵字,標示符,立即數等是否合法
語法分析主要分析表達式是否遵循語法規則
語義分析在語法分析的基礎上進一步分析表達式是否合法
# 分析結束後進行代碼優化生成相應的匯編代碼文件
3、匯編指令:gcc -c file.S -o hello.o
# 匯編器將匯編代碼轉變為機器可以執行的指令
每個匯編語句幾乎都對應一條機器指令
4、鏈接器的意義
鏈接器的主要作用是把各個模塊之間的相互引用的部分處理好,使得各個模塊之間能夠正確的銜接。
鏈接分為靜態鏈接和動態鏈接:靜態鏈接指的是.o文件與鏈接庫.a文件拼接在一起,組成可執行文件。這樣編譯出的可執行文件較大,也占用較大的內存空間,如果可執行程序,被並發運行多次,則會重復調用.a鏈接庫文件進入內存。這樣就造成了很大的浪費。靜態鏈接是以空間換取時間。
動態鏈接是指,鏈接庫文件不是和.o文件拼接在一起,而是當執行文件運行時,才動態的去內存調用庫文件,如果沒有就動態的加載。動態鏈接是以時間換取空間。
# 編譯器將編譯工作主要分為預處理,編譯和匯編三部分
# 鏈接器的作用是把各個獨立的模塊鏈接為可執行程序
# 靜態鏈接在編譯期完成,動態鏈接在運行期完成