分享

C语言的前世今生(上)

 昵称11935121 2018-06-26

楔子:

在华为工作的时候,我常常受邀去给开发团队做培训,但其中大多数称之为座谈似乎更恰当些。相对于专业讲师不乏调侃的授课方式,我更倾向于直接了当地还原知识的本来面目,少加或者不加个人见解,没想到居然也赢得了一众支持者。更为有趣的是,若是所谈内容距代码现场甚远,则大家更是听的津津有味,会后我常常被人缠住问个不停,有些问题是他们在工作中遇到的,期望我能给一些提示。可见,在结构化的知识宝库面前,人的求知欲会强烈地迸发出来,就像孩子面对一朵朵蓬松美丽的棉花糖,已不满足于仅仅看着了,更渴望把它吃到嘴里细细品味。记得有一次,我在J区华大教室做完《编程之路》的讲座,最后一排站起来一位帅哥,他问我怎么才能学好Linux。我建议他不要看那些讲内核的书,先认真读一遍《UNIX环境高级编程》。他比较疑惑,觉得这样会不会太慢?因为他们的项目要做一些内核的开发工作,而他目前对此还一无所知。我告诉他,快速原型法或许可以短平快地解决某些具体问题,但要真正掌握内核就必须自顶向下地学习,因为操作系统是拿来用的,先理解用户的需求再考虑怎么实现它,这样的学习过程才是符合自然规律的。事实上,自然的学习过程适合一切知识,也包括本文及之后系列文章即将详细介绍的C语言。

C语言是什么?

这是一个非常有意义的问题,也常常被我拿来当成讲座的开场白。每到此时,台下总会有人调皮地说:'C语言就是B语言的儿子。'然后哄堂大笑。不幸的是,即便从最严格的意义上看,这个说法也是正确的。大约在1967年,一位叫Martin Richards的英国计算机科学家致力于软件可移植性的研究,他发明了一种叫做Basic Combined Programming Language的编程语言,也就是计算机专业的学生们所熟知的BCPL。虽然这个语言依旧是无类型(typeless)的,但它引入了一个在当时非常先进的设计--前后端的划分。前端(front end)解析(Parse)源代码,生成(Generated)O-code,这是Martin Richards精心设计的伪机器码,现在称之为虚拟机代码或中间描述层(IR)。它带来的好处是后端仅需做少量的修改就能把O-code进一步转换(Translated)成真实的目标机器码。这种设计很快便被其它语言的编译器所采纳并流行至今。

C语言的前世今生(上)

到了1969年,贝尔实验室一位非常牛逼的始祖级计算机科学家Ken Thompson希望为野心勃勃的Multics工程发明一款轻量级的语言,他精简了BCPL,然后把这个语言叫做B,意思是去掉了无用的尾巴之后的BCPL。B语言依然是无类型的,但它已经非常接近后来的C语言。譬如,Ken发明了算术赋值运算符,把变量b的值加到变量a可以写成 a =+ b。在C语言里,写法是a += b,是不是很相似呢?另外,B语言支持自加(++)和自减(--)运算,用==表示比较运算,用=表示赋值等等。由于是无类型语言,编译器必须知道何时执行数值运算,何时执行地址运算。B语言用唯一的类型--计算机字和运算符的组合解决了这个问题。当操作数(变量)被用于诸如四则运算时,它就是整数,否则是地址。有了地址就必须解引用,这就是C语言指针的雏形。

C语言的前世今生(上)

B语言在当时的DEC PDP-7上工作良好,但随着PDP-11的诞生,无类型的B语言不能优雅地处理字节数据类型(它的内部运算都是integer),而这恰恰是新的计算机硬件最突出的特性。贝尔实验室的另一位大佬,也是Ken Thompson的好基友Dennis Ritchie终于无法忍受,他迫切需要一种更为强大的语言以便把UNIX移植从PDP-7上面移植过来。大师的牛逼之处就在于此,他既没有去网上发帖抱怨,也没有去找风投说概念拉团队。而是自己动手,对B语言做了深入的优化,添加了丰富的数据类型并用它重写了UNIX,一款改变计算机历史的语言就这么诞生了。直到1971年,Ritchie仍然称这个语言为'New B'简写为'NB'(大师也知道自己的牛逼之处啊)。随着新语言的不断被改进,类型系统越来越丰富,例如可以写这样复杂的声明:int *api[10], (*pai)[10]; Ritchie觉得是时候自立门户了,于是,在1972年,大师说:'I felt that it deserved a new name; NB seemed insufficiently distinctive. I decided to follow the single-letter style and called it C'。

从此,C语言就开始了长达四十年的统治地位。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多