1. 程式人生 > >編程之美,讓美國人科技高速發展,淺談C語言帶給美國的變化

編程之美,讓美國人科技高速發展,淺談C語言帶給美國的變化

c99 開發者 追蹤 n) 再次 故障排查 最新 gen 內部數據

  我去年7月份有幸應美國朋友的邀約,在美國眾多正在飛速發展中的高科技型企業暢遊了一番。本來我以為,美國只有Google公司,蘋果公司,FaceBook,IBM,微軟,思科這些巨型的高新技術企業在世界的新技術領域活躍。然而真正的到了美國,我才真正的發現美國遠遠比我想象的更加豐富多彩。而讓美國高新科技產業展現蓬勃生機的因素,我深深的發現C語言確實功不可沒。

 C語言是一門通用計算機編程語言,廣泛應用於底層開發。C語言的設計目標是以一種簡易的方式編譯、處理低級存儲器,產生少量的機器碼以及不需要任何的運行環境支持便能運行的編程語言。

  正是由於C語言這一設計思想讓美國人的創新設計思想可以淋漓盡致的展現出來,高科技智能控制的大量新型產品的功用在美國到處都可以得到體現。7月6號,我有幸參觀了一名14歲美國中學生(其父母都是地道的小型農場主,其生產的農作物僅夠一家人的花銷)創辦的企業,其公司為美國研發了特別多的交通方面的應用型器械,包括道路故障排查機器和車輛超載追蹤儀器,以及利用大數據為商場超市服務。如今這名中學生已經26歲,和我一般大的年領,我們在一起交流的時候,我不能從其身上體會到他對自己擁有的這一切感到多麽自豪,相反,和他交談中發現他對自己取得這一切成果顯得很自然。他說自己在8歲起就已經學會了C語言,10歲的時候就已經可以為機器人編寫驅動程序了。而他如今所有的成就,除了產品的元器件來源於他廣泛的渠道以外,所有的機器的控制和操作程序都是來源於C語言提供的基礎的編程。

  我又隨意參觀了一些美國專門做測量儀器的公司和處理汙水設備公司,其內部生產的原件也均來自於C語言。

  我感到很詫異,為什麽C語言具有這麽大的魔力呢?

  起初,C語言沒有官方標準。1978年由美國電話電報公司(AT&T)貝爾實驗室正式發表了C語言。布萊恩·柯林漢(Brian Kernighan) 和 丹尼斯·裏奇(Dennis Ritchie) 出版了一本書,名叫《The C Programming Language》。這本書被 C語言開發者們稱為K&R,很多年來被當作 C語言的非正式的標準說明。人們稱這個版本的 C語言為K&R C。K&R C主要介紹了以下特色:

結構體(struct)類型

長整數(long int)類型

無符號整數(unsigned int)類型

把運算符=+和=-改為+=和-=。因為=+和=-會使得編譯器不知道使用者要處理i = -10還是i =- 10,使得處理上產生混淆。

即使在後來ANSI C標準被提出的許多年後,K&R C仍然是許多編譯器的最 準要求,許多老舊的編譯器仍然運行K&R C的標準。

  1970到80年代,C語言被廣泛應用,從大型主機到小型微機,也衍生了C語言的很多不同版本。

  1983年,美國國家標準協會(ANSI)成立了一個委員會X3J11,來制定 C語言標準。

  1989年,美國國家標準協會(ANSI)通過了C語言標準,被稱為ANSI X3.159-1989 "Programming Language C"。因為這個標準是1989年通過的,所以一般簡稱C89標準。有些人也簡稱ANSI C,因為這個標準是美國國家標準協會(ANSI)發布的。

  1990年,國際標準化組織(ISO)和國際電工委員會(IEC)把C89標準定為C語言的國際標準,命名為ISO/IEC 9899:1990 - Programming languages -- C 。因為此標準是在1990年發布的,所以有些人把簡稱作C90標準。不過大多數人依然稱之為C89標準,因為此標準與ANSI C89標準完全等同。

  1994年,國際標準化組織(ISO)和國際電工委員會(IEC)發布了C89標準修訂版,名叫ISO/IEC 9899:1990/Cor 1:1994 [6] ,有些人簡稱為C94標準。

  1995年,國際標準化組織(ISO)和國際電工委員會(IEC)再次發布了C89標準修訂版,名叫ISO/IEC 9899:1990/Amd 1:1995 - C Integrity [7] ,有些人簡稱為C95標準。

  C99標準

  1999年1月,國際標準化組織(ISO)和國際電工委員會(IEC)發布了C語言的新標準,名叫ISO/IEC 9899:1999 - Programming languages -- C [8] ,簡稱C99標準。這是C語言的第二個官方標準。

  在C99中包括的特性有:

  增加了對編譯器的限制,比如源程序每行要求至少支持到 4095 字節,變量名函數名的要求支持到 63 字節(extern 要求支持到 31)。增強了預處理功能。例如:

  宏支持取可變參數 #define Macro(...) __VA_ARGS__

  使用宏的時候,允許省略參數,被省略的參數會被擴展成空串。支持 // 開頭的單行註釋(這個特性實際上在C89的很多編譯器上已經被支持了)增加了新關鍵字 restrict, inline, _Complex, _Imaginary, _Bool支持 long long, long double _Complex, float _Complex 等類型支持不定長的數組,即數組長度可以在運行時決定,比如利用變量作為數組長度。聲明時使用 int a[var] 的形式。不過考慮到效率和實現,不定長數組不能用在全局,或 struct 與 union 裏。變量聲明不必放在語句塊的開頭,for 語句提倡寫成 for(int i=0;i<100;++i) 的形式,即i 只在 for 語句塊內部有效。允許采用(type_name){xx,xx,xx} 類似於 C++ 的構造函數的形式構造匿名的結構體。復合字面量:初始化結構的時候允許對特定的元素賦值,形式為:struct test{int a[3],b;} foo[] = { [0].a = {1}, [1].a = 2 };struct test{int a, b, c, d;} foo = { .a = 1, .c = 3, 4, .b = 5 }; // 3,4 是對 .c,.d 賦值的格式化字符串中,利用 \u 支持 unicode 的字符。支持 16 進制的浮點數的描述。printf scanf 的格式化串增加了對 long long int 類型的支持。浮點數的內部數據描述支持了新標準,可以使用 #pragma 編譯器指令指定。除了已有的 __line__ __file__ 以外,增加__func__ 得到當前的函數名。允許編譯器化簡非常數的表達式。修改了 /% 處理負數時的定義,這樣可以給出明確的結果,例如在C89中-22 / 7 = -3, -22% 7 = -1,也可以-22 / 7= -4, -22% 7 = 6。 而C99中明確為 -22 / 7 = -3, -22% 7 = -1,只有一種結果。取消了函數返回類型默認為 int 的規定。允許 struct 定義的最後一個數組不指定其長度,寫做 [](flexible array member)。const const int i 將被當作 const int i 處理。增加和修改了一些標準頭文件,比如定義 bool 的 <stdbool.h> ,定義一些標準長度的 int 的 <inttypes.h> ,定義復數的 <complex.h> ,定義寬字符的 <wctype.h> ,類似於泛型的數學函數 <tgmath.h>, 浮點數相關的 <fenv.h>。 在<stdarg.h> 增加了 va_copy 用於復制 ... 的參數。裏增加了 struct tmx ,對 struct tm 做了擴展。

  C89只允許使用/*...*/形式的註釋,而C++則允許使用//形式的註釋,因此//形式的註釋被稱為C++風格。但許多C編譯系統再C99之前就已經支持這種方便的註釋方法,C99正式將//形式的註釋納入C語言的標準。輸入輸出對寬字符以及長整數等做了相應的支持。

GCC和其它一些商業編譯器基本都支持C99的大部分特性。

C11標準

  2011年12月8日,國際標準化組織(ISO)和國際電工委員會(IEC)再次發布了C語言的新標準,名叫ISO/IEC 9899:2011 - Information technology -- Programming languages -- C [10] ,簡稱C11標準,原名C1X。這是C語言的第三個官方標準,也是C語言的最新標準。

  新的標準提高了對C++的兼容性,並增加了一些新的特性。這些新特性包括:

對齊處理(Alignment)的標準化(包括_Alignas標誌符,alignof運算符, aligned_alloc函數以及<stdalign.h>頭文件。

_Noreturn 函數標記,類似於 gcc 的 __attribute__((noreturn))。_Generic 關鍵字。

  多線程(Multithreading)支持,包括:

  _Thread_local存儲類型標識符,<threads.h>頭文件,裏面包含了線程的創建和管理函數。_Atomic類型修飾符和<stdatomic.h>頭文件。增強的Unicode的支持。基於C Unicode技術報告ISO/IEC TR 19769:2004,增強了對Unicode的支持。包括為UTF-16/UTF-32編碼增加了char16_t和char32_t數據類型,提供了包含unicode字符串轉換函數的頭文件<uchar.h>.刪除了 gets() 函數,使用一個新的更安全的函數gets_s()替代。增加了邊界檢查函數接口,定義了新的安全的函數,例如 fopen_s(),strcat_s() 等等。增加了更多浮點處理宏。匿名結構體/聯合體支持。這個在gcc早已存在,C11將其引入標準。

  靜態斷言(static assertions),_Static_assert(),在解釋 #if 和 #error 之後被處理。新的 fopen() 模式,(“…x”)。類似 POSIX 中的 O_CREAT|O_EXCL,在文件鎖中比較常用。新增 quick_exit() 函數作為第三種終止程序的方式。當 exit()失敗時可以做最少的清理工作。

  通過這些,我們可以發現,美國人共同齊心協力為實現C語言最初的設計目標共同努力,才造就了如今美國科技的崛起,為美國在世界上的版權地位塑造了機會。時間不早了,大家晚安吧!

編程之美,讓美國人科技高速發展,淺談C語言帶給美國的變化