你好,游客 登录
背景:
阅读新闻

C语言的诞生:偶然,还是必然?

[日期:2019-07-21] 来源:  作者: [字体: ]

C语言从诞生到现在,有近50年的时间。

从绝对值上讲,50年并不长,但从计算机的发展历史来看,第一台计算机的诞生到现在也不过70多年,时至今日,C语言任然占据TIOBE排行榜的第二位置,和一名Java的差距也非常小,这在软硬件技术飞速变化的信息时代,不能不说是一个奇迹。

C语言的前身是B语言,也正是因为它继承了B语言的一些特性,因而按照字母的序列,将这门新的语言命名为C语言。

在这里我们要隆重介绍两位计算机界的教父级人物:Kenneth Lane ThompsonDennis MacAlistair Ritchie,后面简称Thompson和Ritchie。

Thompson是B语言的作者,Ritchie则发明了C语言,两位还共同开发了Unix操作系统

两个大胡子Thompson(左)和Ritchie(右)

1983年,Thompson和Ritchie因为其在计算机领域的卓越贡献,获得图灵奖,成为计算机工程界人士获此殊荣的第一例。                                       

C语言诞生的直接动力便来自于Unix系统的移植。

最初的Unix系统运行在PDP-7小型机上,后来被陆续移植到PDP-2,PDP-11等型号的机器上。

一开始,Unix是��汇编语言编写的,Unix之上的应用程序是由B语言和其它语言编写的,汇编语言与计算机系统的硬件耦合非常紧密。

因此,一旦换一种硬件型号,移植工作量基本等于使用新汇编语言重写一遍Unix。

为了解决这个问题,Ritchie发明了C语言,该语言具有良好的通用性,与硬件无关,同时又能进行底层操作,因此,Unix中的绝大部分汇编代码可以使用C语言来代替。

这样,采用C语言编写的Unix系统,只需要做少许修改,便可以通过编译器编译出不同的目标代码,运行在不同型号的目标机器之上。

若干年后,当有人问Ritchie是什么启发他如此设计C语言时,他回答说“这样做看上去很好”("looked like a good thing to do"),他说任何人在同一地方、同一时间会像他那样做的

许多人认为这只是他谦虚的说法,但如果我们设身处地的想一下,处在当时的环境,并在如此明确需求的驱动下,C语言的诞生似乎又是一件自然而然的事情,即便它的名字或许不叫C语言。

那么到底是“时势造英雄”还是“英雄造时势”,在这件事情上似乎没有明确的答案。

黑格尔说过,“存在即合理”。

C语言作为计算机语言中常青树,必定有其独特的地方,归纳一下,主要有以下几点。

1. 移植性

这一点应归为C语言的第一大特性,通过各种平台的C语言的编译器,可以将通用的C语言转换为对应平台的汇编代码,再通过汇编器转换为可以执行的机器码。这样,使用C语言编写的代码,只要有对应的编译器,便可以很方便地移植对应的硬件平台上,而不需要重新编写代码。

一个简单的例子便是Linux操作系统的内核,采用C语言编写而成,已被移植到X86、Arm、PowerPC、MIPS等多种CPU型号下。

2. 可读性

C语言向程序员提供了一个抽象的、虚拟化的计算机模型,对于程序员来说,他不再需要像使用汇编语言那样,还需要关注到CPU内部各个寄存器的值和状态。

这个特性和现今的高级语言相比,优势不那么明显。但是在Thompson和Ritchie他们所处的那个年代,机器语言和汇编语言一统天下,C语言的可读性优势不言而喻,由此带来的开发效率的提高也是不言而喻的。

3. 高效

最高效利用计算机硬件的方式是使用汇编编程,这是最直接的方式。

C语言只是对计算机做了最基本的抽象,没有复杂的功能,因此,在实现上可以做得比其它复杂语言的效率更高。

此外C编译器通过不断的优化,所生成的可执行文件的效率与手工汇编代码效率之间的差距不断缩小。在高级语言中,C语言的效率远高于Java等语言。

在最能体现性能的软件中,如操作系统内核、数据库、网络系统软件等,绝大多数都是采用C语言编写。

4. 简洁

正如Unix哲学中的KISS原则,Ritchie在设计C语言时,也严格遵守这一原则。

C语言的语法、接口都十分简单,对程序员的束缚很少。Ritchie所撰写的C语言经典教材《C编程语言》总共只有100多页,因此程序员可以在短时间内掌握C语言本身。

我们平时经常听到C语言难学,其实难点并不在于语言本身,而在于C语言是最接近底层硬件的高级编程语言,用户除了需要掌握语言外,还需要对计算机的组成与运行原理有所掌握,真正的难点在于此。

正是由于C语言的以上特性,使得基于C语言重写的Unix得以成功,Ritchie在1979年写道:“很肯定,Unix的成功很大程度上源自其以高级语言作为表述方式所带来的可读性、可改性和可移植性”。

未完待续


艾叔编程方法系列

为何我自学大数据这么久,效果却不好呢?

明明是按书上的步骤一步步来的,为什么还总出错?

高效程序设计的七个习惯

艾叔总结的任务驱动式教学法


艾叔大数据系列

推荐:和艾叔一起学:Docker+Hadoop企业级项目实战

为何我自学大数据这么久,效果却不好呢?

什么样的数据可以称为“大数据”?

大数据开发的通用步骤

Python or Java? 真的没有那么重要

如何理解Scala的函数式编程

艾叔,我的两台虚拟机咋就通不了呢?

明明是按书上的步骤一步步来的,为什么还总出错?

艾叔:最全【大数据采集技术】总结


新公众号,没法留言,如果你想和艾叔交流的话,可扫码私信,咱们微信见

Ps:艾叔不是高手,也不是牛人,编程的道路上,走了很多弯路,也踩了很多坑,如果你也和艾叔当年一样,欢迎关注公众号

如果你觉得本文有用,分享给需要的人。

你的分享点赞,是对艾叔最大的支持和鼓励

收藏 推荐 打印 | 阅读:
相关新闻