1. 任何高級語言都是編譯成匯編代碼然後運行的嗎
編譯器,是將便於人編寫,閱讀,維護的高級計算機語言翻譯為計算機能識別,運行的低級機器語言的程序。編譯器將源程序(Source program)作為輸入,翻譯產生使用目標語言(Target language)的等價程序。源程序一般為高級語言(High-level language),如Pascal,C++等,而目標語言則是匯編語言或目標機器的目標代碼(Object code),有時也稱作機器代碼(Machine code)。一個現代編譯器的主要工作流程如下:
源程序(source code)→預處理器(preprocessor)→編譯器(compiler)→匯編程序(assembler)→目標程序(object code)→連接器(鏈接器,Linker)→可執行程序(executables])工作原理
翻譯是從源代碼(通常為高級語言)到能直接被計算機或虛擬機執行的目標代碼(通常為低級語言或機器言)。然而,也存在從低級語言到高級語言的編譯器,這類編譯器中用來從由高級語言生成的低級語言代碼重新生成高級語言代碼的又被叫做反編譯器。也有從一種高級語言生成另一種高級語言的編譯器,或者生成一種需要進一步處理的的中間代碼的編譯器(又叫級聯)。典型的編譯器輸出是由包含入口點的名字和地址以及外部調用(到不在這個目標文件中的函數調用)的機器代碼所組成的目標文件。一組目標文件,不必是同一編譯器產生,但使用的編譯器必需採用同樣的輸出格式,可以鏈接在一起並生成可以由用戶直接執行的可執行程序。
肯定是要先編譯成機器碼,計算機才能識別。
2. 匯編語言有標准,高級語言一定會轉變成匯編語言嗎
1、不一定
要求編譯後生成*.exe文件的都會先轉成匯編語言,然後匯編成*.exe
解釋語言就不會轉成匯編語言,例如Java就生成*.class,然後解釋執行
2、沒有實質性區別
3、匯編語言由機器語言發展而來
開始人們是直接用機器語言編程的,後來有人編出了匯編程序,就可以直接用比較易用的匯編語言寫程序。匯編程序負責把匯編語言寫的程序轉換成機器語言(*.exe)
3. 高級編程語言也要編譯成匯編語言,不同的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對應的匯編碼及含義
4. 編譯器是將高級語言編譯成匯編語言嗎
一般的
編譯器
,是先將
高級語言
轉換成匯編語言(
中間代碼
),然後在匯編的基礎上優化生成OBJ
目標代碼
,最後Link成可執行文件
5. C語言中高級語言通過編譯器得到的是匯編語言嗎
不是哦,編譯得到的結果是二進制可執行文件,要得到匯編源碼還需要對其進行反編譯
6. 為什麼高級語言要先編譯成匯編語言
高級語言不會編譯成匯編語言
而是直接編譯成二進制語言
也就是機器語言
機器語言和匯編語言是一一對應關系
所以 從機器語言和反向得到匯編。
7. 為什麼說用高級語言寫的程序,執行效率沒有匯編高這些高級語言不都是要先編譯成匯編語言嗎
高級語言主要是給人看的,即使實現的目的完全相同,不同的程序員寫出來的高級語言都很可能會看起來完全不同,因此編譯器在把高級語言編譯為機器碼的過程中,就難免會產生很多的冗餘代碼,比如在匯編語言中從a點到b點能夠一步到達的,在高級語言編譯的代碼中卻有可能滿世界亂轉把整個字母表都走一遭後才到達b,盡管結果看起來是一樣的,但效率就不可同日而語了。
當然了,像js之類的腳本語言也是高級語言啊,它們是解析執行的,效率當然更加沒有匯編語言高了。
8. 高級語言編譯後產生的是匯編語言還是機器語言
這個不一定,可以是匯編語言,也可以是機器語言,如果你用過Linux上的gcc你就明白了。如果編譯完成,鏈接後,能運行肯定是機器語言。另外一種情況是:如果是Java或VS支持的語言,編譯後,即不是匯編語言,也不是機器語言,而是一種供運行時環境識別的中間語言。
9. 編譯程序是把高級語言編譯成匯編語言程序還是機器語言程序為什麼王道上有兩個說法啊,我糾結了!!
編程語言分為高級編程語言和低級編程語言。
匯編屬於低級語言,語法更接近程序實際的運行順序。
C/C++屬於高級語言,語法更接近自然語言。
無論C/C++還是匯編語言,都是將代碼編譯成可被機器識別的機器語言。