導航:首頁 > 源碼編譯 > 編譯器是如何成機器碼

編譯器是如何成機器碼

發布時間:2023-03-19 10:47:03

『壹』 C語言代碼編譯成的是機器碼,那麼怎麼實現可移植性呢

C語言代碼編譯成的是機器碼,通常不能在不同指令系統的機器上運行。
我遇到過同樣的機器,同樣的機器碼,同樣的操作系統,也就是原來在本機編好的若干程序,突然運行不了了(出錯),必須重新編譯後才能運行。因為微軟動態鏈接庫里的子程序號碼「更新」了。
如果編譯成半成品機器碼,或者類似obj,到運行的機器上再由附加的解釋器解釋(或編譯器鏈接),則可以運行。這就是所謂的「跨平台」「移植」「嵌入」。

『貳』 請問c語言的源程序被編譯後的代碼是機器碼嗎

首先語言和被編譯成的代碼沒有直接關系。有把java編譯成機器碼的編譯器也有把C語言編譯成Java位元組碼的編譯器。

機器碼只是CPU直接認讀的編碼,不等於和硬體打交道的。操作硬體是你通過程序操作CPU做到的。操作系統只不過是別人寫的程序而已,說到底還是程序。

『叄』 C語言編譯後是生成匯編代碼還是直接生成機器代碼

不會是這兩種語言代碼,而是編譯後直接生成二進制文件(.obj文件),再通過連接器鏈接成二進制文件(.exe/.dll/.ocx/.sys等)

『肆』 在計算機中,將匯編語言轉換為機器語言的過程叫

在計算機中,將匯編語言轉換為機器語言的過程叫匯編,或者匯編過程。
匯編語言稱為符號化的機器語言,不能直接執行,需要將匯編語言轉換為機器語言後才能執行,將匯編語言程序轉換為機器語言程序的過程稱為匯編過程。

匯編大多是指匯編語言,匯編程序。把匯編語言翻譯成機器語言的過程稱為匯編。在匯編語言中,用助記符(Memoni)代替操作碼,用地址符號(Symbol)或標號(Label)代替地址碼。這樣用符號代替機器語言的二進制碼,就把機器語言變成了匯編語言。於是匯編語言亦稱為符號語言。用匯編語言編寫的程序,機器不能直接識別,要由一種程序將匯編語言翻譯成機器語言,這種起翻譯作用的程序叫匯編程序,匯編程序是系統軟體中語言處理的系統軟體。

『伍』 C語言翻譯成機器碼,一定先要翻譯成匯編嗎

是的
編譯器是先轉成匯編代碼
然後再轉成機器碼
也就是二進制

『陸』 能否將C#代碼直接編譯成機器代碼

很抱歉,這是不可能的。C#語言程序不可能脫離.net框架,就像Java一樣,C#語言的運行環境是.net framework,.net對於C#就像Java虛擬機對於Java語言一樣。另外,C#是一種有限制語言,.net負責保證代碼訪問的安全特性,C++是唯一可以允許程序員開發無簡大局限制低級程序的語言,.net不僅負責為代碼提供運行支持,還負責保證程序的安全性,一種受限制的語言是不能脫離限製程序的控制的,對於C#,.net就是控制系統,因此,C#程序不可能脫離.net環境。

===================================================
對補充的答復:

這恐怕也是不行的。在以往的PE結構的程序中,因為不同的CPU擁有不同的指令集,所以為了適應客戶機的硬體的不同,往往會開發一個程序的不同版本,微軟為了解決這個問題,在.net中准備了多個即時編譯器(JIT),當一個中間語言的程序在客戶機上運行時,JIT會根據客戶機當前的硬體配置和操作系統等方面的情況對代碼進行優化,然後生成本地化的機器代碼,這個機器代碼並不是全部程序的代碼,而是只生成程序運行必須的部分,其它的會在執行時根據需要動態生成。微軟官方對項技術的解釋為:
「JIT 編譯考慮了在執行過程中某些代碼可能永遠不會被調用的事實。它不是耗費時間和內存將可移植可執行 (PE) 文件中的所有 MSIL 轉換為本機代碼,而是在執行期間根據需要轉換 MSIL 並存儲生成的本機代碼以供後繼的調用使用。當載入類型時,載入器創建存根 (stub) 並將其附加到類型的每個方法。當對方法進行初始調用時,存根 (stub) 將控制傳遞給 JIT 編譯器,而編譯器將該方法的 MSIL 轉換為本機代碼並修改存根 (stub) 以直接執行到本機代碼的位置。後仿滑面對 JIT 編譯的方法的調用將直接進行到以前生成的本機代碼,從而減少了進行 JIT 編譯和運行代碼所需的時間。」(原文)

此外,當一個程序開始運行後,JIT首先開始進行即時編譯,當某個被編攔讓譯過的方法被再次執行時,將直接執行它的本地代碼。

希望這些信息對您有所幫助。

『柒』 怎麼把 匯編代碼 轉成 機器碼

將這些代碼寫入一個.asm文件,加上必要的程序框架,用匯編程序匯編處理一下就可以得到你要的機器代碼了。

因為你列出的這些代碼是32位的指令,匯編程臘握尺序中要加上.386偽指令

以你列出的這三條指輪高令為例,你可以這樣寫一個程序:

.386
.code
.startup
mov eax, 0040100FH
jmp eax
add edx, 4
end

用TASM匯編程序匯編,在命令行里加上 /l 選項,匯編後查皮昌閱生成的.lst文件,可以得到這三條指令的十六進制的機器代碼為:
B8 0040100F (按位元組拆開是 B8 0F 10 40 00)
FF E0
83 C2 04

『捌』 後綴為exe的文件本身是機器碼嗎C++編譯過的程序是機器碼么。但是java好像也能做出exe程序。

exe文件是機器碼
只要遵循exe文件格式進行編譯鏈接就可以製作exe,並非某一編譯器特有
c++直接編譯成二進制機器碼,可以在機器上直接運行,而java先將代碼編譯成位元組碼,再依靠java虛擬機模擬cpu運行程序,性能上有損失
解釋型編譯器並不直接產生二進制機器碼,而是中間碼 需要特定的軟體先解釋成二進制碼才可運行
如腳本,這種方法靈活性強,修改代碼無需重臘櫻新編譯,但性能塌局液會損團物失,
編譯型則直接產生二進制代碼,無需軟體支持,靠硬體即可運行,這種方法速度快,但靈活性不足,每次修改都需要重新編譯。
java屬於混合型,產生的不是中間碼 而是位元組碼 java虛擬機不解釋成機器碼 而是模擬cpu運行,所有java稱虛擬機,而不是解釋器

『玖』 編譯器為什麼會生成匯編語言而不是機器語言

計算機只能識別二進制代碼,所以機器指令是由二進制代碼組成的,即你所說的機器語言。所謂匯編語言,只是一種符號,用來方便人們使用,否則你看到的都是一串串的01011011之類的信息,一眼就認出它是什麼指令非常困難,而用匯編語言這種符號,一看就知道是什麼指令了。這種符號語言用助記符來表示操作碼,用符號或符號地址來表示操作數或數地址,它與機器指令是一一對應的。(樓上各位表述的所謂「步驟」論是不確切的)
所以,並不是你說的「生成匯編語言而不是機器語言」,生成的是機器語言,你在調試器或反匯編程序中看到的匯編語言代碼只是由反匯編程序把機器指令翻譯成你看得懂的符號--匯編語言--而已。(比如你在OD或IDA中可以看到每行匯編指令前面都有機器碼,如push ebp的機器碼是55h,單看55,你不是熟手的話可能還不知道它是什麼指令,後面給你顯示出符號"push ebp",你一下子就明白了,這就是一一對應的關系,連"55"都是為了讓你看的方便,否則應是01010101,即8個電子元件的電源開、關狀態)
同樣的道理,你在十六進制編輯器(如winhex、HexWorkShop等軟體)中看到的是十六進制每行16位元組排列的,那也是經過把二進制代碼每位元組轉換成十六進制顯示給你看的。

關於平台問題,當然會有影響,不同的CPU有不同的指令系統,就連同一廠家的CPU指令系統都不同,比如Intel公司的CPU,從最早的到現在的,指令不斷增多,什麼MMX、SSE等等新指令集不斷出現,更不要說不同廠家的CPU了。當然它們之間也有很多兼容的指令集。

『拾』 編譯器是什麼意思,是做什麼的

編譯器
編譯器是一種特殊的程序,它可以把以特定編程語言寫成的程序變為機器可以運行的機器碼。我們把一個程序寫好,這時我們利用的環境是文本編輯器。這時我程序把程序稱為源程序。在此以後程序員可以運行相應的編譯器,通過指定需要編譯的文件的名稱就可以把相應的源文件(通過一個復雜的過程)轉化為機器碼了。

下面我們看看它是如何工作的。首先編譯器進行語法分析,也就是要把那些字元串分離出來。然後進行語義分析,就是把各個由語法分析分析出的語法單元的意義搞清楚。最後生成的是目標文件,我們也稱為obj文件。再經過鏈接器的鏈接就可以生成最後的可執行代碼了。有些時候我們需要把多個文件產生的目標文件進行鏈接,產生最後的代碼。我們把一過程稱為交叉鏈接。

有一個稱為LCC的編譯器,還挺不錯的;還有一個用於分析其規則的小工具;

閱讀全文

與編譯器是如何成機器碼相關的資料

熱點內容
如何查看伺服器系統版本信息 瀏覽:512
成都市土地出讓金演算法 瀏覽:697
鋼筋加密標記 瀏覽:567
ps中擴展功能在文件夾的什麼位置 瀏覽:903
雙極壓縮機為什麼要先高壓 瀏覽:527
蘋果手機伺服器填什麼 瀏覽:832
android移動動畫效果 瀏覽:691
電子和伺服器是什麼意思 瀏覽:691
phpurl中文亂碼問題 瀏覽:893
程序員那麼可愛大結局陸漓產子 瀏覽:538
java如何從雲伺服器讀取本地文件 瀏覽:923
壓縮空氣軟管製作方法 瀏覽:911
天河三號演算法 瀏覽:924
php隊列教程 瀏覽:632
洪水命令 瀏覽:529
安卓怎麼弄成蘋果在線 瀏覽:435
谷歌web伺服器地址 瀏覽:899
安卓鎖屏圖片如何刪除 瀏覽:719
python3多進程編程 瀏覽:714
證明代碼是程序員寫的 瀏覽:397