从C语言发展史带你方方面面了解C语言!

  1. C语言发展史
    任何一种新事物的出现都不是来自于偶然,而是时代所驱使的必然结果。

作为一门计算机语言,c语言是一门面向过程,非常抽象的一个程序设计语言,他是在底层开发,并不适用于高层开发,能够直接以简单的方式编译存储器。作为一门高级语言,不需要任何运行环境。如果一个标准规格写C语言的话,那么他可以在普通的计算机以及超级计算机等等都可以进行编译。

如果你问我:C语言有多伟大。那么,我可能会想一下,说:多伟大我不知道,但是我知道很伟大。

这里,我想说一句可能有点片面的话,就是:如今这世界上,凡是带电的地方,可能都会有她(C语言)或者她的子孙的影子。

  1. C语言之父
    丹尼斯·麦卡利斯泰尔·里奇(英语:Dennis MacAlistair Ritchie,1941年9月9日-2011年10月12日),美国计算机科学家。黑客圈子通常称他为“dmr”。他是C语言的创造者、Unix操作系统的关键开发者,对计算机领域产生了深远影响,并与肯·汤普逊同为1983年图灵奖得主。

麻省理工大学计算机系的马丁教授评价说:”如果说,乔布斯是可视化产品中的国王,那么里奇就是不可见王国中的君主“。乔布斯的贡献在于,他如此了解用户的需求和渴求,以至于创造出了让当代人乐不思蜀的科技产品。然而,却是里奇先生为这些产品提供了最核心的部件,人们看不到这些部件,却每天都在使用着。”

C语言之父丹尼斯.M.里奇所写的一篇关于《C语言发展史》的文章,文中明确指出C语言源自于B、BCPL两种语言。可以把C语言看做是站在巨人的肩上,顺应时代潮流的后浪。

  1. BCPL语言之父
    马丁·理查德(英语:Martin Richards,1940年7月21日-),生于英国,计算机科学家,为BCPL编程语言的发明者,发展了TRIPOS操作系统。

1966年,马丁·理查德在剑桥大学,以CPL编程语言为基础,发明了BCPL编程语言。

  1. B语言之父
    肯尼斯·兰·汤普逊(英语:Kenneth Lane Thompson,1943年2月4日-)小名肯·汤普逊(英语:Ken Thompson),美国计算机科学学者和工程师。黑客文化圈子通常称他为“ken”。在贝尔实验室工作期间,汤普逊设计和实现了Unix操作系统。他创造了B语言(基于BCPL) — C语言的前身,而且他是Plan 9操作系统的创造者和开发者之一。与丹尼斯·里奇同为1983年图灵奖得主。

2006年,汤普逊进入Google公司工作,与他人共同设计了Go语言。

  1. C语言时间线
    从下图中的时间线,可以明显的看出C语言的起源以及时间节点。

有时候不得不说时势造英雄,在1969~1971年之间著名的操作系统Unix从肯.汤普逊手中诞生,作为一种大型的系统性软件来说,极其需要一种可靠的高级语言的出现(当时的低级语言指的是汇编,因为之前的操作系统是用汇编写的)。这个时候的丹尼斯.里奇也没闲着,在对B语言改良之后,就诞生了带有类型的C语言(据里奇自己说,有一段时间称这种改良的语言为NB。即:new B。不过,在我们这些吃瓜群众眼中看来也确实NB)。

  1. unix时间线
    Unix的诞生与C语言被广泛的传播、使用,有着密切的联系。

下图时间线只显示前几个与C语言在相同时间段内诞生的Unix版本(当然,感兴趣的话,可以查询Unix相关发展史,绝对会让你大吃一惊。其中最著名的几个分支:BSD、minix、Linux…)。

下面,通过在网上找得到的部分Unix内核源码,来追溯一下C语言出现的时机。

  1. BCPL、B、C语言比较
    如果想要找到一种好的方式,来进行编程语言之间比较的话,那么非代码莫属。

下面分别使用BCPL、B、C三种语言实现一个简单的程序:程序将三个数字a、b、c相加,并将结果赋值给sum,最后打印总和。

1.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的过渡中,决定使用单个字符 = 代替赋值 :=

  1. B语言示例
    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. C语言示例
    C语言的优点很多,主要的有如下四点:
    1.兼备高级语言与低级语言的优点,属于一种中间语言。
    2.它是一种结构化程序设计语言,非常适合结构化程序设计。
    3.有较丰富的数据类型、运算符以及函数供以选用。
    4.直接与内存打交道,使修改、编辑其他程序与文档变得轻松,简单。

代码示例:

include

void main(){
int a,b,c,sum;

a=1; b=2; c=3;
sum = a+b+c;
printf(“%d”, sum);
}

  1. 示例代码中三者的区别
    通过上面例子可以看到三者的区别:
    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.如果有高手觉得上面的代码片段有问题或者知道怎么跑起来的话,可以私下交流

  1. 历史为什么选择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的关系,都是互相成就)。

  1. C语言的重要性

第一:C语言语法结构很简洁精妙,写出的程序也很高效,很便于描述算法,大多数的程序员愿意使用C语言去描述算法本身,所以,如果你想在程序设计方面有所建树,就必须去学它。

第二:C语言能够让你深入系统底层,你知道的操作系统,哪一个不是C语言写的?所有的windows,Unix,Linux,Mac,os/2,没有一个里外的,如果你不懂C语言,怎么可能深入到这些操作系统当中去呢?更不要说你去写它们的内核程序了。

第三:很多新型的语言都是衍生自C语言,C++,Java,C#,J#,perl…哪个不是呢?掌握了C语言,可以说你就掌握了很多门语言,经过简单的学习,你就可以用这些新型的语言去开发了,这个再一次验证了C语言是程序设计的重要基础。还有啊,多说一点:即使现在招聘程序员,考试都是考C语言,你想加入it行业,那么就一定要掌握好C语言。
廉颇老矣, 尚能饭否?
经历过几十年的风雨洗礼,C语言可谓风光无数,这世界上随处可见它的身影。但是,同时在一些人眼里,可能觉得C语言已是暮年(已经51岁了)、老矣。如同下图:
C语言学习方法
笔者学习过很多程序语言,例如:C,C++(C语言的扩展),QBASIC,VB(BASIC的可视化),javascript,JSCRIPT ,VBSCRIPT,JAVA,ASP,FOXPRO,PERL等等,就本人实践所得,其实高级程序语言分为两大语系。一路是以C为主的程序语言,例如:javascript,JAVA等,这类语言在函数的调用,程序语句的书写,循环的控制都极为相似。另一路是以BASIC为首的程序语言,例如:FOXPRO,VBSCRIPT等,此类语言同样具有相似的函数调用,程序语句书写以及循环控制,但与C语系是不同的。因此若是您以前是从QBASIC起家的,那么在学习C语言前最好是先洗洗脑,千万不要把学习BASIC的方法以及思路用在C身上

讲到这里,我想大家对C语言一定有了感性认识吧!下面让我们再升华一下,全方位亲密接触它。学习C语言必须从以下四点入手,也就是说,只要你能掌握这四点的内容,那么基本上就大功告成了。

1、多看代码
在有一定基础以后一定要多看别人的代码。注意代码中的算法和数据结构。毕竟学C之后的关口就是算法和数据结构。提到数据结构,指针是其中重要的一环,绝大多数的数据结构是建立在指针之上的,如链表、队列、树、图等等,所以只有学好指针才能真正学好C。别的方面也要关注一下,诸如变量的命名、库函数的用法等等。有些库函数是经常用到的。对于这些函数的用法就要牢牢记住。
2、要自己动手
编程序是个实干的活,光说不练不行。刚开始学的时候可以多练习书上的习题。对于自己不明白的地方,自己编个小程序实验一下是最好的方法,能给自己留下深刻的印象。自己动手的过程中要不断纠正自己不好的编程习惯和认识错误。有一定的基础以后可以尝试编一点小游戏,文曲星之类的电子词典上小游戏很多,照着编作为练习。基础很扎实的时候,可以编一些关于数据结构方面的东西,诸如最经典的学生管理系统。之后…..学汇编、硬件知识。
3、养成良好的编程习惯
基本上每本C教材上都要提到。作为新手这条一定要时时遵守。另外想要成为一个优秀的、有能力程序员,做软件开发的话,就来学习C/C++吧!
公众号:编程技术星球

阅读原文


作者简介: 我是一名编程老师,专业指导C++,这里有最全的C++教程,每天分享最新IT咨询、知识点、小案列,专为初学编程的你而准备! 欢迎关注微信公众号:编程技术星球

声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/415306.html

联系我们
联系我们
分享本页
返回顶部