最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

【C++避坑相關(guān)】云風(fēng)的BLOG:C語(yǔ)言的前世今生

2021-01-07 19:11 作者:只有神知道的歌詞特效  | 我要投稿

來(lái)源鏈接:

https://blog.codingnow.com/2010/06/c_programming_language.html


C 語(yǔ)言,從 1970 年代設(shè)計(jì)并實(shí)現(xiàn)之初,它就注定了帶有強(qiáng)烈工程師文化的語(yǔ)言,而缺乏一些學(xué)術(shù)氣息。它的許多細(xì)節(jié)設(shè)計(jì),都帶有強(qiáng)烈的實(shí)用化痕跡。C 語(yǔ)言因 UNIX 操作系統(tǒng)而生,是 UNIX 系統(tǒng)的母語(yǔ)。這導(dǎo)致在這個(gè)廣泛應(yīng)用的操作系統(tǒng)上開(kāi)發(fā),必須通過(guò) C 語(yǔ)言的形式和系統(tǒng)進(jìn)行交互。這不僅影響了 UNIX 一個(gè)平臺(tái)上的軟件,既而也影響了后來(lái)世界上最大的桌面系統(tǒng) Windows ,以及越來(lái)越多的嵌入式平臺(tái)。


由于大部分應(yīng)用軟件最終都需要和操作系統(tǒng)打交道,所以用來(lái)開(kāi)發(fā)應(yīng)用軟件的語(yǔ)言,絕大部分也需要利用 C 語(yǔ)言完成和操作系統(tǒng)的通訊。這個(gè)世界上絕大部分流行的編程語(yǔ)言,都選擇了用 C 語(yǔ)言來(lái)實(shí)現(xiàn)其編譯器或解釋器,以及基礎(chǔ)部分的運(yùn)行時(shí)庫(kù)。無(wú)論 C 語(yǔ)言設(shè)計(jì)本身有何種缺憾,在今天,它已無(wú)可取代。


到了今天,大部分程序員不再需要逐個(gè)時(shí)間周期的去摳程序的性能。不需要刻意追求速度最快,最節(jié)省系統(tǒng)資源的軟件。不需要寫(xiě)那些和系統(tǒng)內(nèi)核緊密聯(lián)系的程序。但 C 語(yǔ)言在此之外,依然有其重要的應(yīng)用領(lǐng)域。我們可以把它作為對(duì)最終機(jī)器模型的高層次的統(tǒng)一抽象工具,而不必考慮機(jī)器環(huán)境的差異。經(jīng)過(guò) 30 多年的發(fā)展,證明了 C 語(yǔ)言的確是對(duì)經(jīng)典機(jī)器模型的最佳表述。僅僅通過(guò)增加了一個(gè)非常薄的膠合層就得到了一個(gè)清晰簡(jiǎn)潔的設(shè)計(jì)。正是這一點(diǎn),使得 C 語(yǔ)言在計(jì)算機(jī)硬件高速發(fā)展的幾十年中,一直生機(jī)勃勃。


我們?cè)谟懻?C 語(yǔ)言時(shí),其實(shí)不僅僅涉及了 C 語(yǔ)言本身那用三十幾個(gè)保留字構(gòu)成的精簡(jiǎn)的控制結(jié)構(gòu)和簡(jiǎn)約的語(yǔ)言特征。還包括了一套對(duì) # 號(hào)打頭的預(yù)處理部分(尤其是基于文本替換的宏處理),以及某些慣用的源代碼組織方式(例如:所有的接口定義被定義在后綴為 h 的文件中,并通過(guò)預(yù)處理方式替換進(jìn)源代碼),和基本的程序庫(kù)。


這幾部分語(yǔ)言核心之外的部分相對(duì)獨(dú)立。以至于使用 C 語(yǔ)言開(kāi)發(fā)并不一定使用標(biāo)準(zhǔn)化的那些東西。C 語(yǔ)言對(duì)運(yùn)行時(shí)環(huán)境的依賴(lài)是非常小的。


而編譯預(yù)處理器又使得語(yǔ)言富有彈性,甚至可以寫(xiě)出違背 C 語(yǔ)言哲學(xué)的代碼。著名的 IOCCC 大賽展示了許多常人無(wú)法理解的 C 代碼。但實(shí)際上,C 語(yǔ)言主張代碼清晰,表里如一。開(kāi)發(fā)者和維護(hù)者都能很容易的預(yù)測(cè)每一行代碼背后的行為。避免存在一些陰暗的角落藏著一些罕見(jiàn)的用法導(dǎo)致程序運(yùn)行時(shí)出現(xiàn)詭異的行為。C 語(yǔ)言在發(fā)展過(guò)程中一直堅(jiān)持著最小意外原則。而這一點(diǎn),正是 C 語(yǔ)言的一個(gè)著名發(fā)展分支 C++ 所偏離的東西。


C 語(yǔ)言并不是絕對(duì)意義上最快的語(yǔ)言。但是它的效率非常好,在切合大部分機(jī)器模型并給出統(tǒng)一抽象的基礎(chǔ)上,幾乎沒(méi)有其它語(yǔ)言做的更好了。這也是 C 語(yǔ)言哲學(xué)的一部分:在統(tǒng)一硬件抽象模型的基礎(chǔ)上,盡可能的利用所在硬件環(huán)境的一切資源。有時(shí)候,C 語(yǔ)言程序員會(huì)走向某種極端。追求語(yǔ)言細(xì)節(jié)的優(yōu)化,覺(jué)得某種代碼的組織方式會(huì)比另一種方式更高效。但幾乎總是錯(cuò)的。優(yōu)化取決于對(duì)具體硬件的理解,以及對(duì)編譯器如何翻譯這些代碼的了解。但這正是設(shè)計(jì) C 語(yǔ)言想避免的東西。我們不必去爭(zhēng)論在語(yǔ)句級(jí)上每行代碼精確開(kāi)銷(xiāo)的優(yōu)劣。


同時(shí),C 語(yǔ)言的另一設(shè)計(jì)哲學(xué)就是讓每行 C 代碼盡量準(zhǔn)確的對(duì)應(yīng)相當(dāng)數(shù)量的目標(biāo)機(jī)器碼。這使得程序員可以更為容易的理解程序的運(yùn)行過(guò)程。讓程序員腦海里可以實(shí)時(shí)地做一個(gè)源代碼到最終控制流程的映射?;谶@個(gè)思想,C 語(yǔ)言一直沒(méi)有增加對(duì)結(jié)構(gòu)進(jìn)行運(yùn)算的操作符(而 C++ 中把類(lèi)或結(jié)構(gòu)模擬成原生類(lèi)型的做法相當(dāng)普遍)。甚至于 inline 關(guān)鍵字也遲遲沒(méi)有被標(biāo)準(zhǔn)化(inline 出現(xiàn)在 C99 標(biāo)準(zhǔn)中,而這個(gè)最新的 C 語(yǔ)言標(biāo)準(zhǔn)并沒(méi)有被廣泛接受),正是因?yàn)樗撤N程度破壞了這一點(diǎn)。


C 語(yǔ)言在堅(jiān)持以上幾點(diǎn)理念時(shí),并非突出某個(gè)方面(比如追求性能),而是同時(shí)兼顧的。


C 語(yǔ)言并不是這個(gè)世界上唯一的編程語(yǔ)言,可惜的是,不是所有程序員都認(rèn)識(shí)到了這點(diǎn)。對(duì)于把 C 語(yǔ)言作為自己唯一開(kāi)發(fā)語(yǔ)言的程序員來(lái)說(shuō),很有必要開(kāi)拓自己的眼界,這樣反過(guò)來(lái)才能更為清晰的理解 C 語(yǔ)言的內(nèi)在精神。并不是說(shuō),某某語(yǔ)言本身是用 C 語(yǔ)言來(lái)實(shí)現(xiàn),那么 C 語(yǔ)言就可以以同樣的方式,解決那種語(yǔ)言解決的問(wèn)題(甚至更為高效)。一些 C 語(yǔ)言中的概念,到了另一種語(yǔ)言中,很可能用完全不同的方式展現(xiàn)出來(lái)。正如自然語(yǔ)言會(huì)影響人的思維方式一樣,編程語(yǔ)言一樣會(huì)影響人對(duì)某種算法的編碼形式。在 C 里,我們總以為某些寫(xiě)法是自然而然的,但換了種語(yǔ)言卻很可能并不盡然。


無(wú)論如何 C 語(yǔ)言的語(yǔ)法和設(shè)計(jì)影響了許多其它語(yǔ)言。最為徹底的是 C++ 。以及大多數(shù)程序員都能叫的出名字的一些流行語(yǔ)言:Java , PHP ,Javascript,Perl ,C#,D,Objective-C 等等。 這些給人造成一種錯(cuò)覺(jué),新的語(yǔ)言取代了舊的,對(duì)老的語(yǔ)言做了改良和完善。最廣泛傳播的觀點(diǎn)是,C++ 是 C 的一個(gè)超集,它能做所有 C 能做的所有事情,且能做的更好。持有這種觀點(diǎn)的 C++ 程序員們甚至向把已有的各種 C 代碼用 C++ 重新實(shí)現(xiàn)。但實(shí)際上,C 和 C++ 更應(yīng)該被看成是相互平等的存在。C++ 更像是一種借用了幾乎全部 C 語(yǔ)法(但還是有細(xì)微差異)的全新語(yǔ)言。它們?cè)诤芏喾矫娑加性O(shè)計(jì)理念上的差異。C++ 企圖完全兼容 C 的語(yǔ)法卻不想完全繼承 C 語(yǔ)言的理念,這使它背負(fù)了巨大的包袱。而 C 的另一個(gè)繼任者:Objective-C ,拋棄了一些東西,則顯得清爽一些。


回顧 C++ 出現(xiàn)的時(shí)代背景在于把面向?qū)ο螽?dāng)成解決復(fù)雜問(wèn)題的“銀彈”的年代。這使得 C++ 在發(fā)明之初,迅速的占領(lǐng)了大量原本是 C 語(yǔ)言的市場(chǎng),甚至被看成是 C 語(yǔ)言的替代品。但 C++ 的擁躉們并沒(méi)有等到這一天。歷史證明,面向?qū)ο笠膊皇恰般y彈”、最近十年,C++ 的粉絲們從 C++ 語(yǔ)言的犄角旮旯里挖掘出來(lái)的各種武器,讓 C++ 語(yǔ)言變成了包含多種編程范式的巨無(wú)霸。卻并沒(méi)有讓解決問(wèn)題變得更容易。這并不完全是語(yǔ)言的問(wèn)題,可能有很大程度上是面向?qū)ο蟮乳_(kāi)發(fā)方法本身的問(wèn)題。這也證明了 C 語(yǔ)言保持自身的簡(jiǎn)潔正是其生機(jī)昂然的源泉。


和浩如煙海的 C++ 書(shū)籍相比較。如果你已經(jīng)是程序員,但還不了解 C 語(yǔ)言的話(huà)。學(xué)習(xí) C 語(yǔ)言,只需要讀一本書(shū),而這本書(shū)沒(méi)有第二選擇,就是經(jīng)典的《The C Programming Language》(K&R)。薄薄的一本就講透了語(yǔ)言的方方面面??上У氖?,C 語(yǔ)言過(guò)于注重對(duì)機(jī)器模型的抽象,并不適合用來(lái)程序員入門(mén)。尤其是在國(guó)內(nèi)的教材市場(chǎng),充斥著大量糟糕的 C 語(yǔ)言教材。在這些拙劣的教材中,甚至把開(kāi)發(fā)工具(比如特定的 C 語(yǔ)言開(kāi)發(fā)集成環(huán)境)和特定的硬件環(huán)境(甚至是過(guò)時(shí)的 8086 內(nèi)存模型)與語(yǔ)言教學(xué)混為一談。


對(duì)于 C 語(yǔ)言不是母語(yǔ)的程序員來(lái)說(shuō),有充分的理由去學(xué)習(xí)一下 C 語(yǔ)言。那是低投入,高產(chǎn)出的。它會(huì)使你學(xué)會(huì)在硬件層次上思考問(wèn)題(這或許對(duì)你是一個(gè)新的思維角度)。而且 C 語(yǔ)言已經(jīng)非常穩(wěn)定,不會(huì)再有(它本身也不希望有)大的變化,不用擔(dān)心學(xué)到的知識(shí)會(huì)過(guò)時(shí)。C 語(yǔ)言在 1990 年制訂出一個(gè)現(xiàn)在通行的標(biāo)準(zhǔn)( C90 )以來(lái),在 C 的主流開(kāi)發(fā)社區(qū)中幾乎沒(méi)有變過(guò)了。雖然,從 1999 年開(kāi)始,C 語(yǔ)言委員會(huì)幾經(jīng)修訂 C 語(yǔ)言的新標(biāo)準(zhǔn)( C99 ),但似乎并不被廣泛接受。雖然有很大程度上,這是源于世界上最大的 C/C++ 商業(yè)編譯器提供商微軟對(duì)其不感興趣??稍陂_(kāi)源界,即使有 GNU C 對(duì) C 語(yǔ)言新標(biāo)準(zhǔn)的不斷推動(dòng),那些實(shí)際用 C 語(yǔ)言做開(kāi)發(fā)的大佬們還是紛紛表示,新的標(biāo)準(zhǔn)還不是很成熟。新的特性也不是特別有必要。


筆者用 C99 開(kāi)發(fā)有一些年頭,但也只使用了其中一個(gè)子集,不太敢在正式項(xiàng)目中完全推廣。至于 C 語(yǔ)言近年來(lái)的發(fā)展,我個(gè)人比較欣賞蘋(píng)果公司對(duì) C 語(yǔ)言添加的 blocks 擴(kuò)展以用來(lái)實(shí)現(xiàn) closure 。但并不看好這些新特性會(huì)迅速融入 C 語(yǔ)言社區(qū)。


C 語(yǔ)言從語(yǔ)言角度上講,最大缺陷在于要求程序員自己去做內(nèi)存管理。用 C 語(yǔ)言去處理復(fù)雜的數(shù)據(jù)結(jié)構(gòu),程序員大部分的時(shí)間都花在了這上面,并且滋生了無(wú)數(shù) bug 。調(diào)試 C 程序變成了一項(xiàng)獨(dú)立于編寫(xiě) C 程序的技能。防止緩沖區(qū)溢出、防止數(shù)據(jù)讀寫(xiě)越界、正確的動(dòng)態(tài)回收內(nèi)存、避免懸空指針,這些在大部分語(yǔ)言看起來(lái)不可思議的關(guān)注點(diǎn),在 C 語(yǔ)言程序員眼里變得稀松平常。甚至是衡量 C 程序員技能經(jīng)驗(yàn)水平的重要標(biāo)志??梢?,這些和具體問(wèn)題的解決過(guò)程無(wú)關(guān)。


也有人試圖在 C 語(yǔ)言層面解決這個(gè)問(wèn)題,例如以庫(kù)形式提供垃圾回收的機(jī)制(筆者也曾做過(guò)類(lèi)似嘗試)。但 C 語(yǔ)言本身的設(shè)計(jì)使它無(wú)法成為一個(gè)完美的解決方案。同樣的問(wèn)題也存在于 C++ ?,F(xiàn)在看來(lái),不對(duì)語(yǔ)言做大的改造,很難回避??筛脑毂旧碛诌`背了 C 語(yǔ)言一貫的哲學(xué)。C 語(yǔ)言的發(fā)明人之一的 Ken Thompson 近年來(lái)參與了新的 Go 語(yǔ)言的設(shè)計(jì)和實(shí)現(xiàn),可以看成從另一角度對(duì)新的程序開(kāi)發(fā)語(yǔ)言的嘗試,可那已經(jīng)不是 C 。


這個(gè)問(wèn)題在一定程度上也促使了 java 的誕生。Java 采用了虛擬機(jī)和字節(jié)碼的方式改造了底層的機(jī)器模型。并在底層模型的基礎(chǔ)上加入了垃圾回收機(jī)制。并在語(yǔ)言層面取消了指針。在 C 語(yǔ)言的原生地,也有更多的動(dòng)態(tài)(腳本)語(yǔ)言出現(xiàn)。先是有 awk 這樣的簡(jiǎn)易語(yǔ)言,后有 perl ,再是 python 等的流行。在 Unix 風(fēng)格下,程序員傾向于為特定領(lǐng)域設(shè)計(jì)特定的語(yǔ)言。C 和 Unix 的設(shè)計(jì)哲學(xué)是一體的。它們都鼓勵(lì)清晰的模塊化設(shè)計(jì)。讓模塊之間獨(dú)立,再用薄的膠合層聯(lián)系起來(lái)。腳本語(yǔ)言在現(xiàn)代類(lèi) Unix 系統(tǒng)上大量出現(xiàn),并充當(dāng)這種粘合工作就是一種發(fā)展必然。而原本的充當(dāng)粘合部分的腳本語(yǔ)言,也逐步發(fā)展起來(lái),遠(yuǎn)遠(yuǎn)超出腳本的用途范疇。做為程序員,尤其是 C 程序員,必須對(duì)它們有所了解并掌握其中的一些,才能適應(yīng)現(xiàn)代的挑戰(zhàn)。


我們不應(yīng)該指望一門(mén)語(yǔ)言解決所有的問(wèn)題。可至于 C 語(yǔ)言本身,它將在很長(zhǎng)的一段時(shí)間,帶著它的優(yōu)雅和缺陷,繼續(xù)扮演它在計(jì)算機(jī)世界中重要的角色。

【C++避坑相關(guān)】云風(fēng)的BLOG:C語(yǔ)言的前世今生的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
长丰县| 天峨县| 达拉特旗| 巴彦县| 鹤山市| 尼勒克县| 津南区| 沅江市| 玉溪市| 烟台市| 冕宁县| 远安县| 惠水县| 济阳县| 临朐县| 瑞昌市| 吉安县| 绩溪县| 黄山市| 古田县| 桐城市| 白城市| 中江县| 抚顺市| 壤塘县| 杭锦后旗| 屯留县| 兴文县| 壶关县| 临城县| 湛江市| 荆州市| 桦川县| 青海省| 勃利县| 淮南市| 图们市| 旬邑县| 邢台县| 扎囊县| 屯门区|