將近50歲的C語言:廉頗老矣,尚能飯否?

前言

 

一直想寫一篇關於C語言的文章,裏面包含C語言的發展史、創始人等相關事蹟。但是卻遲遲未寫,主要原因是因爲:在我看來,這個語言太過於偉大、耀眼。作爲一個僅僅使用過C語言的普通開發來說,完全沒資格去寫。但是,最近在看過一篇丹尼斯.裏奇寫的《C語言發展史》之後,堅定了我寫這篇文章的決心。不是歌功頌德,僅僅是以一種客觀的視角去欣賞。

 

​一、C語言發展史

 

任何一種新事物的出現都不是來自於偶然,而是時代所驅使的必然結果。

 

  1、 C語言有多偉大

 

如果你問我:C語言有多偉大。那麼,我可能會想一下,說:多偉大我不知道,但是我知道很偉大。

 

 

這裏,我想說一句可能有點片面的話,就是:如今這世界上,凡是帶電的地方,可能都會有她(C語言)或者她的子孫的影子。

 

任何比C語言更低級的語言,都不足以完整地抽象一個計算機系統;任何比C高級的語言,都可以用C來實現。

 

  2、C語言之父

 

 

Ritchie 貝爾實驗室的個人主頁地址

https://www.bell-labs.com/usr/dmr/www/index.html

 

丹尼斯·麥卡利斯泰爾·裏奇(英語:Dennis MacAlistair Ritchie,1941年9月9日-2011年10月12日),美國計算機科學家。黑客圈子通常稱他爲“dmr”。他是C語言的創造者、Unix操作系統的關鍵開發者,對計算機領域產生了深遠影響,並與肯·湯普遜同爲1983年圖靈獎得主。

 

丹尼斯.裏奇 生平時間線

 

麻省理工大學計算機系的馬丁教授評價說:"如果說,喬布斯是可視化產品中的國王,那麼裏奇就是不可見王國中的君主。喬布斯的貢獻在於,他如此瞭解用戶的需求和渴求,以至於創造出了讓當代人樂不思蜀的科技產品。然而,卻是裏奇先生爲這些產品提供了最核心的部件,人們看不到這些部件,卻每天都在使用着。"克尼漢評價道:牛頓說他是站在巨人的肩膀上,如今,我們都站在裏奇的肩膀上。

 

  3、C語言的先輩

 

爲了簡潔起見,我(Dennis M.Ritchie)省略了對C本身,其父級B [Johnson 73]和其祖父母BCPL [Richards 79]的完整描述,而只關注每種語言的特徵元素以及它們如何演變。This paper is about the development of the C programming language, the influences on it, and the conditions under which it was created. For the sake of brevity, I omit full descriptions of C itself, its parent B [Johnson 73] and its grandparent BCPL [Richards 79], and instead concentrate on characteristic elements of each language and how they evolved.

https://www.bell-labs.com/usr/dmr/www/chist.html

這段文字出自C語言之父丹尼斯.M.裏奇所寫的一篇關於《C語言發展史》的文章,文中明確指出C語言源自於B、BCPL兩種語言。可以把C語言看做是站在巨人的肩上,順應時代潮流的後浪。

 

1)BCPL語言之父

 

Martin Richards

 

Martin Richards's BCPL Reference Manual, 1967 https://web.archive.org/web/20080622171914/http://cm.bell-labs.com/cm/cs/who/dmr/bcpl.html

馬丁·理察德(英語:Martin Richards,1940年7月21日-),生於英國,計算機科學家,爲BCPL編程語言的發明者,發展了TRIPOS操作系統。

 

1966年,馬丁·理察德在劍橋大學,以CPL編程語言爲基礎,發明了BCPL編程語言。

 

2)B語言之父

 

Kenneth Lane Thompson

 

肯尼斯·藍·湯普遜(英語:Kenneth Lane Thompson,1943年2月4日-)小名肯·湯普遜(英語:Ken Thompson),美國計算機科學學者和工程師。黑客文化圈子通常稱他爲“ken”。在貝爾實驗室工作期間,湯普遜設計和實現了Unix操作系統。他創造了B語言(基於BCPL) — C語言的前身,而且他是Plan 9操作系統的創造者和開發者之一。與丹尼斯·裏奇同爲1983年圖靈獎得主。

 

2006年,湯普遜進入Google公司工作,與他人共同設計了Go語言。

 

3) 一組Ken與Dennis的照片

 

日益精進 

站在巨人的肩上

 

坐着的是Ken 站着的是Dennis

 

與優秀之人爲伍 

不畏得失,做有趣的事

 

左Ken 右Dennis | 右上角:Unix標識牌

 

言傳身教

感謝丹尼斯.裏奇留給了這世界一本“C語言聖經”

可惜的是,當年筆者大學學的是譚浩強譚老師的C語言 

 

Dennis與《The C Programming Language》

 

互相成就 

終成正果 

你做了什麼,最終會被世人看到

 

1999年獲得美國國家技術獎 [左一:Ken | 左二:Dennis | 右一:克林頓]

 

從這些老照片中,我隱隱約約看到了幾行小字,寫着:

 

  • 與優秀之人爲伍 

  • 互相成就

 

試想,有多麼重要?

 

  4 、C語言時間線

 

 

Computer Languages History https://www.levenez.com/lang/

 

從圖中時間線,可以明顯的看出C語言的起源以及時間節點。

 

有時候不得不說時勢造英雄,在1969~1971年之間著名的操作系統Unix從肯.湯普遜手中誕生,作爲一種大型的系統性軟件來說,極其需要一種可靠的高級語言的出現(當時的低級語言指的是彙編,因爲之前的操作系統是用匯編寫的)。這個時候的丹尼斯.裏奇也沒閒着,在對B語言改良之後,就誕生了帶有類型的C語言(據裏奇自己說,有一段時間稱這種改良的語言爲NB。即:new B。不過,在我們這些喫瓜羣衆眼中看來也確實NB)。

 

In 1971 I began to extend the B language by adding a character type and also rewrote its compiler to generate PDP-11 machine instructions instead of threaded code. Thus the transition from B to C was contemporaneous with the creation of a compiler capable of producing programs fast and small enough to compete with assembly language. I called the slightly-extended language NB, for `new B.'

 

  5 、unix時間線

 

 

Unix的誕生與C語言被廣泛的傳播、使用,有着密切的聯繫。

 

上圖時間線只顯示前幾個與C語言在相同時間段內誕生的Unix版本(當然,感興趣的話,可以查詢Unix相關發展史,絕對會讓你大喫一驚。其中最著名的幾個分支:BSD、minix、Linux...)。

 

下面,通過在網上找得到的部分Unix內核源碼,來追溯一下C語言出現的時機。

 

1) PDP-Unix

 

PDP-Unix系統內核代碼文件

 

 

PDP-7 Unix 

https://minnie.tuhs.org/cgi-bin/utree.pl?file=PDP7-Unix

 

可以看到基本都是用匯編寫的(文件名後綴.s)。爲什麼用基本這個詞呢?因爲,在系統裏面有一部分命令是用B語言寫的。

 

2)First Edition Unix

 

First Edition Unix系統內核代碼文件

 

 

https://minnie.tuhs.org/cgi-bin/utree.pl?file=V1

 

可以看到,還是用匯編寫的(文件名後綴.s)。

 

3) Second Edition Unix

 

Second Edition Unix系統內核代碼文件

 

 

Second Edition Unix The second edition of Unix was developed for the PDP-11 at Bell Labs by Ken Thompson, Dennis Ritchie and others. It extended the First Edition with more system calls and more commands. This edition also saw the beginning of the C language, which was used to write some of the commands.

https://minnie.tuhs.org/cgi-bin/utree.pl?file=V2

 

到這個版本,已經可以看到C語言的身影了。

 

4) Unix與C語言

 

從C語言在Unix V2版本出現之後,Unix的V3版本開始,已經可以在Unix內核中見到大量C語言編寫的代碼。

 

據裏奇所說:到1973年初,現代C的基本知識已經完成。C語言和編譯器強大到,足以讓我們在當年夏天用C重寫PDP-11的Unix內核 (也就是Unix的V3版本)。

 

By early 1973, the essentials of modern C were complete. The language and compiler were strong enough to permit us to rewrite the Unix kernel for the PDP-11 in C during the summer of that year.

 

到了這個時間節點,基本可以肯定的是C語言、Unix的大部分核心都已經完善。剩下要做的就是,可移植性、標準化。

 

後面的故事,大家可能也聽說過:後來學術和政府組織中都在使用Unix,也正是由於Unix的風靡與興盛,帶動了C語言被廣泛的傳播、使用。

 

在1980年代,C語言的使用廣泛傳播,並且幾乎所有機器體系結構和操作系統都可以使用編譯器。尤其是,它已成爲個人計算機的編程工具,無論是用於這些機器的商業軟件製造商,還是對編程感興趣的最終用戶,都非常受歡迎。

 

During the 1980s the use of the C language spread widely, and compilers became available on nearly every machine architecture and operating system; in particular it became popular as a programming tool for personal computers, both for manufacturers of commercial software for these machines, and for end-users interested in programming.

 

這也就是所謂的互相成就。

 

一句話概括就是:不畏得失、日漸精進,最終互相成就。

 

  6 、第一個C語言編譯器是怎樣編寫的?

 

不知道你有沒有想過,大家都用C語言或基於C語言的語言來寫編譯器,那麼世界上第一個C語言編譯器又是怎麼編寫的呢?這不是一個“雞和蛋”的問題……

 

回顧一下C語言歷史:Tomphson在BCPL的基礎上開發了B語言,Ritchie又在B語言的基礎上成功開發出了現在的C語言。在C語言被用作系統編程語言之前,Tomphson也用過B語言編寫過操作系統。可見在C語言實現以前,B語言已經可以投入實用了。因此第一個C語言編譯器的原型完全可能是用B語言或者混合B語言與PDP彙編語言編寫的。

 

我們現在都知道,B語言的執行效率比較低,但是如果全部用匯編語言來編寫,不僅開發週期長、維護難度大,更可怕的是失去了高級程序設計語言必需的移植性。

 

所以早期的C語言編譯器就採取了一個取巧的辦法:先用匯編語言編寫一個C語言的一個子集的編譯器,再通過這個子集去遞推,進而完成完整的C語言編譯器。

 

詳細的過程如下:先創造一個只有C語言最基本功能的子集,記作C0語言,C0語言已經足夠簡單了,可以直接用匯編語言編寫出C0的編譯器。依靠C0已有的功能,設計比C0複雜,但仍然不完整的C語言的又一個子集C1語言,其中C0屬於C1,C1屬於C,用C0開發出C1語言的編譯器。在C1的基礎上設計C語言的又一個子集C2語言,C2語言比C1複雜,但是仍然不是完整的C語言,開發出C2語言的編譯器 …… 如此直到CN,CN已經足夠強大了,這時候就足夠開發出完整的C語言編譯器的實現了。至於這裏的N是多少,這取決於你的目標語言(這裏是C語言)的複雜程度和程序員的編程能力。簡單地說,如果到了某個子集階段,可以很方便地利用現有功能實現C語言時,那麼你就找到N了。下面的圖說明了這個抽象過程:

 

 

https://kknews.cc/tech/bx2r3j.html 介紹一個概念,“自編譯”Self-Compile,也就是對於某些具有明顯自舉性質的強類型(所謂強類型就是程序中的每個變量必須聲明類型後才能使用,比如C語言,相反有些腳本語言則根本沒有類型這一說法)編程語言,可以藉助它們的一個有限小子集,通過有限次數的遞推來實現對它們自身的表述,這樣的語言有C、Pascal、Ada等等,至於爲什麼可以自編譯,可以參見清華大學出版社的《編譯原理》,書中實現了一個Pascal的子集的編譯器。https://zhuanlan.zhihu.com/p/136102461

 

而這個過程也在Unix V2版本中找到了證據。

 

 

肯恩·湯普森,丹尼斯·裏奇和其他人在貝爾實驗室爲PDP-11開發了Unix的第二版。它通過更多的系統調用和更多的命令擴展了第一版。此版本還看到了C語言的開始,該語言用於編寫一些命令。

 

此處的代碼僅是某些命令,某些庫函數和C編譯器的源代碼。c /中的文件來自 last1120c.tar.gz 磁帶,並構成了第二版Unix的有效C編譯器。

 

下載地址:http://minnie.tuhs.org/Archive/Applications/Early_C_Compilers/last1120c.tar.gz 

 

The second edition of Unix was developed for the PDP-11 at Bell Labs by Ken Thompson, Dennis Ritchie and others. It extended the First Edition with more system calls and more commands. This edition also saw the beginning of the C language, which was used to write some of the commands.The code here is only the source to some of the commands, some of the library functions, and the C compiler. The files in c/ come from the last1120c.tar.gz tape, and form a working C compiler for Second Edition Unix.

https://minnie.tuhs.org/cgi-bin/utree.pl?file=V2

 

下載源碼解壓縮之後,目錄結構如下:

 

 

感興趣的小夥伴可以下載下來研究一下。

 

二、BCPL、B、C語言比較

 

如果想要找到一種好的方式,來進行編程語言之間比較的話,那麼非代碼莫屬。

 

  1、3種語言代碼示例

 

下面分別使用BCPL、B、C三種語言實現一個簡單的程序:程序將三個數字a、b、c相加,並將結果賦值給sum,最後打印總和。

 

1)BCPL語言示例

 

BCPL 

https://zh.wikipedia.org/wiki/BCPL

 

 

GET "libhdr"

 

LET start() = VALOF

{ LET a, b, c = 1, 2, ,3

 

    sum := a + b + c

    writen(sum)

}

 

  • LET 聲明變量;

  • := 符號爲賦值符號 Go中也有該符號,表示函數內部局部變量。這裏感覺很有意思的一點是:最初B語言之父肯.湯普遜把:=符號改成了=符號。現在,也作爲Go語言之父之一,又把:=符號請回來了(冥冥之中的命運~)。

 

從BCPL到B的過渡中,決定使用單個字符 = 代替賦值 :=Other fiddles in the transition from BCPL to B were introduced as a matter of taste, and some remain controversial, for example the decision to use the single character = for assignment instead of :=. Similarly, B uses /**/ to enclose comments, where BCPL uses //, to ignore text up to the end of the line. The legacy of PL/I is evident here. (C++ has resurrected the BCPL comment convention.) Fortran influenced the syntax of declarations: B declarations begin with a specifier like auto or static, followed by a list of names, and C not only followed this style but ornamented it by placing its type keywords at the start of declarations.

https://www.bell-labs.com/usr/dmr/www/chist.html

 

2) B語言示例

 

A TUTORIAL INTRODUCTION TO THE LANGUAGE B https://web.archive.org/web/20070807110157/http://cm.bell-labs.com/cm/cs/who/dmr/btut.html

 

B語言的語言結構

 

 

main() {

    -- statements --

}

 

newfunc(arg1, arg2) {

    -- statements --

}

 

fun3(arg) {

    -- more statements --

}

 

B語言代碼示例

 

main() {

  auto a, b, c, sum;

 

  a = 1; b = 2; c = 3;

  sum = a+b+c;

  putnumb(sum);

}

 

  • 語句auto ...是一個聲明。即,它定義了要在函數內使用的局部變量;

  • putnumb 是一個帶參數的庫函數,它將在終端上打印一個數字。

 

3) C語言示例

 

#include <stdio.h>

 

void main(){

  int a,b,c,sum;

  

  a=1; b=2; c=3;

  sum = a+b+c;

  printf("%d", sum);

}

 

  2、示例代碼中三者的區別

 

通過上面例子可以看出三者的區別:

 

  • C語言寫法更接近於B語言;

  • BCPL、B語言都是無類型的語言,用word/cell表示一個固定長度的bit。C語言是有類型的。

 

有一些地方,你可能感興趣:

  • ++、-- 符號是Thompson發明的;

  • &&、|| 是在C語言引入的。

 

說明:

  • 查了好久只找到了BCPL、B語言的部分代碼片段,至於能不能跑起來,我也不知道 ^_^;

  • 如果想要知曉三者的具體區別的話,建議閱讀丹尼斯.裏奇關於《C語言發展史》的文章;

  • BCPL、B語言也有經歷過若干次版本迭代 (因爲,網上找到的代碼片段有很多寫法不一樣的地方。比如說,維基百科中找到的B代碼片段,與在Unix內核前幾個版本中找到的B代碼片段寫法就不一樣。個人推測是版本問題,不同的版本不同的寫法);

  • C語言更接近與B語言,或着說是在B的基礎上不斷的添加了很多新特性 (拋出2個問題:1.裏奇起名字時爲什麼不像C++一樣,起名叫B++ ?2.爲什麼C++用了2個加號,而不是一個加號,叫C+ ?  歡迎腦洞夠大的同學在評論留言!);

  • 如果有高手覺得上面的代碼片段有問題或者知道怎麼跑起來的話,可以私下交流。

 

三、歷史爲什麼選擇C語言

 

1960s年代後期,貝爾實驗室對計算機系統的研究進入繁盛時期。MIT、General Electric、Bell實驗室合作的Mutlics項目以失敗而告終(1969年左右)。就是在這個時期,Ken Tompson開始寫Mutlics的替代品,他希望按照自己的設計構造一個令人舒服的計算系統(也就是Unix)。後來在寫出第一個版本的Unix時,覺得Unix上需要一個新的系統編程語言,他創造了一個B語言。B語言是沒有類型的C,準確說B語言是Tompson把BCPL擠進8K內存,被其個人大腦過濾後的產生的語言。

 

由於B語言存在的一些問題,導致其只是被用來寫一些命令工具使用。恰好在這個時期,Ritchie在B語言的基礎上,進行了重新的設計改良,從而誕生了C語言。

 

1973年,C語言基本上已經完備,從語言和編譯器層面已經足夠讓Tompson和Ritchie使用C語言重寫Unix內核。後來,Unix在一些研究機構、大學、政府機關開始慢慢流行起來,進而帶動了C語言的發展。

 

1978年,K&R編寫的《The C Programming Language》出版,進一步推動了C語言的普及。

 

用一句話總結就是:對的時間、對的地點,出現了對的人以及工具 (Unix與C語言的關係,有點像GNU與Linux kernel的關係,都是互相成就)。

 

四、標準C庫及代碼

 

C語言及其標準經過若干次迭代之後,就成了今天大家看到的樣子。其標準中指定了很多C標準庫,而不同的系統都有自己不同的代碼實現。

 

當然,Linux內核中也有實現了標準C庫的代碼,下面一起欣賞她的美。

 

  1、標準C庫

 

ANSI C共包括15個頭文件。1995年,Normative Addendum 1(NA1)批准了3個頭文件(iso646.h、wchar.h和wctype.h)增加到C標準函數庫中。C99標準增加6個頭文件(complex.h、fenv.h、inttypes.h、stdbool.h、stdint.h和tgmath.h)。C11標準中又新增了5個頭文件(stdalign.h、stdatomic.h、stdnoreturn.h、threads.h和uchar.h)。

 

至此,C標準函數庫共有29個頭文件:

 

 

https://www.wikiwand.com/zh-sg/C%E6%A8%99%E6%BA%96%E5%87%BD%E5%BC%8F%E5%BA%AB#/%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE

 

2) linux/lib/string.c

 

linux kernel版本:4.18.13

 

lnux kernel 地址 https://www.kernel.org/

 

下面列出3個字符串處理函數 strcpy()、strncpy()、strncat()。代碼出自Linus Benedict Torvalds之手,爲什麼這麼說?看代碼頭部註釋,還是那個熟悉的味道stupid。看過git源代碼的人應該也會知道,git源碼中也有類似註釋。

 

 

// SPDX-License-Identifier: GPL-2.0

/*

 *  linux/lib/string.c

 *

 *  Copyright (C) 1991, 1992  Linus Torvalds

 */

 

/*

 * stupid library routines.. The optimized versions should generally be found

 * as inline code in <asm-xx/string.h>

 *

 * These are buggy as well..

 *

 * * Fri Jun 25 1999, Ingo Oeser <[email protected]>

 * -  Added strsep() which will replace strtok() soon (because strsep() is

 *    reentrant and should be faster). Use only strsep() in new code, please.

 *

 * * Sat Feb 09 2002, Jason Thomas <[email protected]>,

 *                    Matthew Hawkins <[email protected]>

 * -  Kissed strtok() goodbye

 */

 

// .......omit other......

// ...... here is my love code  .....

 

#ifndef __HAVE_ARCH_STRCPY

/**

 * strcpy - Copy a %NUL terminated string

 * @dest: Where to copy the string to

 * @src: Where to copy the string from

 */

#undef strcpy

char *strcpy(char *dest, const char *src)

{

 char *tmp = dest;

 

 while ((*dest++ = *src++) != '\0')

  /* nothing */;

 return tmp;

}

EXPORT_SYMBOL(strcpy);

#endif

 

#ifndef __HAVE_ARCH_STRNCPY

/**

 * strncpy - Copy a length-limited, C-string

 * @dest: Where to copy the string to

 * @src: Where to copy the string from

 * @count: The maximum number of bytes to copy

 *

 * The result is not %NUL-terminated if the source exceeds

 * @count bytes.

 *

 * In the case where the length of @src is less than  that  of

 * count, the remainder of @dest will be padded with %NUL.

 *

 */

char *strncpy(char *dest, const char *src, size_t count)

{

 char *tmp = dest;

 

 while (count) {

  if ((*tmp = *src) != 0)

   src++;

  tmp++;

  count--;

 }

 return dest;

}

EXPORT_SYMBOL(strncpy);

#endif

 

#ifndef __HAVE_ARCH_STRLCPY

 

#ifndef __HAVE_ARCH_STRNCAT

/**

 * strncat - Append a length-limited, C-string to another

 * @dest: The string to be appended to

 * @src: The string to append to it

 * @count: The maximum numbers of bytes to copy

 *

 * Note that in contrast to strncpy(), strncat() ensures the result is

 * terminated.

 */

char *strncat(char *dest, const char *src, size_t count)

{

 char *tmp = dest;

 

 if (count) {

  while (*dest)

   dest++;

  while ((*dest++ = *src++) != 0) {

   if (--count == 0) {

    *dest = '\0';

    break;

   }

  }

 }

 return tmp;

}

EXPORT_SYMBOL(strncat);

#endif

 

#ifndef __HAVE_ARCH_STRLCAT

 

// .......omit other......

// ...... here is my love code  .....

第一次跟同學一起看這些代碼的時候,他說了一句話:這才叫代碼,其他的都是s-h-X-t。現在回想起,自己在實現這些代碼時,寫了一坨不知道是什麼的東西。哎,代碼比代碼要扔~

 

閱讀他人代碼, 也是一種進步、成長。

 

五、廉頗老矣, 尚能飯否?

 

《史記·廉頗藺相如列傳》記載,廉頗被免職後,跑到魏國,趙王想再用他,派人去看他的身體情況,廉頗之仇郭開賄賂使者,使者看到廉頗,廉頗爲之米飯一斗,肉十斤,被甲上馬,以示尚可用。使者回來報告趙王說:"廉頗將軍雖老,尚善飯,然與臣坐,頃之三遺矢(通假字,即屎)矣。"趙王以爲廉頗已老,遂不用。

 

經歷過幾十年的風雨洗禮,C語言可謂風光無數,這世界上隨處可見它的身影。但是,同時在一些人眼裏,可能覺得C語言已是暮年(將近50歲)、老矣。如同下圖:

 

 

如果你真這樣想,那你就錯了。

 

TIOBE Index for September 2020

 

https://www.tiobe.com/tiobe-index/

 

TIOBE 2020-09 編程語言排行榜告訴你,C語言寶刀未老,還是那個風采耀眼的少年。

 

 

個人想說的是,只要計算機還是基於馮諾依曼體系結構,芯片還是基於物理製程。那麼,都會有一片C的天空。因爲,她知道一個最接近天空的地方(C是最接近彙編、機器語言的高級語言之一)。

 

任他上層應用改朝換代,我(C語言)自巋然不動。這就是C,我心中的C語言。

 

總結

 

猛然間發現已經到了總結,但是還覺得仍舊意猶未盡,這並不是我心目中最真實的那個她。但是,我還是希望你看完本文之後,能夠多少了解與熟悉C的美與真實。

 

 

最後想說的是:縱使千言萬語也說不盡C語言的重要性,這些文字也僅僅只是冰山一角。

 

鑑於個人能力有限,如有問題或者缺陷,歡迎指正。

 

>>>>

參考資料

 

  • 裏奇貝爾實驗室主頁

    https://www.bell-labs.com/usr/dmr/www/index.html 

  • C語言發展史

    https://www.bell-labs.com/usr/dmr/www/chist.html 

  • 裏奇貝爾實驗室主頁

    https://www.bell-labs.com/usr/dmr/www/index.html 

  •  https://www.bell-labs.com/usr/dmr/www/1stEdman.html Unix Programmer's Manual

  • https://www.bell-labs.com/usr/dmr/www/bcpl.html Martin Richards's BCPL  Manual

  • lhttps://www.levenez.com/lang/  Computer Languages History

  • https://www.levenez.com/unix/  Unix History

  • https://minnie.tuhs.org/cgi-bin/utree.pl The Unix Tree(可以看到很多老系統的源代碼)

  • 丹尼斯·裏奇

    https://zh.wikipedia.org/wiki/

  • https://www.tiobe.com/tiobe-index/  TIOBE

  • http://web.eah-jena.de/~kleine/history/ Historic Documents in Computer Science

     

作者丨李彥鋒,騰訊 IEG 運營開發工程師 來源丨騰訊技術工程(ID:Tencent_TEG) dbaplus社羣歡迎廣大技術人員投稿,投稿郵箱: [email protected]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章