日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

C語言的前世今生(中)

 我是我你是你 2018-06-27

1972年到1973年這短短的一年是C語言發(fā)展最快的時期。由于它是那么優(yōu)雅和方便,以至于更多的科學(xué)家投身其中,其中最為重要的特性是預(yù)處理器。Mike Lesk和John Reiser拓展了這項功能,使得預(yù)處理指令可以有自己的參數(shù),也允許編譯器進行條件判斷從而進入不同的編譯分支。因此,Ritchie確信到了1973年,現(xiàn)代C語言的核心已經(jīng)完成,語言本身和編譯器都已經(jīng)成熟,可以在這個夏天為PDP-11重寫UNIX內(nèi)核了。而一年前Thompson剛剛做過一次失敗的嘗試,那時候的C語言甚至還不支持結(jié)構(gòu)化的數(shù)據(jù)存儲(structures)。C語言變得如此強大,操作系統(tǒng)開發(fā)者的信心也隨之膨脹,他們開始向其它在當(dāng)時非常流行的計算機上移植UNIX,比如Honeywell 635和IBM 360/370。也正是從這時起,通用庫被開發(fā)出來,例如,Lesk寫了一個可移植的I/O Package,既后來的標(biāo)準(zhǔn)I/O(standard I/O)。C語言的羽翼日漸豐滿。

1978年,Brian Kernighan和Ritchie共同完成了《The C Programming Language 》第一版,其中,Kernighan撰寫了幾乎全部的解說內(nèi)容,Ritchie則完成了附錄部分,包括參考手冊及UNIX開發(fā)接口。此后的10年,這本書成為了事實上C的通用標(biāo)準(zhǔn),也就是大名鼎鼎的'K&R'C。較之移植UNIX時候的C語言,K&R C不但引入了標(biāo)準(zhǔn)I/O庫,增加了long int和unsigned int數(shù)據(jù)類型,還修復(fù)了一些語義上的歧義。一個明顯的例子是前文提到過的B語言風(fēng)格的算術(shù)賦值運算:a =+ b,假如b是一個字面常量(literal constant),那么問題來了,a =-1究竟應(yīng)該被理解 成a=a-1還是把-1這個值賦給a呢?于是,C語言正式摒棄了這種操作符組合方式,把算術(shù)運算符前置,這樣一來,a -= 1和a = -1就沒有歧義了。

C語言的前世今生(中)

C語言在移植UNIX上取得了巨大的成功,除了操作系統(tǒng)本身,各種流行的工具軟件也被逐個移植到不同的硬件上。70年代初,貝爾實驗室的大神級科學(xué)家Steve Johnson寫了一個叫做'Portable C Compiler(ppc)'的現(xiàn)代編譯器,以便他可以把UNIX移植到32位機上。不得不提的是,這位大神也是個愛折騰的主兒,他試圖往B語言里面增加'異或'操作符,于是寫了個Yacc,在調(diào)試代碼的時候覺得編譯器缺少語義檢查能力又隨手寫了個Lint。在ppc之前,Ritchie寫的第一代編譯器存在一些'硬代碼',目的是針對PDP-11做最佳的優(yōu)化。但顯然給移植到其它機型帶來了麻煩。ppc直接使用Yacc生成的語法分析器并且生成更為通用的中間代碼。有了這款神器,C語言開始被貝爾實驗室以外的組織大規(guī)模使用,不但政府的大型軟件項目開始用C來編寫,甚至在個人計算機上,C語言也成了最受歡迎的開發(fā)工具,進入了千家萬戶。

C語言的前世今生(中)

C語言變得如此流行,到了1982年,它的變體越來越多,但一些擴展數(shù)據(jù)類型如void和enmu在K&R C中竟然沒有提及,在對于實現(xiàn)編譯器至關(guān)重要的很多細(xì)節(jié)問題的描述上也模糊不清,顯然,K&R C已經(jīng)無法準(zhǔn)確地描述當(dāng)時C語言的實際情況了。這門最為火爆的語言需要新的標(biāo)準(zhǔn)。1983年夏天,ANSI成立了X3J11委員會,經(jīng)過漫長的努力,最終在1989年發(fā)布了官方標(biāo)準(zhǔn)ANSI X3.159-1989。人們把完全遵循這套標(biāo)準(zhǔn)的C語言稱為ANSI C,也叫C89。1990年,國際標(biāo)準(zhǔn)化組織(ISO)采納了ANSI C作為ISO/IEC 9899:1990,從此C語言有了嚴(yán)格意義上的國際標(biāo)準(zhǔn),故而C89也可以被稱作C90,它們所定義的C語言是完全一樣的。標(biāo)準(zhǔn)制定的過程是一場斗爭,有很多廠商試圖向C語言添加有利于自己軟硬件的特性,但ANSI謹(jǐn)小慎微,專家們認(rèn)為標(biāo)準(zhǔn)應(yīng)該是保守的,要能兼容大多數(shù)舊的基于ppc的編譯器而不應(yīng)該把C語言改得面目全非。于是ANSI C的最終版只做了一處建議性的修改,就是像貝爾實驗室科學(xué)家Bjame Stroustrup在他所發(fā)明的C++中所作的那樣,清晰地聲明形參(formal arguments)的數(shù)據(jù)類型。K&R C風(fēng)格的函數(shù)聲明不需要指定形參的數(shù)據(jù)類型,例如:extern int foo();這樣的聲明只告訴編譯器foo是一個返回int類型的函數(shù)。而實際上foo的定義可能是下面這樣:

C語言的前世今生(中)

在現(xiàn)代C編譯器中,int foo();的聲明被解釋為可以接受任意參數(shù)并返回int類型值的函數(shù)。于是上面這段代碼可以被gcc正常編譯而不發(fā)出抱怨。但這樣做并不好,編譯器很難正確理解程序員的意圖因而也就不能進行嚴(yán)格的語義檢查,代碼出錯的可能性大大增加了。ANSI并沒有宣布舊風(fēng)格的聲明非法,一是它的語法合規(guī)且不影響功能;二是這種風(fēng)格已經(jīng)延續(xù)了十幾年,不得不考慮兼容問題。所以直到現(xiàn)在,兩種風(fēng)格的聲明都是可以工作的。但幾乎所有軟件公司的編程規(guī)范都禁止使用K&R風(fēng)格的聲明。C89還增加了幾個新的限定詞(qualifiers),例如'const'和'volatile'。不得不提一下的是,因為眾所周知的原因,ANSI C完全基于UNIX環(huán)境制定。但是語言本身并沒有對訪問外部環(huán)境的能力,也就是說,庫在不同的系統(tǒng)環(huán)境下必須被重寫。隨著庫的移植和標(biāo)準(zhǔn)化,1988年,在IEEE 1003基礎(chǔ)上出臺了'可移植操作系統(tǒng)接口',既POSIX(Portable Operating System Interface),它對應(yīng)的國際標(biāo)準(zhǔn)是ISO/IEC 9945。

C89的發(fā)布標(biāo)志著C語言正式成為國際通用的編程語言,從此人們可以愉快地同時用K&R和Standard兩種風(fēng)格寫程序,編譯器會很好地兼容它們。(但不建議這樣做,為了避免混淆,最好用__STDC__宏顯式地分割。)

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多