一、c語言的發展過程
1、c語言的產生
c程式語言最早是由
dennis m.ritchie於2023年到2023年在at&t貝爾實驗室⾥開發出來,主要⽤於重新實現unix作業系統。此時,c語⾔又被稱為k&r c。其中,k表⽰kernighan的⾸字母,⽽r則是ritchie的⾸字母。k&r c語⾔與後來標準化的c語⾔有很⼤差異。當時的第⼀本由 b.w.kernighan 和 d.m.ritchit 合著的著名的c語⾔專業書《the c programming language》也並⾮⼀個正式的程式設計語⾔規範,但被⽤了許多年。
2、c90標準
由於c語⾔被各⼤公司所使⽤(包括當時處於⿍盛時期的ibm pc),因此到了2023年,c語⾔由美國國家標準協會(ansi)進⾏了標準化,此時c語⾔又被稱為ansi c。⽽到了1990,ansi c就被國際標準化組織iso給採納了。此時,c語⾔在iso中有了⼀個官⽅名稱——iso/iec 9899:1990。其中,9899是c語⾔在iso標準中的代號,像c++在iso標準中的代號是14882。⽽冒號後⾯的1990表⽰當前修訂好的版本是在2023年發布的。對於iso/iec 9899:1990的俗稱或簡稱,有些地⽅稱為c89,有些地⽅稱為c90,或者c89/90。不管怎麼稱呼,它們都指代這個最初的c語⾔國際標準。這個版本的c語⾔標準作為k&r c的⼀個超集(即k&r c是此標準c的⼀個⼦集),把後來引⼊的許多⾮官⽅特性也⼀起整合了進去。其中包括了從c++借鑑的函式原型(function prototypes),指向void的指標,對國際字符集以及本地語⾔環境的⽀持。在此標準中,儘管已經將函式定義的⽅式改為現在我們常⽤的那種⽅式,不過k&r的語法形式仍然相容。
3、c99標準
在隨後的⼏年⾥,c語⾔的標準化委員會又不斷地對c語⾔進⾏改進,到了2023年,正式發布了iso/iec 9899:1999,簡稱為c99標準。c99標準引⼊了許多特性,包括內聯函式(inline functions)、可變長度的陣列、靈活的陣列成員(⽤於結構體)、復合字⾯量、指定成員的初始化器、對ieee754浮點數的改進、⽀持不定引數個數的巨集定義,在資料型別上還增加了long long int以及複數型別。毫不誇張地說,即便到⽬前為⽌,很少有c語⾔編譯器是完整⽀持c99的。像主流的gcc以及clang編譯器都能⽀持⾼達90%以上,⽽微軟的visual studio 2015中的c編譯器只能⽀持到70%左右。
4、c11標準
2023年,c語⾔標準委員會又重新開始修訂c語⾔,到了2023年正式發布了iso/iec 9899:2011
,簡稱為c11標準。c11標準新引⼊的特徵儘管沒c99相對c90引⼊的那麼多,但是這些也都⼗分有⽤,⽐如:位元組對齊說明符、泛型機制(generic selection)、對多執行緒的⽀持、靜態斷⾔、原⼦操作以及對unicode的⽀持。本書將主要針對c11標準為⼤家詳細講解c程式設計語⾔。關於c語⾔歷史與演化程序的詳細介紹可參考維基百科:鏈結。
二、c語言編寫程式注意事項
1、可移植性
c語⾔被設計出來的⼀⼤初衷就是為了能將同⼀個源**放到各個不同的平台上編譯運⾏。因此,如果我們的**要在多種不同
架構的處理器上運⾏的話,我們就得注意c語⾔標準規定了哪些特性是編譯器必須遵守的,哪些特性是平台或編譯器⾃⼰實現的。我們要盡量使⽤標準中已明⽂規定的程式設計規範,盡可能避免在不同平台可能會產⽣不同⾏為的語法特性。當然,由於上⾯提到的處理器種類太過多樣,尤其在嵌⼊式開發領域,很多mcu⽤的還都是8位處理器,這種情況下c源**就很難被移植到32位或64位系統下了。
2、可維護性
可維護性在實際⼯程項⽬的研發中⾮常重要。它體現在最初⼯程架構的設計、對各個功能模組的劃分、相應的開發⼈員安排,還
有後期的測試。⼀般來說,現在⼀個⼯程如果是從⽆到有進⾏開發的話會採⽤螺旋式開發模型。也就是說,⼀個項⽬啟動後,可以先做⼀個功能簡單但能正常⼯作的產品原型。然後在此基礎上不斷地為它增加更多功能,或對之前的功能進⾏修改。在此期間,我們如何對整個⼯程進⾏模組化劃分,從⽽能安排不同開發⼈員針對不同功能模組進⾏開發就變得尤為重要。另外,在⼯程開發過程中,如果有⼈員流動,那麼如何將即將離職的開發⼈員⼿中的⼯作交付給新⼈也關係到整個項⽬的進展。因此,⼀個良
好的c語⾔**應該具有可讀性、良好的⽂檔化注釋風格,以及較詳細的設計⽂檔。對於⼀個較⼤的⼯程項⽬來說,開發⼈員不僅僅需要把⾃⼰的**寫好,⽽且要寫得能讓別⼈看懂,並且要做好詳細的設計⽂檔,這樣才能把項⽬風險降低。
3、可延展性
4、效能
效能是提公升程式使⽤者效率和⽣產⼒的體現。⼀個應⽤程式的效能越⾼,那麼計算⼀個任務所花費的時間越短,也越節省計算機的耗電。⽽對於如何提公升效能,⼀⽅⾯需要程式設計師對處理器架構、硬體特性有⼀定了解;另⼀⽅⾯需要程式設計師擁有⽐較豐富的演算法知識,能針對實際需求靈活採⽤⾼效的演算法。⽽像c語⾔這種⼗分接近硬體底層的⾼級程式設計語⾔,能極⼤限度地發揮處理器的特長,從⽽達到⾼效的運⾏效能。
三、主流c語言編譯器介紹
1、對於當前主流桌⾯作業系統⽽⾔,可使⽤visual c++、gcc以及llvm clang這三⼤編譯器。
3、c語言編譯器分類圖
四、⽤c語⾔構建⼀個可執⾏程式的流程
1、從⽤c語⾔寫源**,然後經過編譯器、聯結器到最終可執⾏程式的流程圖⼤致如下圖所⽰。
2、從圖中我們可以清晰地看到c語⾔編譯器的⼤致流程。⾸先,我們先⽤c語⾔把源**寫好,然後交給c語⾔編譯器。c語⾔編譯器內部分為前端和後端。前端負責將c語⾔**進⾏詞法和語法上的解析,然後可以⽣成中間**。中間**這部分不是必須的,但是它能夠為程式的跨平台移植帶來諸多好處。⽐如,同樣的⼀份c語⾔源**在⼀臺計算機上編譯完之後,⽣成⼀套中間**。然後針對不同的⽬標平台(⽐如要將這⼀套**分別編譯成arm處理器的⼆進製機器碼、mips處理器的⼆進製機器碼以及x86處理器的⼆進製機器碼),只需要編寫相應⽬標平台的編譯器後端即可。所以,這麼做就可以把編譯器的前端與後端剝離開來(這在軟體⼯程上又可稱為解耦合),不同處理器⼚商可以針對⾃家的處理器特性,對中間**⽣成到⽬標⼆進製**的過程再度進⾏優化。接下來,由c語⾔編譯器後端⽣成源⽂件相應的⽬標⽂件。⽬標⽂件在windows系統上往往是.obj⽂件;⽽在unix/linux系統上往往是.o⽂件。c語⾔的源⽂件在所有平台上都統⼀⽤.c⽂件表⽰。最後,對於各個獨⽴的⽬標⽂件,通過聯結器將它們合併成⼀個最終可執⾏⽂件。聯結器與c語⾔編譯器是完全獨⽴的。所以,只要最終⽬標**的abi(應⽤程式⼆進製接⼜)⼀致,我們可以把各個編譯器⽣成的⽬標**都放在⼀起,最後連線⽣成⼀個可執⾏⽂件。⽐如,有些源**可⽤gcc編譯,有些使⽤clang編譯,還有些彙編語⾔源⽂件可直接通過彙編器⽣成⽬標**,最後將所有這些⽣成出來的⽬標**連線為可執⾏⽂件。最終⽤戶可以在當前的作業系統上載入可執⾏⽂件進⾏執⾏。作業系統利⽤載入器將可執⾏⽂件中相關的機器碼存放到記憶體中來執⾏應⽤程式。
五、c語言的工作方式
致謝
1、《c語言程式設計》[第四版],作者譚浩強
2、《c程式語言》[第二版],作者 brian w.kernighan, dennis m.ritchie
3、《c語言程式設計魔法書》作者 陳軼
4、主流c/c++編譯器|編譯環境簡介
C C語言概述
1.資料 演算法 程式。2.c語言程式是由乙個或多個函式組成的,函式是由語句組成的,語句是由關鍵字,識別符號,運算子,資料組成的 語句可分為 宣告語句,賦值語句,控制語句,函式語句,空語句。3.include語句是c預處理器指令,預處理器在c編譯器工作前對源 做預處理,即在該行位置鍵入了所包含檔案的...
C C 知識總結 一 C C 常識概述
程式 是一組計算機能識別和執行 預先編好的一些指令操作合集。計算機語言 計算機和人都可以識別的語言 機器並不能直接識別高階語言需要經過 翻譯 成二進位制格式的語言才可以識別 發展 計算機語言經歷了從低階語言 機器語言 符號語言 最後到高階語言 如c c 低階語言人難以看懂 維護成本高 而高階語言則相...
Transact SQL 語言概述
transact sql 語言中標準的sql 語句暢通無阻.transact sql 也有類似於sql 語言的分類,不過做了許多擴充.transact sql 語言的分類如下 珨 br 用來說明變數的命令.耨ddl,data definition language 用來建立資料庫 資料庫物件和定義其...