C 語(yǔ)言發(fā)展簡(jiǎn)史
下面是我對(duì) 布萊恩·克尼漢Brian Kernighan 的采訪,他(與 丹尼斯·里奇Dennis Ritchie)是《C 程序設(shè)計(jì)語(yǔ)言The C Programming Language》一書(shū)的共同作者,我們談及了 C 語(yǔ)言及其 50 年的歷史。
兩位作者寫(xiě)的最初的 C 語(yǔ)言編程指南,大約是在 1978 年
C 語(yǔ)言將在 2022 年滿 50 歲。然而,盡管它歷史悠久,在許多“流行編程語(yǔ)言”的調(diào)查中,C 語(yǔ)言仍然是“最常用”的編程語(yǔ)言之一。例如,你可以看看 TIOBE 指數(shù),它追蹤不同編程語(yǔ)言的流行程度。許多 Linux 應(yīng)用程序是用 C 語(yǔ)言編寫(xiě)的,例如 GNOME 桌面。
我采訪了 布萊恩·克尼漢Brian Kernighan,以了解更多關(guān)于 C 語(yǔ)言及其歷史他(與 丹尼斯·里奇Dennis Ritchie)是《C 程序設(shè)計(jì)語(yǔ)言The C Programming Language》一書(shū)的共同作者。
C 語(yǔ)言是怎么誕生的呢?
C 語(yǔ)言由一系列旨在進(jìn)行系統(tǒng)編程的語(yǔ)言演變而來(lái),系統(tǒng)編程就是編寫(xiě)像編譯器、匯編器、編輯器以及最終的操作系統(tǒng)這樣的程序。麻省理工學(xué)院有一個(gè)與貝爾實(shí)驗(yàn)室合作的 Multics 項(xiàng)目,它計(jì)劃用一種高級(jí)語(yǔ)言編寫(xiě)系統(tǒng)的所有部分(這在 1965 年那時(shí)候是一個(gè)新想法)。他們打算使用 IBM 的 PL/1,但它非常復(fù)雜,而且承諾的編譯器也沒(méi)有及時(shí)交付。
在與一個(gè)叫做 EPL 的子集(由貝爾實(shí)驗(yàn)室的道格拉斯·麥克羅伊Douglas McIlroy 設(shè)計(jì))進(jìn)行了短暫交流后,Multics 轉(zhuǎn)向了 BCPL,這是一個(gè)由劍橋的 Martin Richards 設(shè)計(jì)和實(shí)現(xiàn)的,更加簡(jiǎn)單和干凈的語(yǔ)言,我記得他當(dāng)時(shí)正在麻省理工學(xué)院訪問(wèn)。當(dāng) 肯·湯普遜Ken Thompson 開(kāi)始研究后來(lái)的 Unix 時(shí),他在 BCPL 的基礎(chǔ)上創(chuàng)造了一種更簡(jiǎn)單的語(yǔ)言,他稱(chēng)之為 B 語(yǔ)言。在 1969 年,他為搭載了第一個(gè) Unix 原型系統(tǒng)的 PDP-7 計(jì)算機(jī)實(shí)現(xiàn)了這種語(yǔ)言。
BCPL 和 B 都是“無(wú)類(lèi)型”語(yǔ)言。也就是說(shuō),它們只有一種數(shù)據(jù)類(lèi)型,即整數(shù)。DEC 公司的 PDP-11 計(jì)算機(jī)大約在 1971 年投入使用,它搭載了第一個(gè)真正的 Unix 系統(tǒng)。PDP-11 支持幾種數(shù)據(jù)類(lèi)型,特別是 8 位字節(jié)和 16 位整數(shù)。因此,一種同樣支持幾種數(shù)據(jù)類(lèi)型的語(yǔ)言是更好的選擇。這就是 C 語(yǔ)言的起源。
C 語(yǔ)言在貝爾實(shí)驗(yàn)室和早期版本的 Unix 中是如何使用的呢?
C 語(yǔ)言最初只在 Unix 上使用,盡管過(guò)了一段時(shí)間,也有了用于其他機(jī)器和操作系統(tǒng)的 C 語(yǔ)言編譯器。大多數(shù)情況下,它被用于系統(tǒng)級(jí)的編程,涵蓋了相當(dāng)多有趣的領(lǐng)域,還有很多用于管理 AT&T 電話網(wǎng)絡(luò)運(yùn)營(yíng)的系統(tǒng)。
在貝爾實(shí)驗(yàn)室用 C 語(yǔ)言編寫(xiě)的最有趣的項(xiàng)目是什么?
可以說(shuō),最有趣、最令人難忘、也是最重要的 C 語(yǔ)言程序就是 Unix 操作系統(tǒng)本身。1971 年 Unix 的第一個(gè)版本是用 PDP-11 匯編語(yǔ)言編寫(xiě)的,但到了第四版,也就是 1973 年左右,我們用 C 語(yǔ)言重寫(xiě)了它。這很關(guān)鍵,因?yàn)檫@意味著操作系統(tǒng)(和它所有的支持軟件)基本上可以通過(guò)重新編譯來(lái)移植到不同類(lèi)型的計(jì)算機(jī)上。雖然在實(shí)踐中并沒(méi)有那么簡(jiǎn)單,但也相差不遠(yuǎn)。
你與丹尼斯·里奇合著了《C 程序設(shè)計(jì)語(yǔ)言》一書(shū)。那本書(shū)是怎么來(lái)的,你和丹尼斯又是如何在書(shū)中合作的呢?
我曾經(jīng)寫(xiě)過(guò)一本肯·湯普遜的 B 語(yǔ)言教程,幫助人們快速上手使用它。當(dāng) C 語(yǔ)言可用時(shí),我將其升級(jí)為 C 語(yǔ)言的教程。過(guò)了一段時(shí)間,我說(shuō)服了丹尼斯,讓他和我一起寫(xiě)一本 C 語(yǔ)言的書(shū)?;旧?,除了系統(tǒng)調(diào)用那章外,大部分的教程材料都是我寫(xiě)的,而丹尼斯已經(jīng)寫(xiě)好了那個(gè)參考手冊(cè),寫(xiě)的非常棒。然后我們反復(fù)修改,使教程部分更加流暢。參考手冊(cè)幾乎保持不變,因?yàn)樗鼜囊婚_(kāi)始就寫(xiě)得很好。這本書(shū)的格式是用 troff 格式器格式的,這是 Unix 上的許多工具之一,我做了大部分的格式化工作。
C 語(yǔ)言什么時(shí)候成為了貝爾實(shí)驗(yàn)室以外的其他程序員用于工作的東西呢?
我真的記不大清了,但我認(rèn)為大概是在最初的五六年里,C 語(yǔ)言主要是跟著 Unix 一起發(fā)展的。隨著其他操作系統(tǒng)上的編譯器的發(fā)展,它開(kāi)始蔓延到 Unix 以外的其他系統(tǒng)。我不記得我們是什么時(shí)候意識(shí)到 C 和 Unix 產(chǎn)生了真正的影響,但應(yīng)該是在 20 世紀(jì) 70 年代中后期。
為什么 C 語(yǔ)言會(huì)成為如此有影響力的編程語(yǔ)言呢?
早期的主要原因是它與 Unix 的聯(lián)系,Unix 在世界上迅速傳播。如果你使用 Unix,你就會(huì)用 C 語(yǔ)言來(lái)編程。后來(lái),C 語(yǔ)言傳播到不一定運(yùn)行 Unix 的計(jì)算機(jī)上,很大程度上是因?yàn)?Steve Johnson 編寫(xiě)了可移植 C 語(yǔ)言編譯器。在工作站領(lǐng)域,比如 昇陽(yáng)微系統(tǒng)(Sun Microsystems)、MIPS(后來(lái)成為 SGI)和其他公司,它們都是因?yàn)?Unix 和 C 語(yǔ)言的結(jié)合而獲得成功。IBM PC 出現(xiàn)得稍晚一些,大約在 1982 年。后來(lái) C 語(yǔ)言成為 MS-DOS 和 Windows 下的標(biāo)準(zhǔn)編程語(yǔ)言之一。今天,大多數(shù)物聯(lián)網(wǎng)(IoT)設(shè)備會(huì)使用 C 語(yǔ)言。
在創(chuàng)建約 50 年后的今天,C 仍然是一種流行的編程語(yǔ)言。為什么它仍然如此受歡迎呢?
我認(rèn)為 C 語(yǔ)言在效率和表現(xiàn)力這兩個(gè)方面達(dá)到了一個(gè)平衡點(diǎn)。在早期,效率真的很重要,因?yàn)榕c我們今天所使用的計(jì)算機(jī)相比,當(dāng)時(shí)的計(jì)算機(jī)速度很慢、內(nèi)存十分有限。C 語(yǔ)言是非常高效的,因?yàn)樗梢员痪幾g成高效的機(jī)器代碼,而且它也足夠簡(jiǎn)單,人們很容易學(xué)會(huì)如何編譯它。同時(shí),它還具有很強(qiáng)的表現(xiàn)力,易于編寫(xiě),并且結(jié)構(gòu)緊湊。至少在我謙虛而正確的觀點(diǎn)中,沒(méi)有任何一種語(yǔ)言能很好地達(dá)到這種境界。
多年來(lái),C 語(yǔ)言的發(fā)展和變化如何?
我想,C 語(yǔ)言的發(fā)展是適度的,但我并沒(méi)有太注意 C 語(yǔ)言標(biāo)準(zhǔn)的發(fā)展。C 語(yǔ)言已經(jīng)有足夠的改變了,80 年代寫(xiě)的代碼需要做一些前置工作才能編譯,但這主要與誠(chéng)實(shí)對(duì)待類(lèi)型有關(guān)。比較新的功能,如復(fù)數(shù),也許是有用的,但對(duì)我來(lái)說(shuō)不是,所以我不能做出明智的評(píng)論。
哪些編程問(wèn)題可以用C語(yǔ)言最容易解決?
嗯,對(duì)于任何事情來(lái)說(shuō),它都是一種很好的語(yǔ)言,但在今天,有了充足的內(nèi)存和處理能力,大多數(shù)程序員都可以用 Python 這樣的語(yǔ)言來(lái)進(jìn)行內(nèi)存管理和處理其他更高級(jí)的結(jié)構(gòu)。C 語(yǔ)言仍然是底層編程的一個(gè)很好的選擇,因?yàn)閷?duì)于底層編程來(lái)說(shuō),充分利用 CPU 周期和每一個(gè)字節(jié)仍然很重要。
C 語(yǔ)言影響了其他編程語(yǔ)言,包括 C++、Java、Go 和 Rust。你對(duì)這些編程語(yǔ)言有什么看法?
幾乎每一種語(yǔ)言在某些方面都是對(duì)其前輩的反應(yīng)。簡(jiǎn)單點(diǎn)說(shuō),C++ 增加了控制信息訪問(wèn)的機(jī)制,所以對(duì)于真正的大型程序來(lái)說(shuō),它比 C 更好。Java 是對(duì) C++ 的復(fù)雜性的一種反應(yīng)。Go 是對(duì) C++ 的復(fù)雜性和 Java 的限制的一種反應(yīng)。Rust 是對(duì) C 語(yǔ)言(大概也是對(duì) C++)中內(nèi)存管理問(wèn)題的一種嘗試,同時(shí)它接近了 C 語(yǔ)言的效率。
它們都帶來(lái)了某些積極的特性,但不知何故,沒(méi)有人能夠完全滿意,所以總是會(huì)有更多的語(yǔ)言,反過(guò)來(lái)對(duì)以前的語(yǔ)言做出反應(yīng)。同時(shí),老的語(yǔ)言,在大多數(shù)情況下,仍會(huì)繼續(xù)存在,因?yàn)樗鼈兊墓ぷ髯龅煤芎?,而且有一個(gè)嵌入式的根據(jù)地,老的語(yǔ)言在里面可以完美使用,而用新的東西來(lái)重新實(shí)現(xiàn)是不可行的。
感謝 Brian 為我們分享了 C 語(yǔ)言編程的偉大歷史!