2011-11-18 143 views
1

我是計算機專業的學生。目前我們正在學習Ada編程語言。編譯現在非常簡單:gnatmake source.adb所以我不知道gnatmake實際上做了什麼或者是什麼(script?binary?其他?)。無論如何,我想知道編譯器本身(也就是解析器,如果用不同的語言編寫的)是用什麼語言編碼的?編寫gcc gnatmake Ada編譯器的語言是什麼?

回答

5

典型的編譯器附帶兩個基本工具:編譯器和鏈接器。

comiler將語言源代碼(文本)翻譯成機器語言對象文件(二進制文件)。它可能會包含一些對象重定位信息,以幫助鏈接器。

鏈接器獲取多個機器語言對象文件並將它們全部鏈接到一個機器可執行文件中。

您通常必須告訴編譯器在哪裏找到執行編譯所需的所有額外文件,然後您必須告訴鏈接器需要將您的可執行文件(包括系統庫)鏈接在一起所需的每個文件的名稱可能會使用。這可能會變得非常複雜,這就是像make這樣的構建工具進來的地方。

Ada被定義爲應該總是有某種圖書管理員爲你追蹤這些信息。因此,要執行完整的系統構建,您只需要圖書管理員爲您構建可執行文件。

Gnat處理這種圖書管理員功能的方式是假設(除非另有說明)Ada單元(包)名稱與源和目標文件名稱之間存在一一對應關係。因此,如果它需要X的規範來完成編譯,它知道去X.ads找到規範文件。當它連接的時候,它知道它會在X.o中找到它的目標文件。這意味着如果它需要包X中的例程來成功鏈接,它就會知道如何爲你做,如果一個啞連接器會失敗,並告訴你它找不到的「符號」的半加密名稱。

因此,您不必爲程序中的每個單元輸入單獨的編譯命令,就像使用C或C++一樣,只需使用gnatmake即可編譯每個單元的給定可執行文件名稱,然後將它們鏈接起來一起爲你。一步,輕鬆自在。


至於你的最後一個問題,Gnat Ada編譯器幾乎全部寫在Ada中。編譯器用自己的語言編寫並自行編譯是非常典型的。這叫做self-hosting

然而,可以紮成GCC,以便是常見的GCC寫入C.

+0

注:編譯器的技術上的鏈接不應被視爲一部分,而是一個基本系統工具可用於(並且通用於)同一平臺上的所有編譯器。 –

+0

感謝tl; dr在最後。這是很多信息。 – Michael

+0

+1爲一個全面但簡單的答案。 –

2

gnatmake只是一個用Ada編寫的工具。它的行爲就像make。編譯器本身也是GNAT,也是用Ada編寫的。它是用許多語言編寫的GCC的一部分。

4

在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什麼的概述鏈接器gnatlinkgnatmake source.adb -largs -Wl,-v以詳細顯示gnatlink如何調用系統鏈接器。

1

(從樹格式轉換到目標對象代碼,相信所述接頭的一部分)的部件要接聽問題的一部分「它是什麼?」和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

引用原創者:「什麼gnatmake實際上做了什麼或(腳本?二進制?其他?)。」...現在請解釋爲什麼一個downvote是回答這個問題? – NWS

+0

是的,謝謝你的回答。 – Michael

+0

@Michael你很受歡迎,我不認爲這是你downvoted! – NWS