2015-06-23 152 views
0

我在問這個問題,以澄清我理解編譯正確與否的某些事情。我將描述一個我持有的情況和假設。請告訴我這些假設是否屬實,如果不是,爲什麼。更好地理解編譯

假設我有一個C程序可以在一個處理器體系結構上編譯,但可以編譯兩個不同的操作系統,而不需要對代碼進行任何更改。這個程序有一些抽象邏輯的部分,只是計算東西和改變內存,然後是一些與操作系統交互的部分。

  1. 我想,這意味着這兩個二進制文件在抽象的邏輯發生的地方完全一致的,因爲它只是在同一臺機器的指令,只有地方的程序與操作系統進行交互,比如所有IO類型和分配內存不同。

  2. 我也明白這些差異只是因爲這些操作系統的實現例如<stdio.h>不同。

  3. 而且它不同,因爲這些操作系統對於設置信號有不同的標準:在每個寄存器中留下什麼信息,哪些信號代碼意味着什麼,等等,並且這些庫需要被校正以與這種格式兼容在每個OS上。

+0

我可以用不同的形式寫出這個問題,例如,「程序只是在IO部件中以不同的方式編譯?」,但我只是希望我的問題的上下文和意圖清楚。 –

+1

如果你想讓你的問題清楚,你可能需要考慮重寫你的標題。目前標題非常廣泛(不是說你的問題是)。 – ace

+1

這與編譯有關嗎?實際上翻譯同樣如此。對於一個操作系統,甚至是簡單的驅動程序,整體也是如此:它們爲底層硬件提供抽象。您在軟件中到處都有橫向分層。 – Olaf

回答

1
  1. 不指定您是否使用相同的版本相同的編譯器中,完成同樣的優化標誌。您也不會指定兩個操作系統是使用相同的目標文件格式,還是使用相同的調用約定。如果其中任何一個不匹配,二進制文件也不會。

  2. 如果兩個操作系統遵循相同的標準,則頭文件可能非常接近相同。 (他們不一定是這樣。)正如其他人所說,圖書館會發現不同之處,尤其是系統調用存根。 (即使正常的調用約定匹配,調用系統調用的約定也不需要匹配。)

  3. 你在這裏討論的是我總結的「調用約定」。這只是差異的一部分。兩個操作系統可能在同一個體系結構上具有相同的調用約定 - 同樣的編譯器等等 - 但仍然沒有匹配的庫。

+0

謝謝!這正是我所期待的。結合對原始答案的評論,我對現在應該深入研究的內容有非常深刻的理解。 –