本節書摘來自華章計算機《c語言程式設計魔法書:基于c11标準》一書中的第1章,第1.2節,作者: 陳轶 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
c語言的發明其實基于unix作業系統。當時在c語言未面世之前,dennis ritchie所在的at&t貝爾實驗室用的unix系統是完全用彙編語言寫的。彙編語言的優勢是直接面向處理器本身,能直接對底層硬體進行控制,充分發揮處理器的硬體能力。然而,它的缺陷也是顯而易見的。
1.彙編語言的不足
首先,不可移植性。每種處理器,其指令集都大相徑庭,比如arm有arm的指令集架構(isa),intel x86有x86的isa,還有mips、power(原來為powerpc),motorola 68000等;再加上各類微控制器單元(micro-controller unit,mcu)、各類數字信号處理器(digital signal processor,dsp),每種isa都有其相應的彙編語言。那麼多處理器如果對每一種都使用不同的彙編語言來實作同一個作業系統,那作業系統的開發人員真要崩潰了……而且即便實作出來,可能各個處理器上的實作也會有所不同,标準也很難被統一起來。
其次,彙編語言本身要比進階語言精密。因為彙編語言面對的都是寄存器、存儲器以及各類底層硬體,而不是一種抽象的資料模型,是以代碼編寫時需要非常謹慎,而且調試程式也十分麻煩,且非常容易出錯。是以,如果有一種既能面向底層硬體,又能對資料以及程式進行抽象的進階語言出現,那勢必既能不太影響程式執行效率,又能大大提升程式的可執行性、可讀性以及編寫的效率,這将是非常偉大的貢獻。c語言也就是在這種背景下誕生的。
如果說,彙編語言面向的是底層硬體、一種過程化的程式設計風格的話,那麼c語言就是面向資料流和算法、一種結構化的程式設計風格。c語言是一種結構化的、靜态類型的編譯型程式設計語言。也就是說,用c語言編寫了源代碼之後,需要通過c語言編譯器進行編譯,建構為相應的處理器能直接執行的機器碼,然後處理器可以對生成出來的機器碼進行執行。是以在各個處理器上,處理器廠商或第三方隻需要為目前處理器寫一個對應的c語言編譯器即可。然後任何符合c語言标準的程式都能在上面編譯後執行,除了需要支援某些機器特定的功能和特性外(後面會介紹)。
2.c語言編寫程式要注意什麼
那麼我們在用c語言寫程式的時候應該注意哪些方面呢?
1)可移植性:c語言被設計出來的一大初衷就是為了能将同一個源代碼放到各個不同的平台上編譯運作。是以,如果我們的代碼要在多種不同架構的處理器上運作的話,我們就得注意c語言标準規定了哪些特性是編譯器必須遵守的,哪些特性是平台或編譯器自己實作的。我們要盡量使用标準中已明文規定的程式設計規範,盡可能避免在不同平台可能會産生不同行為的文法特性。當然,由于上面提到的處理器種類太過多樣,尤其在嵌入式開發領域,很多mcu用的還都是8位處理器,這種情況下c源代碼就很難被移植到32位或64位系統下了。本書後面将會指出大部分主流平台對c語言标準中所提到的“實作定義”行為的差別。另外,也會提到一些技巧來應對不同的平台
特性。
2)可維護性:可維護性在實際工程項目的研發中非常重要。它展現在最初工程架構的設計、對各個功能子產品的劃分、相應的開發人員安排,還有後期的測試。一般來說,現在一個工程如果是從無到有進行開發的話會采用螺旋式開發模型。也就是說,一個項目啟動後,可以先做一個功能簡單但能正常工作的産品原型。然後在此基礎上不斷地為它增加更多功能,或對之前的功能進行修改。在此期間,我們如何對整個工程進行子產品化劃分,進而能安排不同開發人員針對不同功能子產品進行開發就變得尤為重要。另外,在工程開發過程中,如果有人員流動,那麼如何将即将離職的開發人員手中的工作傳遞給新人也關系到整個項目的進展。是以,一個良好的c語言代碼應該具有可讀性、良好的文檔化注釋風格,以及較詳細的設計文檔。對于一個較大的工程項目來說,開發人員不僅僅需要把自己的代碼寫好,而且要寫得能讓别人看懂,并且要做好詳細的設計文檔,這樣才能把項目風險降低。
3)可延展性:大家或許已經知道,像微軟的windows作業系統由數千名工程師合作研發;linux作業系統對外開源,參與其中的研發人員也有數百上千人。如果我們在一個開發團隊中負責一個需要由多人合作開發的工程項目,那麼我們寫的功能子產品需要與其他人寫的功能子產品進行對接。是以,我們在開發一個較大工程項目時,需要協調好各自對外的子產品接口(application program interface,api)。由于c語言沒有全局名字空間(namespace)這個概念,是以命名一個對外接口也是非常重要的,否則可能會與其他功能子產品的接口名發生沖突。本書後面會對c語言函數命名以及符号連接配接做進一步介紹。
4)性能:性能是提升程式使用者效率和生産力的展現。一個應用程式的性能越高,那麼計算一個任務所花費的時間越短,也越節省計算機的耗電。而對于如何提升性能,一方面需要程式員對處理器架構、硬體特性有一定了解;另一方面需要程式員擁有比較豐富的算法知識,能針對實際需求靈活采用高效的算法。而像c語言這種十分接近硬體底層的進階程式設計語言,能極大限度地發揮處理器的特長,進而達到高效的運作性能。