① 為什麼程序代碼被編譯成機器碼就不能跨平台運行
首先機器碼實際上就是一串的CPU的指令,比如說,把內存地址A的東西移到內存地址B,遞增一下地址B的的東西。又或者說,把某個地址C的內容拷貝至某寄存器。所以實際上就是內容移動+少量的數值運算,全是基於內存進行的。
----------------------------------
那麼之所以同一套機器碼不能在不同的操作系統下運行的原因是:
不同的操作系統管理內存的方法不一樣咯。計算機開機時,內存是空的,操作系統決定了如何擺放內存。比如操作系統A可能把自己的Runtime內核放在地址的前面XXXMB里。操作系統B可能願意把自己的內核放在別的地方。就算哪怕不同的操作系統把內核放在同一個位置,內核里頭的memory擺放也不一樣的。
所以同一套內容移動的機器碼,在不同的操作系統下自然產生了不同的效果。
② C語言編譯到機器碼的過程求詳細解說,不勝感激
從編碼到生成可執行的binary文件是有好幾個過程的:(默認已完成編碼)
1, 預編譯(預處理), 也就是替換工作, 先把代碼中的宏做替換, 條件編譯等會做處理,為編譯做作準備;
2,編譯,包括了語法的檢查,匯編代碼等中間代碼的生成,代碼優化,obj文件(也算是目標代碼)的生成,已經是有機器碼了;
3.庫的合成,這個不一定有,不是必須的;
4.鏈接, 連接器會按照一定的規則,比如根據連接腳步,把code組織起來,生成elf文件(elf可能不是一個所有通用的格式),這個時候已經可以執行了,裡面的可以執行的機器碼;
5,裁剪, 可以把elf文件中的非必需的段 strip,生成一個更精簡的elf文件;
6,binary的生成,obj命令可以把elf文件轉換成binary文件,binary文件燒錄到存儲器中可以直擊運行。
③ delphi編譯出來是機器碼嗎還是虛擬機執行的
delphi 編寫的程序代碼,根據選擇平台的不同,會編譯生成相應平台的機器碼,不是虛擬機執行。
④ java程序編譯後會產生位元組碼還是機器碼
Java編譯後是位元組碼,C/C++以前全都是是機器碼。
電腦只能運行機器碼。Java在運行的時候把位元組碼變成機器碼。
C/C++在編譯的時候直接編譯成機器碼。
不過現在微軟的Visual Studio C++ 2005以後的C++也可以編譯成位元組碼,用CLR運行是轉換成機器碼(和Java差不多)。
⑤ C語言代碼編譯成的是機器碼,那麼怎麼實現可移植性呢
C語言寫的代碼編譯成了機器碼,與編譯器有關,與當前的電腦的CPU沒有關系
有個概念叫交叉編譯,我們做嵌入式的,就靠這個工作了
也就是在PC上編譯的機器碼,下載到其他的晶元裡面,讓它在這個晶元里運行
只要其他的電腦也支持同樣的編譯器產生的機器碼,就可以一致到它上面
⑥ 請問c語言的源程序被編譯後的代碼是機器碼嗎
首先語言和被編譯成的代碼沒有直接關系。有把Java編譯成機器碼的編譯器也有把C語言編譯成Java位元組碼的編譯器。
機器碼只是CPU直接認讀的編碼,不等於和硬體打交道的。操作硬體是你通過程序操作CPU做到的。操作系統只不過是別人寫的程序而已,說到底還是程序。
⑦ 高級語言編譯成的機器碼和匯編成的機器碼有什麼不同,為什麼高級語言可以通用而匯編的不可以
高級語言編譯生成的機器碼總體來說是冗長、效率低些;由匯編語言匯編生成的機器碼總體說是簡潔、高效。
所謂的通用是源程序的可移植性,高級語言的源程序對於不同的體系結構的計算機是基本一致的,只需用相應的編譯器重新編譯下就可以運行;而匯編語言源程序是直接與cpu的體系相對應的,要在別的體系結構的機器上運行,需要重新編寫源程序。
⑧ 程序編譯後的機器碼是在內存,還是硬碟
程序編譯後,機器碼是存在硬碟。
在執行時,機器碼,被操作系統,讀入內存。
⑨ 編譯時選擇機器碼,能反編譯出來嗎
可以說絕大部分的程序是不能反編譯的,因為同樣的機器碼,可以由多種不同的高級語言的程序代碼生成,所謂殊途同歸,不管外表看起來多麼不同的代碼,編譯後生成的機器碼也可能完全一樣的