C 語言發展史的點點滴滴

2020-10-03 CSDN

作者 | 李彥鋒,騰訊 IEG 運營開發工程師

本文授權轉載自騰訊技術工程

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

C語言發展史

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

1.1 C語言有多偉大

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

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

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

1.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年圖靈獎得主。

丹尼斯.裡奇 生平時間線

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

1.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.3.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程式語言。

1.3.2 B語言之父

Kenneth Lane Thompson

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

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

1.3.3 一組Ken與Dennis的照片

日益精進

站在巨人的肩上

坐著的是Ken 站著的是Dennis

與優秀之人為伍

不畏得失,做有趣的事

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

言傳身教

感謝丹尼斯.裡奇留給了這世界一本「C語言聖經」

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

Dennis與《The C Programming Language》

互相成就

終成正果

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

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

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

1.與優秀之人為伍

2.互相成就

試想,有多麼重要?

1.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.'

1.5 unix時間線

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

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

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

1.5.1 PDP-Unix

PDP-Unix系統內核代碼文件

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

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

1.5.2 First Edition Unix

First Edition Unix系統內核代碼文件

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

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

1.5.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語言的身影了。

1.5.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.

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

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

1.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編譯器。

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語言比較

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

2.1 3種語言代碼示例

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

2.1.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.1.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 是一個帶參數的庫函數,它將在終端上列印一個數字

2.1.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.2 示例代碼中三者的區別

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

  1. C語言寫法更接近於B語言

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

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

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

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

說明:

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

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

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

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

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

歷史為什麼選擇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庫的代碼,下面一起欣賞她的美。

4.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

4.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 <ioe@informatik.tu-chemnitz.de>
* - 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 <jason@topic.com.au>,
* Matthew Hawkins <matt@mh.dropbear.id.au>
* - 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語言的重要性,這些文字也僅僅只是冰山一角。

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

參考資料

在整理的過程中,部分參考、引用下面連結地址內容:

[1] https://www.bell-labs.com/usr/dmr/www/index.html 裡奇貝爾實驗室主頁

[2] https://www.bell-labs.com/usr/dmr/www/chist.html C語言發展史

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

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

[5] https://www.levenez.com/lang/ Computer Languages History

[6] https://www.levenez.com/unix/ Unix History

[7] https://minnie.tuhs.org/cgi-bin/utree.pl The Unix Tree(可以看到很多老系統的原始碼)

[8] https://zh.wikipedia.org/wiki/丹尼斯·裡奇

[9] https://www.tiobe.com/tiobe-index/ TIOBE

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

點分享

相關焦點

  • 萬字詳文講述C語言發展史的點點滴滴
    作者:李彥鋒,騰訊 IEG 運營開發工程師一直想寫一篇關於C語言的文章,裡面包含C語言的發展史、創始人等相關事跡。C語言發展史任何一種新事物的出現都不是來自於偶然,而是時代所驅使的必然結果。1.1 C語言有多偉大如果你問我:C語言有多偉大。
  • C語言怎麼樣?今天聊聊C語言的發展史!
    C語言發展史的點點滴滴。 任何一種新事物的出現都不是來自於偶然,而是時代所驅使的必然結果。 如果你問我:C語言有多偉大。那麼,我可能會想一下,說:多偉大我不知道,但是我知道很偉大。
  • C/C+編程筆記:C語言入門題之正倒金字塔,正反三角形代碼詳解
    C跟C++在很多方面也是兼容的,c是c++的基礎。 再者c能從很大的程度上幫你了解計算機的發展史,數據結構等方面的知識,很多軟體、甚至作業系統中的很大部分是用c來實現的。
  • 我眼中的C語言及其起源
    為什麼寫這篇文章一直想寫一篇關於C語言的文章,裡面包含C語言的發展史、創始人等相關事跡。 C語言發展史任何一種新事物的出現都不是來自於偶然,而是時代所驅使的必然結果。上圖時間線只顯示前幾個與C語言在相同時間段內誕生的Unix版本(當然,感興趣的話,可以查詢Unix相關發展史,絕對會讓你大吃一驚。其中最著名的幾個分支:BSD、minix、Linux...)。
  • 了解C語言的發展史
    C 語言是一門功能強大的專業化程式語言,具有高級語言和彙編語言兩者的特點,深受專業人員與業餘愛好者的喜歡。C 語言作為一種計算機語言,可以開發很多靠近底層的應用。 C語言的起源
  • C語言的歷史,個人談談c語言
    作為一門計算機語言,c語言是一門面向過程,非常抽象的一個程序設計語言,他是在底層開發,並不適用於高層開發,能夠直接以簡單的方式編譯存儲器。作為一門高級語言,不需要任何運行環境。20世紀80年代,美國國家標準局為了避免各國產生的差異,於是給c語言制定了一套完整的國際標準語言
  • C語言中的變量存儲類型static老手都這樣用
    1、 先來回顧C語言變量C語言中變量值的存儲位置有兩類:CPU的寄存器和內存。變量存儲類型關係到其存儲位置,除了register型存儲在CPU寄存器中,C語言提供的其它三種存儲類型(auto型、static型、extern型)的變量均存儲在內存中。
  • 程式語言十年發展史
    通常我們都不會想起為我們帶來網際網路的正是各種程式語言,但是我們也不能忽視最近某些程式語言的流行發生了變化。我們可以從這些變化中了解數字世界的發展方向,同時也可以回顧一下這段發展史。排名第一:Python上個月,IEEE綜覽(IEEE Spectrum)發布了各大程式語言的年度排名,許多人驚訝地發現Python保住了頭把交椅的寶座。
  • 跟光磊學C語言-C語言概述與開發環境搭建
    語言和計算機語言的區別是計算機語言只要語法沒有問題就會無條件執行。個關鍵字就可以完成無數的功能執行速度快(機器語言/彙編語言/C語言)功能強大(C語言是當前最流行的語言)編程自由(語法檢測不是非常嚴格,初學者容易出錯,不同的環境編譯的結果可能不一樣)可移植性好(windows,linux,macOS都支持C語言,嵌入式,物聯網都支持C語言)
  • 說一說C語言中的變量存儲類型——「extern」
    請看下文C語言中的變量有哪些存儲類型,你還記得嗎?extern如何使用你都掌握了嗎?看了本文你就清楚了。1、 回顧C語言變量C語言中變量值的存儲位置有兩類:CPU的寄存器和內存。事實上,C語言中extern關鍵字就是用作「外部變量聲明」,起到擴展外部變量作用域的作用。通常C語言是以源文件為編譯單位的,一個程序可以包含一個或多個源文件,每個源文件包含一個或多個函數。但是程序不管有幾個源文件,extern的用法都是相同的,我們分這兩種情況來說明。
  • 每一個Java開發的程式設計師都應該知道的Java發展史
    java 的發展使講解java的發展史肯定首先要講的就是它的起源·那麼當時呢這個開發工程師呢想用這個c 加加來編寫。那麼後來呢發現c 加加呢非常的複雜,而且呢安全性呢呃也比較差。那於是呢這個小組呢就另闢蹊徑啊,那麼打算開發一門新的語言。那麼希望這門語言呢可以是簡單的,非常可靠的,並且呢是易於移植的。那麼基於這兒呢,他們就開發了一門新的語言叫java 用來編寫的一個電子產品設備。
  • Java 語言的發展使
    哈嘍,今天為大家講解一下java 的發展使講解java的發展史肯定首先要講的就是它的起源·那麼當時呢這個開發工程師呢想用這個c 加加來編寫。那麼後來呢發現c 加加呢非常的複雜,而且呢安全性呢呃也比較差。那於是呢這個小組呢就另闢蹊徑啊,那麼打算開發一門新的語言。那麼希望這門語言呢可以是簡單的,非常可靠的,並且呢是易於移植的。那麼基於這兒呢,他們就開發了一門新的語言叫java 用來編寫的一個電子產品設備。
  • C語言教程
    ,又具有彙編語言的特點。2.C語言教程--C語言有哪些特點?  編輯、編譯、連接、運行一個C語言程序的具體過程如下:  (1)編輯源程序,完成之後將源程序以擴展名.c存檔。  (2)對源程序進行編譯,即將源程序轉換為擴展名為.obj的二進位代碼。
  • 基於linux平臺的c語言語言教學針與數組
    大家好,我是陌塵,從今天開始,我會更新全套的c語言教學,從頭開始,一步一步,跟著我學,你也可以成為程序大神c語言是七十年代初問世的,現在已經成為luax下的最流行的高級語言,luax大部分語言都是用c語言寫的
  • 「C語言從入門到入土」必備C語言基礎筆記整理
    一、C語言1、什麼是C語言?C語言是人寫機器看的一種語言。C語言是高級語言中的低級語言。C語言貼近硬體。C語言的入門學習比較簡單。彙編語言——>B語言——>C語言2、C語言的特性首先C語言就是你的女朋友。
  • 60個C語言項目源碼
    來源:公眾號(c語言與cpp編程)c語言24點遊戲源碼c語言Turbo C下寫的俄羅斯方塊c語言UDP傳輸系統源碼c語言萬年曆源碼c語言五子棋源碼c語言俄羅斯方塊c語言做的一個任務管理器c語言做的播放器源碼
  • 為什麼學c語言及其計算機語言的原理
    而其技能當然不僅僅是做表或是寫文檔怎麼簡單,而我們就很難以外行人身份去研究計算機硬體及其工作原理,所以學會一門計算機程式語言就成了我們掌握計算機技能的突破口。既可以相對了解硬體的基本情況,也清楚軟體系統在計算機內部運作的過程。計算機語言的發展,是從機器語言、彙編語言、高級語言。而機器語言也就是計算機運行的原理。
  • 編程小白必備|| C語言入門最後一階,輸入與輸出
    哈嘍,夥伴們,我們前面講了C語言的發展史,基本數據類型,變量與常量,表達式,基本結構等等,今天是作為C語言基礎入門的最後一個階段:輸入與輸出。►往期文章回顧可以關注公眾號:c語言進階之路,查看歷史文章。以上這些知識你能夠掌握好,就可以開始進入C語言的進階提高階段啦,準備好了嗎?
  • C語言學習篇(32)——為什麼C語言不能函數重載
    在C++中原生支持了函數重載, 而在C語言中並不支持,只能通過一些技巧來變相解決, 如定義flag形參, 根據flag值不同,進行不同的處理。使用objdump工具反彙編 大家都知道了在C語言中不能函數重載, 究其原因是否思考過呢?接下來我們以下c和c++代碼為例子,分別用gcc和 g++編譯, 然後再用objdump工具反彙編看看得到的彙編代碼有什麼區別。
  • 現代程式語言起點,C語言之環境搭建
    安裝好MinGW軟體後,找到安裝文件夾下的bin目錄,默認應該是:c:\MinGW\bin將c:\MinGW\bin 、c:\MinGW\lib、c:\MinGW\include添加到系統環境變量的path的最後:過命令可彈出安裝窗口 MinGW-Installation-Manager