簡體   English   中英

編譯器如何“知道”如何將代碼轉換為特定於處理器的程序集?

[英]How does a compiler “know” how to translate code into processor specific assembly?

答案者已經知道的東西,但在這里,無論如何都要顯示我的思考過程:

從HLL到機器代碼,這里發生了大量的事件(有連接器和其他東西,但是現在讓我們忽略它):

HLL - >編譯器 - >匯編程序---->機器代碼

根據我購買的硬件,它可能有不同的處理器(Intel,SPARC,ARM等)。 匯編語言是特定於處理器的。 因此,當代碼來自Compiler - > Assembler時,生成的匯編代碼是特定於處理器的。

切入點:

例如:我的硬件上有Windows操作系統。 而且,我得到'用於Windows 7 64位的C編譯器'。 而且我在同一硬件上也有Ubuntu,我得到'Ubuntu 64位的C編譯器'。

  1. 我可以在具有不同處理器架構的不同硬件上使用相同的OS,或者在相同硬件上使用不同的OS(如上例所示)。 當我下載C編譯器時,為什么編譯器被列為特定於操作系統? 而不是處理器特定? 由於編譯器的重點是將HLL轉換為Assembly,這是特定於處理器體系結構而不是特定於操作系統。

  2. 假設1.事情是如何完成的,當我下載適用於Windows 7和Ubuntu的編譯器時,編譯器如何知道要生成哪個特定於處理器的匯編代碼? 編譯器是否附帶各種特定於處理器的匯編程序?

有幾個因素影響到這一點。 對於台式機,實際上只有兩種架構在使用:32位是x86(有各種擴展),64位是x86-64。 因此,許多軟件可以忽略這個問題,只指定“位數”。 對於Windows RT / 8之前的Windows,尤其如此,它甚至不支持任何其他體系結構。

雖然編譯器必須了解處理器體系結構,但幾乎所有有趣的程序都必須以某種方式與操作系統交互。 即使您的代碼不與操作系統交互,編譯器也必須知道要用於二進制文件的文件格式,要鏈接的庫,等等。 運行時庫也是特定於操作系統的,通常與編譯器捆綁在一起。

至於編譯器如何知道要生成什么樣的指令:您下載的二進制文件是專門為一個體系結構定制的(無論您是否提到它的頁面)並且無法為其他體系結構生成代碼,或者確實有幾個后端匯編。

也就是說,我沒有看到很多編譯器聲明“ <operating system> <language>編譯器”。 編寫器編寫者在指定指令集時通常更為迂腐,分銷商也是如此。 只有windows家伙對此非常草率,因為直到大約一年前它才是有用的信息。

對於實際的計算,比如添加兩個數字,只有硬件很重要,而且你確實會在Windows和Linux下獲得相同的機器代碼。

有趣的“膠水”由平台庫提供,例如標准C庫,它提供“在標准輸出上打印字符”的功能。 函數調用代碼也完全由硬件決定(雖然Windows和Linux之間存在一些不同的約定,例如放置函數參數的位置,但這些僅僅是約定)。 特定於平台的“肉”是由這些庫的實現提供的。 例如, printf是如何實現的 不同的代碼是在Linux和Windows產生的,但差異不是那種指令,而是你如何跟操作系統。

同樣,這主要是常規問題,並且在同一硬件上針對不同操作系統的程序的實際機器代碼沒有顯着差異。 區別僅在於您如何讓操作系統代表您執行某些操作,例如輸入/輸出,給您記憶,告訴您時間等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM