不同編程語言最終生成的機器碼是否一樣?
一樣,但是又不一樣!
這是一個挺有意思的問題!我也有個很有意思的回答。
一樣的是大家都是生成的機器碼,調用硬件指令,完成最后的計算。
在同一個硬件平臺,可用的指令集是相同的。比如X86平臺,所有編譯器可用的機器碼指令集,都是相同的。在ARM平臺也是如此。
也就是說不同的編譯器,生成的機器碼的基本元素,在同平臺是相同的。
————————————————————
不同的是最終機器碼的排列順序!
雖然是同一套指令集,但是同一個問題有各種各樣的解法。
一千個讀者就有一千個哈姆雷特,就像你讓多個程序員,都用C語言寫一個排序算法,在不抄襲,純原創的前提下,這些程序員寫的算法代碼一樣的可能性非常小。
不同編譯器編譯的過程也是不同的。越復雜的程序,最終的機器碼差異越大。比如說一個簡單的兩個數相加,最終都調用同一條硬件指令來完成。可能機器碼的差異會比較小。
但是盡管如此簡單的程序,不同編譯器生成的機器碼完全一樣的可能性也很低。比如說使用的寄存器可能不同,程序初始化和結束的過程也可能不同等等。
————————————————————
總體來說呢,作為高級語言程序員,一般情況下不需要去關心編譯器的機器碼細節。只有在一些極端情況下,會根據編譯器的一些特性,針對性的編寫優化代碼,以獲得更佳的性能體驗。比如jvm調優,針對硬件緩存機制的代碼調優等等。
如果你已經到這個級別了,那么恭喜你,你成為大神了!