當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 21ic電子網(wǎng)
[導(dǎo)讀]文/付斌 C語(yǔ)言作為一個(gè)人盡皆知的語(yǔ)言,甚至沒(méi)有學(xué)過(guò)編程語(yǔ)言的人也知道它的大名。經(jīng)歷滄桑歲月的它,已經(jīng)陪伴我們走過(guò)了48個(gè)年頭?;赝?dāng)年,C語(yǔ)言還在襁褓之中…… 貝爾實(shí)驗(yàn)室特別人員獎(jiǎng)、美國(guó)計(jì)算機(jī)協(xié)會(huì)(ACM)的圖靈獎(jiǎng)、漢明勛章、計(jì)算機(jī)先驅(qū)獎(jiǎng)、計(jì)算機(jī)歷

文/付斌


C語(yǔ)言作為一個(gè)人盡皆知的語(yǔ)言,甚至沒(méi)有學(xué)過(guò)編程語(yǔ)言的人也知道它的大名。經(jīng)歷滄桑歲月的它,已經(jīng)陪伴我們走過(guò)了48個(gè)年頭?;赝?dāng)年,C語(yǔ)言還在襁褓之中……


貝爾實(shí)驗(yàn)室特別人員獎(jiǎng)、美國(guó)計(jì)算機(jī)協(xié)會(huì)(ACM)的圖靈獎(jiǎng)、漢明勛章、計(jì)算機(jī)先驅(qū)獎(jiǎng)、計(jì)算機(jī)歷史博物館研究員、哈羅德 · 潘德獎(jiǎng)……這些成就全都出自一人,那就是編程界無(wú)人能超越的傳奇人物也是C語(yǔ)言的創(chuàng)造者——丹尼斯·里奇。


48歲的C語(yǔ)言,背后居然有這樣一段歷史!

C語(yǔ)言之父:丹尼斯·里奇


計(jì)算機(jī)歷史學(xué)家Paul E.Ceruzzi說(shuō):里奇不被人們知道。他的名字一點(diǎn)都不家喻戶曉,但是如果你有一臺(tái)顯微鏡,能在電腦里看到他的作品,你會(huì)發(fā)現(xiàn)處處都是他的作品。


克尼漢也曾如此評(píng)價(jià):“牛頓說(shuō)他是站在巨人的肩膀上,如今,我們都站在里奇的肩膀上?!?/span>

 

01
C語(yǔ)言的輝煌歷史


1941年, 丹尼斯 · 里奇出生在紐約布朗克斯區(qū),父親是是貝爾實(shí)驗(yàn)室的交換系統(tǒng)工程師。里奇從小成績(jī)優(yōu)異,大學(xué)順利進(jìn)入了哈佛,在受父親的影響下,丹尼斯也走上了科學(xué)研究之路。

在哈佛讀書期間,一次偶然的機(jī)會(huì)改變了里奇的一生。里奇參加了哈佛計(jì)算機(jī)系統(tǒng)相關(guān)的講座,從此他開始對(duì)計(jì)算機(jī)瘋狂著迷,不僅專門學(xué)了一期課程。

當(dāng)時(shí)的里奇是一個(gè)主修物理的學(xué)生,因?yàn)閷?duì)計(jì)算機(jī)處理的理論和實(shí)際問(wèn)題十分著迷,他在畢業(yè)論文中大部分和計(jì)算機(jī)理論有關(guān)(遞歸函數(shù)的層次),這還遠(yuǎn)遠(yuǎn)不夠,里奇開始花更多的精力在實(shí)踐上面。

48歲的C語(yǔ)言,背后居然有這樣一段歷史!

在那個(gè)時(shí)代,大部分計(jì)算機(jī)體積十分龐大,占用了整個(gè)房間并且還只能進(jìn)行有限的撥入訪問(wèn),因此攻克小型臺(tái)式計(jì)算機(jī)是當(dāng)時(shí)的工程師們的目標(biāo),可是這些計(jì)算機(jī)沒(méi)有易于使用的操作系統(tǒng),于是里奇決定自己做一個(gè)。

這一決定立即得到了麻省理工學(xué)院Honeywell和General Electric的支持。里奇負(fù)責(zé)多道處理機(jī)BCPL語(yǔ)言和GE650的編譯器,它們都是屬于GECOS系統(tǒng)的。同時(shí),他還寫了ALTRAN語(yǔ)言的代數(shù)編譯器,那是符號(hào)計(jì)算機(jī)的一種語(yǔ)言和系統(tǒng)。

經(jīng)過(guò)這個(gè)項(xiàng)目后,里奇毅然決然的放棄了本專業(yè)物理學(xué),并決定將計(jì)算機(jī)作為他的事業(yè)。1967年,他加入了貝爾實(shí)驗(yàn)室(Bell Labs)。

在加入貝爾實(shí)驗(yàn)室后,里奇開始和實(shí)驗(yàn)室的一位名為Ken Thompson(肯·湯普森)的成員合作。這位Ken Thompson也是對(duì)Ritchie 職業(yè)生涯影響很大的人。

48歲的C語(yǔ)言,背后居然有這樣一段歷史!
Thompson和Ritchie

20世紀(jì)70年代, 湯普森和里奇在研究如何讓早期小型機(jī)變得越來(lái)越受歡迎。他們認(rèn)為,所需要的是各種計(jì)算機(jī)之間更簡(jiǎn)單,更可行的交互。因?yàn)槔闲陀?jì)算機(jī)要求用戶使用操作系統(tǒng)來(lái)復(fù)制,刪除,編輯和打印數(shù)據(jù)文件,將數(shù)據(jù)從磁盤移動(dòng)到屏幕到打印機(jī)并返回磁盤進(jìn)行存儲(chǔ)。除了少數(shù)專家之外,一旦沒(méi)有了操作系統(tǒng),任何人都無(wú)法訪問(wèn)計(jì)算機(jī)。

為此,他們花了幾個(gè)月的時(shí)間來(lái)提出解決方案,他們完成這個(gè)解決方案時(shí)已經(jīng)編寫好了影響他們一生的Unix操作系統(tǒng)。

里奇在1999年的一次采訪中表示:“我覺得Linux發(fā)展的現(xiàn)象令人高興,雖然工作站和大型計(jì)算機(jī)廠商也在提供不同種類的BSD系統(tǒng),但是在Unix的直接派生品中,Linux應(yīng)該是最健全的了?!?/span>

48歲的C語(yǔ)言,背后居然有這樣一段歷史!
 
C++的開發(fā)者和設(shè)計(jì)師比雅尼 · 斯特勞斯普曾說(shuō):“假如里奇決定那十年將他的精力花費(fèi)在稀奇古怪的數(shù)學(xué)上,那么Unix將胎死腹中?!?/span>

事實(shí)上,里奇加入貝爾實(shí)驗(yàn)室后,發(fā)展了C語(yǔ)言和Unix系統(tǒng),這在電腦工業(yè)史上都占據(jù)重要的席位。C語(yǔ)言在發(fā)展軟件和操作系統(tǒng)時(shí)是一個(gè)非常常用的電腦語(yǔ)言,而現(xiàn)在的編程語(yǔ)言比如C++、C#、Obijective-C、Java和JavaScript擁有極大的影響。

48歲的C語(yǔ)言,背后居然有這樣一段歷史!
Univac I

為了在PDP-11電腦上運(yùn)行的Unix系統(tǒng),1972年,美國(guó)貝爾實(shí)驗(yàn)室的丹尼斯·麥卡利斯泰爾·里奇(Dennis MacAlistair Ritchie)在B語(yǔ)言的基礎(chǔ)上的設(shè)計(jì)了C語(yǔ)言。

C語(yǔ)言最初嘗試通過(guò)向B語(yǔ)言中增加數(shù)據(jù)類型的想法來(lái)處理那些不同類型的數(shù)據(jù)。和大多數(shù)編程語(yǔ)言一樣,在C語(yǔ)言中,每個(gè)對(duì)象都有一個(gè)類型以及一個(gè)值;類型決定了可用于值的操作的含義,以及對(duì)象占用的存儲(chǔ)空間大小。

1973年, 肯·湯普遜(Ken Thompson)和里奇合作把Unix的90%以上用C語(yǔ)言改寫,即Unix第五版。這是C語(yǔ)言第一次應(yīng)用在操作系統(tǒng)的核心編寫上。隨著Unix的日益廣泛使用,C語(yǔ)言也迅速得到推廣。

Unix最開始是用匯編語(yǔ)言編寫的,里奇和湯普森重寫了之后于1974年在ACM上發(fā)表,正式向外界披露Unix系統(tǒng)。

隨著Unix的發(fā)展,C語(yǔ)言也得到了不斷地完善。C語(yǔ)言是一門面向過(guò)程的、抽象化的編程語(yǔ)言,廣泛應(yīng)用于底層開發(fā)。C語(yǔ)言能用簡(jiǎn)易的方式編譯、處理低級(jí)存儲(chǔ)器。如此簡(jiǎn)單,簡(jiǎn)潔,幾乎每個(gè)計(jì)算機(jī)制造商都轉(zhuǎn)向了它,且效果顯著。

為了利于C語(yǔ)言的全面推廣,很多專家學(xué)者和硬件產(chǎn)商聯(lián)合組成了C語(yǔ)言標(biāo)準(zhǔn)委員會(huì)。于是在1989年,第一個(gè)完備的C標(biāo)準(zhǔn)誕生了,簡(jiǎn)稱“C89”,截至目前,最新的C語(yǔ)言標(biāo)準(zhǔn)為2017年發(fā)布的“C17”。

盡管C語(yǔ)言已經(jīng)如日朝天,但里奇的職業(yè)生涯并沒(méi)沒(méi)有因此而結(jié)束,他于1990年成為朗訊科技計(jì)算技術(shù)研究部門的領(lǐng)導(dǎo)者。在該職位上,他編寫了應(yīng)用程序并管理已發(fā)布的操作系統(tǒng)的增長(zhǎng)。

1975年 ,C語(yǔ)言開始移植到其他機(jī)器上使用。史蒂芬·強(qiáng)生(Stephen C.Johnson)實(shí)現(xiàn)了一套“可移植編譯器”,這套編譯器修改起來(lái)相對(duì)容易,并且可以為不同的機(jī)器生成代碼。從那時(shí)起,C語(yǔ)言在大多數(shù)計(jì)算機(jī)上被使用,從最小的微型計(jì)算機(jī)到CRAY-2超級(jí)計(jì)算機(jī)。C語(yǔ)言很規(guī)范,即使沒(méi)有一份正式的標(biāo)準(zhǔn),也可以寫出C程序,這些程序無(wú)需修改就可以運(yùn)行在任何支持C語(yǔ)言的最小運(yùn)行時(shí)環(huán)境的計(jì)算機(jī)上。
1978年, 丹尼斯·里奇和布萊恩·柯林漢(Brian Wilson Kernighan)合作出版了《C程序設(shè)計(jì)語(yǔ)言》的第一版。書中介紹的C語(yǔ)言標(biāo)準(zhǔn)也被C語(yǔ)言程序員稱作“K&R C”(柯里C),第二版的書中也包含了一些ANSI C的標(biāo)準(zhǔn)。即使在后來(lái)ANSI C標(biāo)準(zhǔn)被提出的許多年后,K&R C仍然是許多編譯器的最低標(biāo)準(zhǔn)要求,許多老舊的編譯仍然運(yùn)行K&R C的標(biāo)準(zhǔn)。

1978年以后, C語(yǔ)言先后移植到大,中,小和微型計(jì)算機(jī)上。C語(yǔ)言便很快風(fēng)靡全球,成為世界上應(yīng)用最為廣泛的程序設(shè)計(jì)高級(jí)語(yǔ)言。

C最初在小型機(jī)器上實(shí)現(xiàn),并且繼承了一系列小語(yǔ)種編程語(yǔ)言的特點(diǎn);與功能相比,C的設(shè)計(jì)者更傾向于簡(jiǎn)單和優(yōu)雅。此外,從一開始,C語(yǔ)言就是為系統(tǒng)級(jí)編程而設(shè)計(jì),程序的運(yùn)行效率至關(guān)重要,因此,C語(yǔ)言與真實(shí)機(jī)器能力的良好匹配也就不足為奇。例如,C語(yǔ)言為典型硬件所直接支持的對(duì)象:字符,整數(shù)(也許有多種大?。?,以及浮點(diǎn)數(shù)(同樣可能有多種大?。┨峁┝讼鄳?yīng)的基本數(shù)據(jù)類型。

1983年, 因?yàn)榘l(fā)展了通用操作系統(tǒng)理論并實(shí)現(xiàn)了UNIX操作系統(tǒng),里奇和湯普森二人一起獲得了圖靈獎(jiǎng)。里奇的圖靈獎(jiǎng)?wù)撐念}目為《對(duì)軟件研究的反思》。

48歲的C語(yǔ)言,背后居然有這樣一段歷史!

1989年, C語(yǔ)言被美國(guó)國(guó)家標(biāo)準(zhǔn)協(xié)會(huì)(ANSI)標(biāo)準(zhǔn)化,編號(hào)為ANSI X3.159-1989。這個(gè)版本又稱為C89。標(biāo)準(zhǔn)化的一個(gè)目的是擴(kuò)展K&R C,增加了一些新特性。

1990年, 國(guó)際標(biāo)準(zhǔn)化組織(ISO)成立 ISO/IEC JTC1/SC22/WG14 工作組,來(lái)規(guī)定國(guó)際標(biāo)準(zhǔn)的C語(yǔ)言,通過(guò)對(duì)ANSI標(biāo)準(zhǔn)的少量修改,最終制定了 ISO 9899:1990,又稱為C90。隨后,ANSI亦接受國(guó)際標(biāo)準(zhǔn)C,并不再發(fā)展新的C標(biāo)準(zhǔn)。

在ANSI的標(biāo)準(zhǔn)確立后,C語(yǔ)言的規(guī)范在一段時(shí)間內(nèi)沒(méi)有大的變動(dòng),然而C++在自己的標(biāo)準(zhǔn)化創(chuàng)建過(guò)程中繼續(xù)發(fā)展壯大。《標(biāo)準(zhǔn)修正案一》在1994年為C語(yǔ)言創(chuàng)建了一個(gè)新標(biāo)準(zhǔn),但是只修正了一些C89標(biāo)準(zhǔn)中的細(xì)節(jié)和增加更多更廣的國(guó)際字符集支持。不過(guò),這個(gè)標(biāo)準(zhǔn)引出了1999年ISO 9899:1999的發(fā)表。它通常被稱為C99。C99被ANSI于2000年3月采用。

1990年, 童年,二人因“創(chuàng)造UNIX操作系統(tǒng)和C程序設(shè)計(jì)語(yǔ)言”而獲得了IEEE頒發(fā)的IEEE漢明獎(jiǎng),1997年獲計(jì)算機(jī)歷史博物館研究員獎(jiǎng),2005年,美國(guó)工業(yè)研究院授予里奇 IRI成就獎(jiǎng),以表彰他對(duì)計(jì)算機(jī)科學(xué)技術(shù)做出的貢獻(xiàn),以及UNIX操作系統(tǒng)對(duì)社會(huì)的廣泛影響。2011年,里奇和湯普森二人共同獲得了日本國(guó)際獎(jiǎng)。

但在2011年10月12日, 里奇離開了這個(gè)世界,離開了他付出一生的C語(yǔ)言和Unix世界,享年70歲,去往另一個(gè)地方開始了他的另一場(chǎng)旅行……
 
2011年12月8日, ISO正式發(fā)布了新的C語(yǔ)言的新標(biāo)準(zhǔn)C11,之前被稱為C1X,官方名稱為ISO/IEC 9899:2011。新的標(biāo)準(zhǔn)提高了對(duì)C++的兼容性,并增加了一些新的特性。這些新特性包括泛型宏、多線程、帶邊界檢查的函數(shù)、匿名結(jié)構(gòu)等。

C18(以前稱為C17)最新標(biāo)準(zhǔn)的C語(yǔ)言編程,發(fā)表在2018年六月代替C11。C18在沒(méi)有引入新語(yǔ)言功能的情況下解決了C11中的缺陷。

由于C具有語(yǔ)言簡(jiǎn)潔,緊湊,使用方便靈活。運(yùn)算符,數(shù)據(jù)類型豐富;具有結(jié)構(gòu)化的控制語(yǔ)句,語(yǔ)法限制不太嚴(yán)格,程序設(shè)計(jì)自由度大;C語(yǔ)言允許直接訪問(wèn)物理地址,能進(jìn)行位操作,能實(shí)現(xiàn)匯編語(yǔ)言的大部分功能,可以直接對(duì)硬件進(jìn)行操作;生成目標(biāo)代碼質(zhì)量高。執(zhí)行效率高,等特點(diǎn)。所以,盡管C語(yǔ)言發(fā)布至今過(guò)去很多年,但現(xiàn)在C語(yǔ)言仍然在一些領(lǐng)域流行。

當(dāng)前,C語(yǔ)言編譯器普遍存在于各種不同的操作系統(tǒng)中,例如Microsoft Windows、macOS、Linux、Unix等。C語(yǔ)言的設(shè)計(jì)影響了眾多后來(lái)的編程語(yǔ)言,例如C++、Objective-C、Java、C#等。

02
C語(yǔ)言到底能做什么


從計(jì)算機(jī)發(fā)展以來(lái),編程語(yǔ)言也是層出不窮,但是無(wú)論多少“新人”翻涌而出,都無(wú)法改變C語(yǔ)言在編程界中德高望重的地位。

C語(yǔ)言到底能做了多少事情?大家經(jīng)常說(shuō)的Linux操作系統(tǒng)的內(nèi)核都是C語(yǔ)言寫的,對(duì)應(yīng)的很多嵌入式內(nèi)核驅(qū)動(dòng)也跑不出C語(yǔ)言范疇,包括大家常用的手機(jī),機(jī)頂盒,電視機(jī)底層硬件驅(qū)動(dòng)基本上都是C語(yǔ)言完成。

可以毫不夸張的說(shuō),如果沒(méi)有C語(yǔ)言,就沒(méi)有微軟的Windows 10 和 Surface Book,也沒(méi)有安卓智能手機(jī),更沒(méi)有喬布斯創(chuàng)造的蘋果帝國(guó)各種產(chǎn)品MAC、iPad。

C語(yǔ)言最牛的地方,幾乎現(xiàn)在所有的上層語(yǔ)言的底層語(yǔ)言絕大部分都是C語(yǔ)言大哥做嫁衣給鋪墊完成。深刻理解上層語(yǔ)言底層實(shí)現(xiàn),離不開C語(yǔ)言。而且很多大學(xué)的計(jì)算機(jī)專業(yè)都會(huì)把C語(yǔ)言作為學(xué)生入門編程的第一步。因此,很多程序員都把學(xué)習(xí)C語(yǔ)言當(dāng)成程序生涯中最基本的事。
48歲的C語(yǔ)言,背后居然有這樣一段歷史!

而C語(yǔ)言為什么能成為最重要、最流行的編程語(yǔ)言之一,具體來(lái)說(shuō)因?yàn)橐韵略颍?/span>

設(shè)計(jì)特性
C語(yǔ)言融合了計(jì)算機(jī)科學(xué)理論和實(shí)踐的控制特性。C 語(yǔ)言的設(shè)計(jì)理念讓用戶能輕松地完成自頂向下的規(guī)劃、結(jié)構(gòu)化編程和模塊化設(shè)計(jì)。因此,用 C 語(yǔ)言編寫的程序更易懂、更可靠。

高效性

在設(shè)計(jì)上,它充分利用了當(dāng)前計(jì)算機(jī)的優(yōu)勢(shì),因此 C 程序相對(duì)更緊湊,而且運(yùn)行速度很快

可移植性 

C 是可移植的語(yǔ)言。這意味著,在一種系統(tǒng)中編寫的 C 程序稍作修改或不修改就能在其他系統(tǒng)運(yùn)行。如需修改,也只需簡(jiǎn)單更改主程序頭文件中的少許項(xiàng)即可。

強(qiáng)大而靈活

C 語(yǔ)言功能強(qiáng)大且靈活。功能強(qiáng)大且靈活的 UNIX 操作系統(tǒng),大部分是用 C 語(yǔ)言寫的。C 程序還可以用于解決物理學(xué)和工程學(xué)的問(wèn)題,甚至可用于制作電影的動(dòng)畫特效。

面向程序員 

C 語(yǔ)言是為了滿足程序員的需求而設(shè)計(jì)的,程序員利用 C 可以訪問(wèn)硬件、操控內(nèi)存中的位。C 語(yǔ)言有豐富的運(yùn)算符,能讓程序員簡(jiǎn)潔地表達(dá)自己的意圖。


03
C語(yǔ)言是怎么來(lái)的


C語(yǔ)言是很低級(jí)的語(yǔ)言,很多方面都近似于匯編語(yǔ)言, 在《Intel 32位匯編語(yǔ)言程序設(shè)計(jì)》一書中,甚至介紹了手工把簡(jiǎn)單的C語(yǔ)言翻譯成匯編的方法。對(duì)于編譯器這種系統(tǒng)軟件,用C語(yǔ)言來(lái)編寫是很自然不過(guò)的,即使是像Python這樣的高級(jí)語(yǔ)言依然在底層依賴于C語(yǔ)言(舉Python的例子是因?yàn)镮ntel的黑客正在嘗試讓

Python不需要操作系統(tǒng)就能運(yùn)行——實(shí)際上是免去了BIOS上的一次性C代碼)。
現(xiàn)在的學(xué)生,學(xué)過(guò)編譯原理后,只要有點(diǎn)編程能力的都可以實(shí)現(xiàn)一個(gè)功能簡(jiǎn)單的類C語(yǔ)言編譯器。

可是問(wèn)題來(lái)了,不知道你有沒(méi)有想過(guò),大家都用C語(yǔ)言或基于C語(yǔ)言的語(yǔ)言來(lái)寫編譯器,
那么世界上第一個(gè)C語(yǔ)言編譯器又是怎么編寫的呢? 這不是一個(gè)“雞和蛋”的問(wèn)題……


上文也有提到第一個(gè)C語(yǔ)言編譯器的原型完全可能是用B語(yǔ)言或者混合B語(yǔ)言與PDP匯編語(yǔ)言編寫的。

早期的C語(yǔ)言編譯器采取了一個(gè)取巧的辦法:
先用匯編語(yǔ)言編寫一個(gè)C語(yǔ)言的一個(gè)子集的編譯器,再通過(guò)這個(gè)子集去遞推完成完整的C語(yǔ)言編譯器。詳細(xì)的過(guò)程如下:


先創(chuàng)造一個(gè)只有C語(yǔ)言最基本功能的子集,記作C0語(yǔ)言,C0語(yǔ)言已經(jīng)足夠簡(jiǎn)單了,可以直接用匯編語(yǔ)言編寫出C0的編譯器。依靠C0已有的功能,設(shè)計(jì)比C0復(fù)雜,但仍然不完整的C語(yǔ)言的又一個(gè)子集C1語(yǔ)言,其中C0屬于C1,C1屬于C,用C0開發(fā)出C1語(yǔ)言的編譯器。在C1的基礎(chǔ)上設(shè)計(jì)C語(yǔ)言的又一個(gè)子集C2語(yǔ)言,C2語(yǔ)言比C1復(fù)雜,但是仍然不是完整的C語(yǔ)言,開發(fā)出C2語(yǔ)言的編譯器……如此直到CN,CN已經(jīng)足夠強(qiáng)大了,這時(shí)候就足夠開發(fā)出完整的C語(yǔ)言編譯器的實(shí)現(xiàn)了。至于這里的N是多少,這取決于你的目標(biāo)語(yǔ)言(這里是C語(yǔ)言)的復(fù)雜程度和程序員的編程能力——簡(jiǎn)單地說(shuō),如果到了某個(gè)子集階段,可以很方便地利用現(xiàn)有功能實(shí)現(xiàn)C語(yǔ)言時(shí),那么你就找到N了。下面的圖說(shuō)明了這個(gè)抽象過(guò)程:

C語(yǔ)言
CN語(yǔ)言
……
C0語(yǔ)言
匯編語(yǔ)言
機(jī)器語(yǔ)言


那么這種大膽的子集簡(jiǎn)化的方法,是怎么實(shí)現(xiàn)的,又有什么理論依據(jù)呢?

先介紹一個(gè)概念, “自編譯”Self-Compile ,也就是對(duì)于某些具有明顯自舉性質(zhì)的強(qiáng)類型(所謂強(qiáng)類型就是程序中的每個(gè)變量必須聲明類型后才能使用, 比如C語(yǔ)言,相反有些腳本語(yǔ)言則根本沒(méi)有類型這一說(shuō)法)編程語(yǔ)言,可以借助它們的一個(gè)有限小子集,通過(guò)有限次數(shù)的遞推來(lái)實(shí)現(xiàn)對(duì)它們自身的表述,這樣的語(yǔ)言有C、Pascal、Ada等等,至于為什么可以自編譯,可以參見清華大學(xué)出版社的《編譯原理》,書中實(shí)現(xiàn)了一個(gè)Pascal的子集的編譯器。

總之,已經(jīng)有計(jì)算機(jī)科學(xué)家證明了,C語(yǔ)言理論上是可以通過(guò)上面說(shuō)的CVM的方法實(shí)現(xiàn)完整的編譯器的,那么實(shí)際上是怎樣做到簡(jiǎn)化的呢?

這張圖是不是有點(diǎn)熟悉?對(duì)了就是在講虛擬機(jī)的時(shí)候見到過(guò),不過(guò)這里是CVM(C Language Virtual Machine),每種語(yǔ)言都是在每個(gè)虛擬層上可以獨(dú)立實(shí)現(xiàn)編譯的,并且除了C語(yǔ)言外,每一層的輸出都將作為下一層的輸入(最后一層的輸出就是應(yīng)用程序了),這和滾雪球是一個(gè)道理。用手(匯編語(yǔ)言)把一小把雪結(jié)合在一起,一點(diǎn)點(diǎn)地滾下去就形成了一個(gè)大雪球,這大概就是所謂的0生1,1生C,C生萬(wàn)物吧?


下面是C99的關(guān)鍵字:


   
  1. autoenum restrict unsigned

  2. breakexternreturnvoid

  3. casefloatshortvolatile

  4. charforsignedwhile

  5. constgotosizeof_Bool

  6. continueifstatic_Complex

  7. defaultinlinestruct_Imaginary

  8. dointswitch

  9. doublelongtypedef

  10. elseregisterunion

  11. //共37個(gè)


仔細(xì)看看,其實(shí)其中有很多關(guān)鍵字是為了幫助編譯器進(jìn)行優(yōu)化的,還有一些是用來(lái)限定變量、函數(shù)的作用域、鏈接性或者生存周期(函數(shù)沒(méi)有)的,這些在編譯器實(shí)現(xiàn)的早期根本不必加上,于是可以去掉auto, restrict, extern, volatile, const, sizeof, static, inline, register, typedef,這樣就形成了C的子集,C3語(yǔ)言,C3語(yǔ)言的關(guān)鍵字如下:


   
  1. enumunsigned

  2. breakreturnvoid

  3. casefloatshort

  4. charforsignedwhile

  5. goto_Bool

  6. continueif_Complex

  7. defaultstruct_Imaginary

  8. dointswitch

  9. doublelong

  10. elseunion

  11. //共27個(gè)


再想一想,發(fā)現(xiàn)C3中其實(shí)有很多類型和類型修飾符是沒(méi)有必要一次性都加上去的,比如三種整型,只要實(shí)現(xiàn)int就行了,因此進(jìn)一步去掉這些關(guān)鍵詞,它們是:unsigned, float, short, char(char 是 int), signed, _Bool, _Complex, _Imaginary, long,這樣就形成了我們的C2語(yǔ)言,C2語(yǔ)言關(guān)鍵字如下:

   
  1. enum

  2. breakreturnvoid

  3. case

  4. forwhile

  5. goto

  6. continueif

  7. defaultstruct

  8. dointswitch

  9. double

  10. elseunion

  11. //共18個(gè)


繼續(xù)思考,即使是只有18個(gè)關(guān)鍵字的C2語(yǔ)言,依然有很多高級(jí)的地方,比如基于基本數(shù)據(jù)類型的復(fù)合數(shù)據(jù)結(jié)構(gòu),另外我們的關(guān)鍵字表中是沒(méi)有寫運(yùn)算符的,在C語(yǔ)言中的復(fù)合賦值運(yùn)算符->、運(yùn)算符的++、– 等過(guò)于靈活的表達(dá)方式此時(shí)也可以完全刪除掉,因此可以去掉的關(guān)鍵字有:enum, struct, union,這樣我們可以得到C1語(yǔ)言的關(guān)鍵字:

   
  1. breakreturnvoid

  2. case

  3. forwhile

  4. goto

  5. continueif

  6. default

  7. dointswitch

  8. double

  9. else

  10. //共15個(gè)


接近完美了,不過(guò)最后一步手筆自然要大一點(diǎn)。這個(gè)時(shí)候數(shù)組和指針也要去掉了,另外C1語(yǔ)言其實(shí)仍然有很大的冗雜度,比如控制循環(huán)和分支的都有多種表述方法,其實(shí)都可簡(jiǎn)化成一種,具體的來(lái)說(shuō),循環(huán)語(yǔ)句有while循環(huán),do…while循環(huán)和for循環(huán),只需要保留while循環(huán)就夠了;分支語(yǔ)句又有if…{}, if…{}…else, if…{}…else if…, switch,這四種形式,它們都可以通過(guò)兩個(gè)以上的if…{}來(lái)實(shí)現(xiàn),因此只需要保留if,…{}就夠了。可是再一想,所謂的分支和循環(huán)不過(guò)是條件跳轉(zhuǎn)語(yǔ)句罷了,函數(shù)調(diào)用語(yǔ)句也不過(guò)是一個(gè)壓棧和跳轉(zhuǎn)語(yǔ)句罷了,因此只需要goto(未限制的goto)。因此大膽去掉所有結(jié)構(gòu)化關(guān)鍵字,連函數(shù)也沒(méi)有,得到的C0語(yǔ)言關(guān)鍵字如下:

   
  1. breakvoid

  2. goto

  3. int

  4. double

  5. //共5個(gè)


這已經(jīng)是簡(jiǎn)約的極致了。


只有5個(gè)關(guān)鍵字,已經(jīng)完全可以用匯編語(yǔ)言快速的實(shí)現(xiàn)了。通過(guò)逆向分析我們還原了第一個(gè)C語(yǔ)言編譯器的編寫過(guò)程,也感受到了前輩科學(xué)家們的智慧和勤勞!我們都不過(guò)是巨人肩膀上的灰塵罷了!0生1,1生C,C生萬(wàn)物,實(shí)在巧妙!


參考資料:
【1】丹尼斯 · 里奇百度百科
https://baike.baidu.com/item/%E4%B8%B9%E5%B0%BC%E6%96%AF%C2%B7%E9%87%8C%E5%A5%87
【2】C語(yǔ)言百度百科
https://baike.baidu.com/item/C%E8%AF%AD%E8%A8%80
【3】Unix百度百科
https://baike.baidu.com/item/UNIX
【4】《C Primer Plus第六版》
【5】《第一個(gè)C編譯器是怎樣來(lái)的?》



-END-
免責(zé)聲明:整理文章為傳播相關(guān)技術(shù),版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系刪除

推薦閱讀

48歲的C語(yǔ)言,背后居然有這樣一段歷史!

你和大牛工程師之間到底差了啥?
加入技術(shù)交流群,與高手面對(duì)面 
添加管理員微信
48歲的C語(yǔ)言,背后居然有這樣一段歷史!
加入“中國(guó)電子網(wǎng)微信群”交流

48歲的C語(yǔ)言,背后居然有這樣一段歷史!
具體加群詳情請(qǐng)戳

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!

21ic電子網(wǎng)

掃描二維碼,關(guān)注更多精彩內(nèi)容

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉