導航:首頁 > 源碼編譯 > 為什麼要先編譯匯編文件

為什麼要先編譯匯編文件

發布時間:2023-01-02 20:41:05

① 為什麼要編譯

在匯編語言之後,上世紀50年代,科學家有發明了好幾種用人類語言書寫程序的方法,被稱為計算機高級語言。如PASCAL語言、BASIC語言、C語言等。高級語言源程序都可以用記事本(Notepad)打開和編輯。高級語言源程序也要經過翻譯才能被計算機接受。把高級語言翻譯成機器語言的方法大體有兩種,一種被稱作「解釋」,如GWBASIC、BASIC、QBASIC等語言,這種方式下,源程序被翻譯出一個完整的操作步驟,計算機就作出相應反應,執行一步,再翻譯再執行,逐步達到源程序制定目標。另一種方式被稱作「編譯」,如PASCAL語言和C語言等,這種方式下,計算機把源程序全部翻譯成它自身能讀懂的、被稱作目標程序的機器語言程序,然後再一次執行。二者的區別在於編譯程序能產生目標程序而解釋程序則不能產生目標程序。用高級程序設計語言編寫的程序,要轉換成等價的可執行程序,必須經過編譯和連接。同樣一段高級語言程序通過不同的編譯器可能產生不同的可執行程序。計算機不能直接執行符號化的程序,而是通過匯編程序、解釋程序和編譯程序而將符號程序轉換為可執行程序。高級語言需要編譯成目標代碼或通過解釋器解釋後才能被CPU執行。

② 高級語言為什麼需要編譯威匯編代碼而不直接轉換為目標代碼

因為匯編是最接近機器碼的一種語言,有利於不同編譯器間的兼容,更有利於編

寫人員後期查找底層錯誤

bug也可能是由底層硬體特性引起的

③ 為什麼說用高級語言寫的程序,執行效率沒有匯編高這些高級語言不都是要先編譯成匯編語言嗎

高級語言主要是給人看的,即使實現的目的完全相同,不同的程序員寫出來的高級語言都很可能會看起來完全不同,因此編譯器在把高級語言編譯為機器碼的過程中,就難免會產生很多的冗餘代碼,比如在匯編語言中從a點到b點能夠一步到達的,在高級語言編譯的代碼中卻有可能滿世界亂轉把整個字母表都走一遭後才到達b,盡管結果看起來是一樣的,但效率就不可同日而語了。
當然了,像js之類的腳本語言也是高級語言啊,它們是解析執行的,效率當然更加沒有匯編語言高了。

④ C語言為什麼要先編譯成匯編語言

C語言,具有可移植性,或者說同樣的代碼可以在不同cpu平台上運行得到同樣的結果
匯編語言,移植性差,一般針對某型cpu,每個類型的cpu都有自己的匯編語言
為保證C語言編制的通用演算法的可移植性,比如我們用C編寫了一套mp3解碼演算法程序,要在pc機上、手機上都能用,那麼我們就採用通用的C編譯器,將C語言程序編譯成指定CPU的匯編語言,再匯編成機器可執行程序。
另一個用途是程序優化問題,在C語言層次,由於是高級語言,不涉及底層硬體,那麼底層硬體的特性不能夠得到充分利用,在需要優化演算法的場合,我們需要將C語言演算法編譯生成匯編程序,然後修改需要優化的匯編程序達到目的。比如,你在手機上經常會遇到音頻解碼器,需要安裝,而且不同的cpu需要選擇不同的解碼器,這些解碼器應當就是在匯編層次上優化了演算法的可執行代碼,關鍵部分經過匯編級優化,不需要優化部分仍然使用C語言編譯的結果。

⑤ 編譯後一定要匯編嗎

這種事情從理論層面來說:不一定要與匯編語言有什麼瓜葛。你完全可以讓你的編譯器直接編譯成機器碼。大部分C/C++編譯器(不是所有的)之所以先編譯成匯編語言,是為了解構。從C到匯編的「翻譯」相對容易(都算是抽象語言,有語義的),同時匯編語言的編譯器效率很高,可以生成質量非常高的機器碼。所以兩者結合,可以突出各自的優勢,減少復雜度。
但是如果有必要,當然也可以直接編寫產生機器碼的編譯器,實際上java/C#這樣的半編譯語言和Js這樣的腳本語言,都沒有先轉換成匯編的這一步。前者是因為強大的虛擬機技術,直接把位元組碼轉換成機器碼執行了,後者是靈活的解釋器,實時把代碼轉換成機器碼執行,而完全沒有「編譯」這一步(當然如果深究的話,出於性能考慮,很多高性能的解釋器也會提前「預編譯」一部分代碼,但這是具體實現,不是宏觀概念)。

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

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

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

⑦ 小白求助,編譯是什麼,為什麼需要編譯

人與機器交流(即人讓計算機按照人的意願做事)依賴於語言
語言的層次是:自然語言->高級編程語言->匯編語言->機器碼
人最熟悉的肯定是自然語言(就是你平時說的話)。
而計算機的cpu只認識二進制的機器碼,機器碼指導計算機做什麼操作(如邏輯運算)。
高級編程語言跟自然語言的關系更近些,對人來說相當於自然語言的白痴版,如java中的對象與類的概念可能對應於現實世界的某種事物,如C語言中的函數可能對應了一個功能,比如列印文件,經過簡單的訓練,人也能大概的讀懂。
匯編語言和機器碼更接近些,每個匯編指令一般都會對應一條機器碼,而高級編程語言中的一個語句(如if else什麼的)可能會對應多條匯編指令,匯編指令一般就是算術運算(如add)、邏輯運算(如and)、數據傳送(如mov)、條件判斷、跳轉等,只能用這些簡單功能的匯編指令組合來完成一個復雜的功能。人看懂匯編就很吃力了,更別提用匯編來完成想要的功能,太吃力,這個過程還是交個編譯器比較好。
而機器碼對於一般的程序員來說,就是天書,也基本沒人願意去看。
自然語言最容易表述人們的要求,當用戶用自然語言表述了需要的功能後,從自然語言到高級語言的轉換過程由程序員來完成,而由高級編程語言到匯編、由匯編到機器碼的過程都由編譯器來完成,由編譯器完成的這個過程也就是編譯了。
高級編程語言的代碼經過編譯階段成為匯編代碼,匯編代碼經過匯編階段變成機器碼,機器碼文件經過鏈接階段變成可執行文件(.exe)。一般編譯是指的編譯階段和匯編階段的組合,編譯器的工作一般是編譯和鏈接。
這就是我的理解,希望你幫到你。

⑧ 為什麼C語言要先編譯成匯編語言

學C語言,因為C語言相對匯編要簡單,易學,涉及硬體少。 2、匯編的程序可讀性不好,實現起來較困難。 3、學完C語言後可以再回過頭來學匯編,這樣會容易些。

⑨ 為什麼高級語言要先編譯成匯編語言

高級語言不會編譯成匯編語言
而是直接編譯成二進制語言
也就是機器語言
機器語言和匯編語言是一一對應關系
所以 從機器語言和反向得到匯編。

⑩ 為什麼要對C源程序進行編譯、鏈接

首先要說的是C語言屬於高級語言,不能直接被計算機識別而執行,所以需要一些操作來轉化。。一開始是編譯預處理,對宏,包含指令,編譯指令等進行處理,然後是詞法語法分析,將源代碼翻譯成中間代碼(一般是匯編),接著優化代碼,,然後將中間代碼翻譯成機器語言(目標文件),機器語言是計算機的基層語言,能被計算機直接識別。。接著鏈接目標文件,生成可以執行文件。。。大概就是這樣。。詳細的LZ可看這個總結。。http://bbs.zdnet.com.cn/thread-1614727-1-1.html

閱讀全文

與為什麼要先編譯匯編文件相關的資料

熱點內容
小愛同學app里怎麼設置鬧鍾 瀏覽:626
微信小程序題庫源碼 瀏覽:734
國內程序員女高管 瀏覽:881
程序員會壓抑 瀏覽:682
物探編程 瀏覽:302
vuepdf預覽 瀏覽:327
迷你世界出編程軟體了 瀏覽:673
res文件夾有哪些 瀏覽:142
交通信號燈單片機課程設計 瀏覽:826
如何測試流媒體伺服器的並發能力 瀏覽:161
溯源碼有分國家認證的嗎 瀏覽:218
如何通過app查詢產檢報告 瀏覽:944
拉結爾安卓手機怎麼用 瀏覽:695
驅動級進程代理源碼 瀏覽:782
androidshape畫線 瀏覽:511
程序員想辭職被拒絕 瀏覽:101
java面試邏輯 瀏覽:749
如何下載全英文app 瀏覽:724
js函數式編程指南 瀏覽:380
為什麼安卓手機相機啟動會卡 瀏覽:341