❶ 編譯器是將高級語言編譯成匯編語言嗎
一般的編譯器,是先將高級語言轉換成匯編語言(中間代碼),然後在匯編的基礎上優化生成OBJ目標代碼,最後Link成可執行文件
❷ 反編譯程序,是把所有的高級語言,變成機器語言還是匯編語言
編譯程序
是把
高級語言
變成匯編語言,進而變成
機器語言
,讓機器執行,是一個從高級到低級的過程。
反便宜程序是把機器語言變成匯編語言,是一個從低級到高級的過程。
❸ 任何高級語言都是編譯成匯編代碼然後運行的嗎
編譯器,是將便於人編寫,閱讀,維護的高級計算機語言翻譯為計算機能識別,運行的低級機器語言的程序。編譯器將源程序(Source program)作為輸入,翻譯產生使用目標語言(Target language)的等價程序。源程序一般為高級語言(High-level language),如Pascal,C++等,而目標語言則是匯編語言或目標機器的目標代碼(Object code),有時也稱作機器代碼(Machine code)。一個現代編譯器的主要工作流程如下:
源程序(source code)→預處理器(preprocessor)→編譯器(compiler)→匯編程序(assembler)→目標程序(object code)→連接器(鏈接器,Linker)→可執行程序(executables])工作原理
翻譯是從源代碼(通常為高級語言)到能直接被計算機或虛擬機執行的目標代碼(通常為低級語言或機器言)。然而,也存在從低級語言到高級語言的編譯器,這類編譯器中用來從由高級語言生成的低級語言代碼重新生成高級語言代碼的又被叫做反編譯器。也有從一種高級語言生成另一種高級語言的編譯器,或者生成一種需要進一步處理的的中間代碼的編譯器(又叫級聯)。典型的編譯器輸出是由包含入口點的名字和地址以及外部調用(到不在這個目標文件中的函數調用)的機器代碼所組成的目標文件。一組目標文件,不必是同一編譯器產生,但使用的編譯器必需採用同樣的輸出格式,可以鏈接在一起並生成可以由用戶直接執行的可執行程序。
肯定是要先編譯成機器碼,計算機才能識別。
❹ 高級語言編譯後產生的是匯編語言還是機器語言
這個不一定,可以是匯編語言,也可以是機器語言,如果你用過Linux上的gcc你就明白了。如果編譯完成,鏈接後,能運行肯定是機器語言。另外一種情況是:如果是Java或VS支持的語言,編譯後,即不是匯編語言,也不是機器語言,而是一種供運行時環境識別的中間語言。
❺ 按理說高級語言編譯後都成了機器語言了,那哪裡來的不可移植性呢
據我的理解,正是因為高級語言最終要編譯成為機器語言,才會有移植性的問題。可移植性通常指的是源程序代碼來說的,而不是指它編譯成的可執行代碼。
高級語言的特點就是指令和最終的可執行代碼的可讀性,最終還是要編譯成機器語言,這樣計算機才會「理解」。而由於計算機硬體的千差萬別(比如,同樣的CPU,由於架構的不同分為好多種不同的指令集),如果你用在A硬體上才有的指令在B硬體上執行,那麼結果估計不會讓你得到滿意的結果。
在不同的硬體上執行相同的高級語言的代碼,這些針對不同的硬體差異,有針對性的編寫相對應的計算機能夠正確「理解」並執行的指令工作,這些都要靠編譯器去解決。
❻ 匯編語言有標准,高級語言一定會轉變成匯編語言嗎
1、不一定
要求編譯後生成*.exe文件的都會先轉成匯編語言,然後匯編成*.exe
解釋語言就不會轉成匯編語言,例如Java就生成*.class,然後解釋執行
2、沒有實質性區別
3、匯編語言由機器語言發展而來
開始人們是直接用機器語言編程的,後來有人編出了匯編程序,就可以直接用比較易用的匯編語言寫程序。匯編程序負責把匯編語言寫的程序轉換成機器語言(*.exe)
❼ 高級語言經過編譯
高級語言要執行須經過以下步驟:
高級語言——》匯編語言——》機器語言(0和1的代碼)
高級語言通過編譯其編譯成匯編語言,如:
c = a + b;//高級語言
add $s1 $t1 $t2 ; //匯編語言
再由匯編程序轉換成二進制代碼,如:
000000 10001 10010 01000 00000 100000
註:每條匯編語言都有唯一的機器語言與之對應
在翻譯成機器代碼後就要把機器代碼與原文件 鏈接 載入 於是就運行了
❽ C語言中高級語言通過編譯器得到的是匯編語言嗎
不是哦,編譯得到的結果是二進制可執行文件,要得到匯編源碼還需要對其進行反編譯
❾ 高級編程語言也要編譯成匯編語言,不同的cpu匯編語言不一樣,那會編譯成那種匯編語言呢
高級語言一般最終不是編譯成匯編語言而是機器語言,而像C#這類語言編譯後為公共語言,不是機器碼,運行時公共語言代碼由NET框架負責進一步即時翻譯即時執行為機器指令。只有C++這類語言編譯後為CPU可以直接執行的機器碼。
附圖是VS2019中C++語言的一段調試時的反匯編窗口,其中白字是C++源代碼,下面是對應的匯編碼,匯編行左列為內存地址,中間是對應的機器指令和數據(內存中的實際值),右側是對應的匯編碼。
比如,定義整數變數a並賦值1的語句,被編譯器編譯成C7 45 F8 01 00 00 00 這樣幾個位元組,其中C7為匯編碼中的MOV指令,可以操作16位寄存器和內存以及立即數,45 F8 是當前命名空間中變數地址,即變數a的地址(F845),而01 00 00 00 為32位寬度的數值1(內存排列順序是前低後高)。也就是說機器語言的指令格式為:指令代碼,地址,數據,當然根據不同指令,有時候地址和數據是不需要的。而右側 MOV dword ptr[a],1 是指令助記符,也就是匯編指令,而用匯編指令編寫的程序也是需要編譯成機器指令的。
指令C7對應的匯編碼及含義
❿ 從編寫高級語言到機器語言總共要編譯幾次編譯出來的語言各是什麼
二次,第一次是將高級語言翻譯成匯編語言,然後在將匯編語言編譯鏈接成機器語言。其實編譯是只有一次。希望我的回答能讓你滿意