gcc編譯原理
編譯共分為四個階段:預處理階段、編譯階段、匯編階段、鏈接階段。
1、預處理階段:
主要工作是將頭文件插入到所寫的代碼中,生成擴展名為「.i」的文件替換原來的擴展名為「.c」的文件,但是原來的文件仍然保留,只是執行過程中的實際文件發生了改變。(這里所說的替換並不是指原來的文件被刪除)
2、匯編階段:
插入匯編語言程序,將代碼翻譯成匯編語言。編譯器首先要檢查代碼的規范性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查無誤後,編譯器把代碼翻譯成匯編語言,同時將擴展名為「.i」的文件翻譯成擴展名為「.s」的文件。
3、編譯階段:
將匯編語言翻譯成機器語言指令,並將指令打包封存成可重定位目標程序的格式,將擴展名為「.s」的文件翻譯成擴展名為「.o」的二進制文件。
4、鏈接階段:
在示例代碼中,改代碼文件調用了標准庫中printf函數。而printf函數的實際存儲位置是一個單獨編譯的目標文件(編譯的結果也是擴展名為「.o」的文件),所以此時主函數調用的時候,需要將該文件(即printf函數所在的編譯文件)與hello world文件整合到一起,此時鏈接器就可以大顯神通了,將兩個文件合並後生成一個可執行目標文件。
2. gcc是開源的吧代碼是用什麼寫的匯編么
gcc官方網站 http://gcc.gnu.org/
關於gcc的信息可以自己找到,源代碼也可以下到(不過官方下載有點費勁)。gcc也是用C語言寫的。
3. 關於C語言的編譯過程,GCC與windows下的c編譯器(如VS2010)的編譯過程是否存在區別
一般的編譯步驟是如此, 但也有一步到位的編譯器
4. 關於編譯原理的問題
1.當然是機器語言了,如果是匯編指令,那還得編譯一次!能運行的程序都是機器語言,只有機器語言才能控制CPU,NET或Java這些中間語言,程序在運行時會被CLR或JVM快速編譯成機器語言,因此這些程序速度上有損失。
高級語言源代碼(文本)-通過編譯器(compiler)-程序(二進制機器語言)
匯編代碼(文本)-通過匯編器(assembler)-程序(二進制語言)
看到這里,你可能會想那匯編語言到底有什麼用呢,編譯器完全能代替匯編啊?
(1).編譯器是通過高級語言(c,c++)轉到機器語言的。轉換過的機器語言受限與高級語言,效率和功能上都有限制。比如c不等過分操作內存。但通過匯編器轉化過來的機器語言,效率高,且用匯編語言,直接和CPU對話!
(2).匯編可以反匯編(逆向編譯),而這里高級語言沒有發言權,就是:
程序(二進制機器語言)-通過反匯編器(compiler)-可轉化為匯編代碼(文本)
但永遠不能轉化為高級語言的源代碼,。
以上兩點匯編存在的重要性。
2。當然是說移植源代碼。windows用x86機器語言,蘋果用powerPC機器語言,windows程序當然不能運行在蘋果機上,因為程序其實就是一串機器語言!但windows上有c的編譯器(vc++),蘋果機上也有c編譯器(gcc),因此同一個c的源代碼,當然就可以通過不同平台的同一種編譯器實現平台移植。
3.當然是NASM,我看的所有書都首先說NASM,他是開源的,就像linux一樣,很受歡迎,還有MASN是微軟的,borland的也有匯編器,不過都不常見了。
4.這跟CPU有關,一般32位x86兼容的cpu有許多寄存器,多數是32位的,也有16位的。比如CS,ES,DS這些segment寄存器一直是16位的。
5.優勢太多了,這和32位和16位存在的優勢一樣,16位電腦最大內存1MB,寄存器都是16位的。32位,最大內存可以有4GB,整整是16位的4096倍啊!16位多渺小啊,同理64位基本上也可以蔑視32位,64內存最大內存用TB來衡量,寄存器多數是64位!地址匯流排也是64位。64對32位沒有什麼優勢劣勢可言,64位完全就是32位的下一代。
5. 編譯原理 中間代碼生成 的程序求一個
在網上找了半天,抱歉只找到了GCC的源碼。
源碼查看(GCC):https://gcc.gnu.org/svn/gcc/trunk/
包括完整的詞法分析、語法分析、語義分析、中間語言生成、優化、目標代碼生成等過程。
另外,樓主是想寫一個這樣的程序嗎?如果是的話可以看一下這個,雖然不是JAVA,但是可能會對你有幫助:http://m.blog.csdn.net/blog/USBdrivers/8554689
順便推薦一個源碼下載網站,如果樓主想要源碼,不妨先在這上面搜搜:http://sourceforge.net/
我也是寫程序的,祝你早日摸到門道,加油哦!
6. GUN GCC 標準的編譯器編譯原理疑問
for(i=0,i<6,i++)括弧里的三句話應該用分號分開,你的好像是誤用了逗號,改過來就行了。
for(i=0;i<6;i++)
7. 怎樣閱讀 gcc 源代碼
1.先學會gcc對c語言的擴展
2.對照gcc internals(網上已有中文版本)查看源代碼
3.最好下載「現代編譯原理:C語言描述.pdf」,比如計算必經點公式、活躍分析、著色圖的寄存器分配....不對照課本知識,你就是看不懂。
8. 請問linux下,gcc編譯程序的過程(從讀取源文件到製作可執行程序中間所有過程,越詳細越好)
gcc -S *.c 預處理+反匯編
9. 想讀懂gcc源代碼
學學編譯原理, 然後在看吧, 你要是沒編譯原理的基礎, 你就看代碼, 你更本就不能理解它的演算法, 你也沒辦法理解它的思想
10. gcc中C語言的詞法分析是怎麼做的
已知所有關鍵字,剩下的只是語句和括弧堆棧匹配而已。
大體原理可以參考《編譯原理》的「有限狀態機」。