簡體   English   中英

使用編譯器生成的二進制文件取決於哪些因素?

[英]The binary generated using compiler depends on which factors?

我對編譯和編譯器很陌生,我有一些問題:

  1. 編譯器 A 生成的二進制文件是否與編譯器 B 不同? (所有其他條件,例如 os 和 architecture 和...都是相同的)。 為什么? 它們有何不同?

  2. 編譯 A 語言生成的二進制文件與編譯 B 語言生成的二進制文件有區別嗎? (所有其他條件,例如編譯器、操作系統和體系結構......都是相同的)。 換句話說,生成二進制文件的源語言之間是否存在任何關系或依賴關系? 為什么? 如果是,它們是如何相關的?

是的,你所有的問題。

您甚至可以使用相同的源代碼在同一台計算機上運行編譯器兩次,並且編譯器可以生成不同的二進制輸出。

編譯器 A 生成的二進制文件與編譯器 B 不同嗎?

有不同的方法來解決同樣的問題。 在人類世界中,如果你需要向北走一街區,向東走一街區,有兩種可能的路徑。 您可以 go 向北然后向東,或者您可以 go 向東然后向北。 只要您到達目的地,go 的哪條路都沒有關系。

同樣,如果你告訴編譯器將 3 和 5 相加,有多種方法可以解決這個問題。 編譯器做什么並不重要,只要結果是一樣的。

編譯器 A:從 3 開始,然后添加 5。

編譯器 B:從 5 開始,然后添加 3。

編譯器 C:在編譯時計算 3+5=8,然后在運行時將 8 加載到寄存器中。

編譯器 D:從 0 開始,按位反轉,左移 3,按位反轉,加 1。

所有這些都會產生相同的結果,並且根據計算機體系結構和編譯器的設置,將選擇一個選項而不是另一個選項。 這可能會導致不同的設置生成不同的二進制文件。 並且不同的編譯器可能會使用不同的默認設置。

編譯 A 語言生成的二進制文件與編譯 B 語言生成的二進制文件有區別嗎?

出於與上述相同的原因,除非編譯器設置完全相同,並且我們要求編譯器解決的問題完全相同,否則我們可能會有不同的二進制輸出。

編輯:

在某些情況下,使用不同的語言會導致圍繞你能做什么和不能做什么的不同假設。 例如,在 Fortran 中,假設 function 中的每個指針都是唯一的。 這允許編譯器圍繞這個事實進行優化。 (即從 RAM 中加載一次,然后將它們保存在緩存中)。 C 沒有此假設,因此如果編譯器無法確定指針是唯一的,則經常從 RAM 重新加載數據。 C99 引入了restrict關鍵字以允許程序員通知編譯器將 C 指針視為 Fortran 指針。

暫無
暫無

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

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