天天看點

《作業系統真象還原》——0.16 為什麼說彙編語言比C語言快

本節書摘來自異步社群《作業系統真象還原》一書中的第0章,第0.16節,作者:鄭鋼著,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

首先說這是謬論(有沒有想噴我的沖動?大人且慢,請聽我慢慢道來)。

不管用什麼語言,程式最終都是給cpu運作的,隻有cpu才能讓程式跑起來。cpu不知道什麼是彙編語言、c語言,甚至java、php、python等,它根本不知道交給它的指令曾經經曆過那麼多的解釋、編譯工序。不管什麼語言,編譯器最終翻譯出來的都是機器指令。是以在這一點來說,彙編語言編譯器編譯出來的機器指令和c編譯器編譯出來的機器指令無異。

那為什麼還說彙編語言更快呢?

我覺得應該說彙編語言生成的指令數更少,進而“顯得”執行得快,并不是彙編語言本身有多少威武霸氣,而是因為彙編語言本身就是機器指令的符号化,意思是說,一個彙編語言中的符号對應一個機器指令,它們是一一對應的。用彙編語言寫程式就相當于直接在寫機器指令,彙編語言編譯器并不會添加額外的語句,是以彙編語言寫的程式會更直接,cpu不會因多執行一些無關的指令而浪費時間,當然會快。

再看看c編譯器為咱們做了什麼。為了讓c程式員更加友善地程式設計,c編譯器在背後做了大量的工作,不僅如此,出于通用性、易用性或者其他方面的考慮,c編譯器往往會在背後加入額外的c語言代碼來支撐,是以實際的c代碼量就變得很大。另外在編譯階段,c代碼會率先被編譯成彙編代碼,然後再由彙編器将彙編代碼翻譯成機器指令,由于c代碼已經變得備援了,編譯出的彙編代碼自然也會備援,其機器指令也會多很多。

大多數人願意用c語言寫程式是因為c語言強大且更容易掌握。但這份優勢是有代價的。c程式員不用考慮切換棧,不用考慮用哪個段。這些必須要考慮的事情,程式員不考慮,隻好由編譯器幫着考慮了。而且為了通用性、功能,甚至安全方面的考慮,自然在背後要多寫一些代碼。就拿列印字元串來說,c語言的printf(),這裡面的工作可多了去了,不僅要檢查列印的資料類型,還要負責格式,小數點保留位數……而在彙編語言中隻要往顯存位址處mov一個字元就行了,字元串也就是多幾個mov操作而已。您說,c語言為了讓開發者用得爽,自己在背後做了多少貢獻。

總結:進階語言如c語言為了通用性等,需要兼顧的東西比較多,往往還加入了一些額外的代碼,是以編譯出來的彙編代碼比較多,很多部分都是一些周邊功能,并不是直接起作用的,不如用彙編語言直接寫功能相關的部分效果來得更直接,c語言被編譯成機器指令後,生成的機器指令當然也包括這些額外的部分,相當于多執行了一些“看似沒用”的指令,是以會比直接用彙編語言慢。