我是計算機專業的學生。目前我們正在學習Ada編程語言。編譯現在非常簡單:gnatmake source.adb
所以我不知道gnatmake實際上做了什麼或者是什麼(script?binary?其他?)。無論如何,我想知道編譯器本身(也就是解析器,如果用不同的語言編寫的)是用什麼語言編碼的?編寫gcc gnatmake Ada編譯器的語言是什麼?
回答
典型的編譯器附帶兩個基本工具:編譯器和鏈接器。
comiler將語言源代碼(文本)翻譯成機器語言對象文件(二進制文件)。它可能會包含一些對象重定位信息,以幫助鏈接器。
鏈接器獲取多個機器語言對象文件並將它們全部鏈接到一個機器可執行文件中。
您通常必須告訴編譯器在哪裏找到執行編譯所需的所有額外文件,然後您必須告訴鏈接器需要將您的可執行文件(包括系統庫)鏈接在一起所需的每個文件的名稱可能會使用。這可能會變得非常複雜,這就是像make
這樣的構建工具進來的地方。
Ada被定義爲應該總是有某種圖書管理員爲你追蹤這些信息。因此,要執行完整的系統構建,您只需要圖書管理員爲您構建可執行文件。
Gnat
處理這種圖書管理員功能的方式是假設(除非另有說明)Ada單元(包)名稱與源和目標文件名稱之間存在一一對應關係。因此,如果它需要X
的規範來完成編譯,它知道去X.ads
找到規範文件。當它連接的時候,它知道它會在X.o
中找到它的目標文件。這意味着如果它需要包X
中的例程來成功鏈接,它就會知道如何爲你做,如果一個啞連接器會失敗,並告訴你它找不到的「符號」的半加密名稱。
因此,您不必爲程序中的每個單元輸入單獨的編譯命令,就像使用C或C++一樣,只需使用gnatmake
即可編譯每個單元的給定可執行文件名稱,然後將它們鏈接起來一起爲你。一步,輕鬆自在。
至於你的最後一個問題,Gnat Ada編譯器幾乎全部寫在Ada中。編譯器用自己的語言編寫並自行編譯是非常典型的。這叫做self-hosting。
然而,可以紮成GCC,以便是常見的GCC寫入C.
gnatmake只是一個用Ada編寫的工具。它的行爲就像make。編譯器本身也是GNAT,也是用Ada編寫的。它是用許多語言編寫的GCC的一部分。
在GCC源代碼樹的Ada部分(gcc/ada
)中,有〜2000個Ada源文件和〜50個C源文件。 C作爲操作系統和GCC其他部分的粘合劑。一些(至少50個)Ada源文件適用於gnatmake等工具。
你可以看到更多有關gnatmake
確實通過使用各種方式-v
選項:我最經常使用的有gnatmake -v source.adb
的概述,gnatmake source.adb -cargs -v
顯示編譯器是如何調用,對於GNAT什麼的概述鏈接器gnatlink
和gnatmake source.adb -largs -Wl,-v
以詳細顯示gnatlink
如何調用系統鏈接器。
(從樹格式轉換到目標對象代碼,相信所述接頭的一部分)的部件要接聽問題的一部分「它是什麼?」和asuming你是在Unix/Linux系統類型上:
$ which gnatmake
/usr/bin/gnatmake
$ file /usr/bin/gnatmake
/usr/bin/gnatmake: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, stripped
...所以它是一個二進制:)
- 1. Ada - 用GCC編譯Ada
- 2. 編寫解析器和編譯器的最佳編程語言是什麼?
- 3. 我會用什麼編譯器來編寫機器語言?
- 4. 什麼語言是寫入腳本的初始編譯器?
- 5. 什麼是編譯速度快的編譯編程語言?
- 6. 什麼語言被用來編寫Rust編譯器?
- 7. 編寫本地語言編譯器
- 8. Xcode是用什麼語言編寫的?
- 9. 如何爲該語言的某種語言編寫編譯器?
- 10. 這是寫入什麼彙編語言?
- 11. 編寫一個臨時編譯器以使用新語言編寫編譯器
- 12. 以編譯語言編寫的插件
- 13. CLR語言優化。語言編譯器VS JIT編譯器
- 14. 不必要的Ada依賴重編譯(GCC 5.3.0)
- 15. 使用什麼語言編寫Go編程語言?
- 16. 什麼類型的編譯器可以編譯哪種編程語言?
- 17. 寫編程語言:如何編譯
- 18. 現代Unix工具是用什麼編程語言編寫的?
- 19. RabbitMQ用什麼語言編寫的?
- 20. 什麼編程語言的隱寫?
- 21. 什麼是GCC內聯彙編語言中的r()和double%%%?
- 22. 什麼語言可以編譯爲javascript?
- 23. 編譯編譯器錯誤編譯GCC
- 24. 哪種編程語言最容易編寫編譯器?
- 25. Picasa使用什麼語言編寫?
- 26. Facebook dispatcher.js用什麼語言編寫?
- 27. 應該用什麼語言編寫API?
- 28. 用什麼語言編寫.NET Framework?
- 29. IIS寫入了什麼編程語言?
- 30. 關於爲OO語言編寫編譯器後端的資源?
注:編譯器的技術上的鏈接不應被視爲一部分,而是一個基本系統工具可用於(並且通用於)同一平臺上的所有編譯器。 –
感謝tl; dr在最後。這是很多信息。 – Michael
+1爲一個全面但簡單的答案。 –