回覆列表
  • 1 # 精品中的大奇葩

    按嚴格意義上來說是不一樣的。

    你聽過條條大路通羅馬嗎?雖然不同的程式語言最後都要編譯成計算機硬體能解碼的機器碼,但是過程千差萬別。

    機器的硬體,比如處理器,核心數量,作業系統的位數,等等。都會影響最終生成的機器碼。

    就像你用M1處理器的MAC跑x86的應用,也要先進行內部的轉碼才行。

    不過這個問題雖然有意思,但是邏輯還是有點不對,相同的機器碼不能保證相同的工作環境。效果可能一樣,但是過程肯定是有差異的,所以生成的機器碼也會不一樣。

  • 2 # 哼哼online

    不一樣的。

    即便是同樣的原始碼,用不同版本或者同樣的版本的編譯器,用不同編譯選項生成的程式碼也是不一樣的。

    商業版本的編譯器的程式碼一般來說質量更高,免費的就不好說了,看開發人員的技術水平啦。

    比如,當年的SUN公司的編譯器生成的C語言的程式碼比GNU版本的編譯器生成的程式碼執行速度更快,而且bug更少。一句話,一分錢一分貨。

  • 3 # 三石科技觀察

    先給出答案,對於同樣一段程式,不同程式語言最終生成的機器碼是不一樣。

    而且,即使是同一程式語言的同一段程式碼,使用不同的編譯器編譯出的機器碼也很有可能是不一樣的,這一點可以分成幾種情況來分析。

    假如我們有這樣一段C程式碼:

    int main(void)

    {

    int a=1;

    int b=2;

    int c=0;

    c=a+b;

    return c;

    }

    程式碼非常簡單,我們按照架構不同、編譯器不同來分別看一下生成的機器碼有何區別。

    1.X86架構下使用GCC編譯。

    我們用x86架構下的GCC進行編譯,然後使用ojbdump反編譯二進位制檔案,可以得到一系列的彙編程式碼,我們擷取最主要的main方法看一下對應的機器碼:

    這就是X86架構下的機器碼,注意指令長度、指令名稱和暫存器。

    2.鯤鵬架構下使用GCC編譯。

    同樣還是這段程式碼,我們在華為鯤鵬伺服器上編譯後再反編譯,得到對應的機器碼如下:

    可以看到,和X86架構下是完全不同的,鯤鵬伺服器基於ARM架構,最終機器碼的指令長度、指令名稱和暫存器和X86架構都不同。

    2.鯤鵬架構下使用畢昇編譯器編譯。

    同樣還是這段程式碼,同樣在華為鯤鵬伺服器上編譯後再反編譯,但是這次使用的是華為的畢昇編譯器,得到對應的機器碼如下:

    這段機器碼和上一個GCC編譯的很像,但是在使用的暫存器、指令順序有很小的區別,兩者不是完全一致的。

  • 4 # 外老師

    一樣,但是又不一樣!

    這是一個挺有意思的問題!我也有個很有意思的回答。

    一樣的是大家都是生成的機器碼,呼叫硬體指令,完成最後的計算。

    在同一個硬體平臺,可用的指令集是相同的。比如X86平臺,所有編譯器可用的機器碼指令集,都是相同的。在ARM平臺也是如此。

    也就是說不同的編譯器,生成的機器碼的基本元素,在同平臺是相同的。

    ————————————————————

    不同的是最終機器碼的排列順序!

    雖然是同一套指令集,但是同一個問題有各種各樣的解法。

    不同編譯器編譯的過程也是不同的。越複雜的程式,最終的機器碼差異越大。比如說一個簡單的兩個數相加,最終都呼叫同一條硬體指令來完成。可能機器碼的差異會比較小。

    但是儘管如此簡單的程式,不同編譯器生成的機器碼完全一樣的可能性也很低。比如說使用的暫存器可能不同,程式初始化和結束的過程也可能不同等等。

    ————————————————————

    總體來說呢,作為高階語言程式設計師,一般情況下不需要去關心編譯器的機器碼細節。只有在一些極端情況下,會根據編譯器的一些特性,針對性的編寫最佳化程式碼,以獲得更佳的效能體驗。比如jvm調優,針對硬體快取機制的程式碼調優等等。

    如果你已經到這個級別了,那麼恭喜你,你成為大神了!

  • 5 # BWanger軟體開發達人

    這個問題問的很好。同樣的程式段在作業系統、CPU位數、編繹設定等一致的情況下,結果是一樣的。否則,最終的機器碼是不相同的。

    VS系列,PYTHON,一般的C語言,再編繹時,都最終生成ASM組合語言,進而以機器碼的形式,讓計算機識別並最終執行(以下在32位系統下編繹)。

    此處,我們把a,b兩個整數相加,送給整數c,在VS執行環境下,我們看一下c=a+b的機器碼、彙編、VS編碼的結果,如下圖:

    從上面可以看出,不論a,b賦值如何,a+

    b一>c的程式碼只有三行,而且是一致的,每一個變數佔據4個位元組。mov eax,dword ptr [edp-4],mov eax,dword ptr [edp-8]等,標準的X86系列宏組合語言。可以用下表查到相應的機器碼。

    這就說明,在同樣的執行環境下a+b一>c的彙編碼、機器碼是一致的。

    同樣是32位的a+b一>c,在8位、16位等微控制器機上,結果是不一樣的。因為指令系統不一樣。

    也就是說,在硬體不一致時,機器碼是截然不同的。如下圖為微控制器的編碼形式,可以看出MOV A,Rn為11 E8,而MOV A,data 則為21 E5,差異非常大。

    總結:在寫軟體的,首先要考慮執行環境,PC機X86系列還是微控制器系列,是在16位、32位還是在64位的作業系統下執行,支援動態還是靜態庫,支援高速執行還是最佳化執行等等,在編繹時都要選擇好。

    只有以上的選項一致了,那麼同樣的程式碼,其機器碼是絕對一致的。

  • 6 # 日衝資訊 黃

    不同的程式語言生成的機器碼是不會一樣的。這裡有兩個原因:

    CPU的指令集不同導致機器碼不同語言的編譯器不同導致機器碼不同

    每種CPU都有自己的指令集,這些指令集大致包括暫存器操作指令,加法器操作指令等等。每種CPU的暫存器數量和結構都不一樣,因此,對應的指令集也不會相同。

    每種語言都有不同的編譯器。編譯器的作用是分析程式語法生成語法樹,再把CPU指令代入語法樹生成機器碼。每種編譯器生成的語法樹都是不一樣的。儘管執行結果是等效的,可以做成很多不同的執行順序。打個比方,您用算盤算1+2的時候,先撥1再撥2跟先撥2再撥1的結果是一樣的。

  • 中秋節和大豐收的關聯?
  • 哪種實木傢俱價效比高?