C語言是如何控制硬件的?
首先要明白所有的高級語言、匯編語言 最終都是要 編譯 成機器能識別的 機器語言。
高級語言->匯編語言->機器語言。
機器語言(machine language)是一種指令集的體系。這種指令集,稱機器碼(machine code),是電腦的CPU可直接解讀的數(shù)據(jù)。
機器碼有時也被稱為原生碼(Native Code),這個名詞比較強調(diào)某種編程語言或庫,它與運行平臺相關(guān)的部份。機器語言是用二進制代碼表示的計算機能直接識別和執(zhí)行的一種機器指令的集合。它是計算機的設(shè)計者通過計算機的硬件結(jié)構(gòu)賦予計算機的操作功能。
C語言轉(zhuǎn)化為相應(yīng)對機器語言,以GCC編譯器為例,可以分為四步。
第一步是預(yù)處理,包括語法檢查等工作。
gcc -P abc.c
第二步由源程序生產(chǎn)匯編語言代碼。
gcc -S abc.c
會生成abc.s文件,這個文件里就是匯編代碼。
第三步編譯器生成目標代碼,一個源文件生成一個目標代碼。
gcc -c abc.c
會生成abc.o
第四步連接器從目標代碼生成可執(zhí)行文件。
gcc abc.o
目標代碼包括機器碼和符號表(函數(shù)及變量名)。連接器的主要作用是通過符號表在庫文件和其他模塊中找到在目標代碼中引入或未定義的符號(函數(shù)及變量名),將幾個目標代碼合成可執(zhí)行文件。
機器語言的本質(zhì)是二進制數(shù)據(jù),最終都是以二進制的形式存儲,二進制就是01011101101001010這種數(shù)字串,為什么二進制串就能控制硬件呢?
機器語言是非常簡單的,因為機器的每個部件的功能都是固定的,所以要完成一個復(fù)雜的動作,需要把相關(guān)的部件按一定的規(guī)律有序完成才行,這其中有多復(fù)雜想想也應(yīng)該知道。機器能接受的指令就只有有2個,固定一個動作,做或不做,在計算機中是以2進制標記的,也就是1和0,指令為1,就做該動作一次,指令為0,就不做該動作。大量固定的動作根據(jù)一定的規(guī)律有序的成功做完,就組成軟件中所需要完成的一個功能。這就和彈鋼琴是一樣的,每一個音符需要你按一個鍵,每按一次就是一次動作,大量有序的按鍵就展示出了一首曲子,計算機的動作和鋼琴的琴鍵是一樣的道理。
最早的時候,軟件編程就是大量的機器指令堆砌,工作量非常龐大,且內(nèi)容復(fù)雜無比,維護起來非常麻煩,所以才有機器語言的誕生,就是計算機出廠前計術(shù)人員已經(jīng)把固定的指令操作打包了組成了一個又一個的相對復(fù)雜功能,只要計算機軟件調(diào)用觸發(fā)這些功能就可以展示相應(yīng)的功能了,這一層的語言就是計算機語言了,匯編語言就是這一層面的,匯編編程是非常麻煩的,代碼量大,工作量也嚇人,但是,功能和運行速度也強悍的嚇人,任何高級語言都無法比擬,算是軟件開發(fā)真正的核心技術(shù)所在。
我們現(xiàn)在所說的軟件編程,用的就是比計算機語言高一層的語言,也就是高級語言,像如今流行的語言C/C++、Java、PHP、js等都是高級語言。用這些高級語言幾行代碼展示的功能,在計算機執(zhí)行的時候仍然是非常復(fù)雜的行為,所以不要認為會編程就認識了計算機,真正深究,核心技術(shù)的復(fù)雜程度絕對超乎你的想象。
看到這里,心理是不是已經(jīng)有了答案,硬件是不可能完成你所有想要的功能的,軟件可以展示的功能都是計算機固有的功能,功能有多強大主要取決于計算機的硬件。簡單來說,軟件就像是人的思想,硬件就是人的身體,身體的所有動作都是思想賦予的。但不合實際的想法身體是不可能完成的。