- 我是一个线程(修订版)
- 我是一个 Java class
- Javascript:一个屌丝的逆袭
- Java : 一个帝国的诞生
- JSP 一个装配工的没落
- TCP/IP 之 大明王朝邮差
- TCP/IP 之大明内阁
- TCP/IP 之蓟辽督师
- CPU 阿甘
- CPU 阿甘之烦恼
- CPU 阿甘:函数调用的秘密
- 我是一个网卡
- 我是一个路由器
- 我是一个进程
- 我是一块硬盘(上)
- 我是一块硬盘(下)
- 我是一个键盘
- 张大胖的 socket
- 张大胖学递归
- 学习面向对象的令狐冲
- 张大胖学数据库
- 数据库村的旺财和小强
- 小李的数据库之旅(上)
- 小李的数据库之旅(下)
- 漫画:什么是机器学习?
- 那些烦人的同步和互斥问题
- IE 为什么把火狐和 Chrome 给打伤了?
- 对浏览器村的第二次采访
- 节约标兵 IE 的自述
- EMail 诞生记
- Email 诞生记(下)
- Http 历险记(上)
- Http 历险记(下)-- Struts 的秘密
- 动物王国的面向对象
- 冯·诺伊曼计算机的诞生
- Http Server : 一个差生的逆袭
- 张大胖的加法器
- 从 1 加到 100:一道简单的数学题挑战下你的大脑
- 编程语言
- Javascript:一个屌丝的逆袭
- 计算机语言之战
- 我和编程语言的爱恨情仇(上)
- 我和编程语言的爱恨情仇(下)
- Android 为什么选择了 Java
- iOS 为什么选择了 Object-C?
- Basic : 一个老兵的自述
- Node.js : 我只需要一个店小二
- 命令式编程 vs 声明式编程
- 编译还是解释?
- 程序人生
- “架构师"小赵
- 师兄说
- 师姐说
- 小王的架构师之路
- 小李的版本管理系统
- 小超穿越记
- 小李的 Build 之路(上)
- 小李的 Build 之路(下)
- 张大胖改 Bug
- 我的编程之路--大学趣事
- 码农小王的一天
- 小李在外企
- 张大胖的需求估算
- 从厨师到码农
- 聊一聊那些神一样的程序员们(上)
- 聊一聊那些神一样的程序员们(中)
- 聊一聊那些神一样的程序员们(下)
- 谁是互联网之父?
- 一个价值百万的创业教训
- 让自己与众不同 - 提升工作的价值
- 看看你的“易燃性”
- 从无聊的工作中寻找价值
- 什么样的学生适合报考计算机?
- 谈谈程序员的职业方向(上)
- 谈谈程序员的职业方向(中)
- 谈谈程序员的职业方向(下)
- 谈谈培训班的作用
- 码农需要知道的“潜规则”
- 学习编程的加速度
- 码农在工作中的必备能力
- 码农和英语
- 老司机经验
- 假如时光能够倒流, 我会这么学习 Java
- 假如我是计算机系老师
- 学会编程, 而不是学会 Java
- 从增删改查中突围
- 抽象:程序员必备的能力
- 懒就一个字
- 编程的自学方法
- 小王买房记
- 从一道面试题谈谈一线码农应该具备的基本素质
- 想写框架的看过来
- 苹果手机变砖头以后
- 如何快速的学习一门技术?
- 唯一不变的是变化: 谈谈微信应用号
- 什么是企业应用?
- 勿以浮沙筑高台
- 为什么敏捷开发难于成功?
- localhost vs 127.0.0.1
- GitHub/Stackoverflow 找工作时有什么用?
- 动词 or 名词 :这是一个问题
- 如何选择入行语言
- 有时候,沉默是金
- 零 Bug 的代码是怎么炼成的?
- 浮点数为什么不精确?
- 文章错误大全
- Open Source--不要为了开源而开源
- 一不留神,代码就腐化了
- 先做个“键盘侠”, 再来写程序
- 不加断点调试的程序员是好程序员
- 码农必备技能:烂代码的处理之道(上)
- 码农必备技能:烂代码的处理之道(下)
- 学习数据结构有用吗?
- 从现在开始,丰富你的简历
- 那些永不过时的书,你看过几本吗?
- 学好编程必备的一个品质你知道吗?
- 你最爱的 Java
- 搞懂了这几点,你就学会了 Web 编程
- Spring 的本质系列(1) -- 依赖注入
- Spring 本质系列(2)-AOP
- 三层架构和 MVC 那点事儿
- Java 帝国之拨云见日识回调
- 小张的 Duck Typing
- JDBC 的诞生
- JDBC 后传
- 一个不安分的 JDBC 驱动
- Java 帝国之 Java bean (上)
- Java 帝国之 Java bean(下)
- Java 帝国之函数式编程
- Java 帝国之函数式编程(下)
- 关于 Java 初学者需要知道的 10 件事
- JUnit 你不知道的那些事儿
- 圣诞礼物:Java EE 的历史
- Java EE 读书指南
- 给小白的 Java EE 指南
- 给小白的 Java EE 指南(2)
- 给小白的 Java EE 生存指南(3) : XML
- 给小白的 Java EE 生存指南(4) : 一只叫 Tom 的猫
- 给小白的 Java EE 指南(5) : AJAX
- 给小白的 Java EE 生存指南(6) :Java 反射
- 闲聊
- "饿了么"初体验
- 来自大脑的控诉
- 一个高中生是怎么玩自媒体的?
- 尝试 分答
- 到底应不应该上培训班?
- 自学编程中遇到问题怎么办?
- 据说 99%的初级程序员看完后都不迷茫了
- 一行代码引发的“血案”
- 对一个死锁问题的思考
- 通过外包进入名企
- 请开往十年前的今天
- 为什么自学中最好有个师傅指导一下?
- 这个网站值得你花时间投入
- 为什么你无法坚持自学编程?
聊一聊那些神一样的程序员们(中)
今天再来谈谈另外两个大牛 肯·汤普逊(Kenneth Lane Thompson)、丹尼斯·里奇(Dennis MacAlistair Ritchie), Unix 和 C 语言之父 , 1983 年 ACM 图灵奖的获得者。理由是他们“研究发展了通用的操作系统理论,尤其是实现了 UNIX 操作系统”.
注意后半句, 搞计算机的多少都会有一点 OS 情节,总是梦想是自己也能做一个 OS ,我也是这样。 可对大多数人来说,这是梦想而已,因为现代的操作系统 太复杂,太庞大,你即使精通理论,实现的工作量远远超出了一个人的能力范围。
但是两位老兄竟然自己卷起袖子,带头编写了一个千古流芳的操作系统(Unix 的重要性和影响力这里就不用啰嗦了, 反正它和它的变种们已经统治了服务器端和手机端),我们看看第一版是怎么出炉的:
1968 年 ,两人被贝尔实验室派到 MIT 去参加一个 ARPA 出资的项目,开发一个分时的操作系统 MULTICS (支持多任务并发运行,这在 60 年代可是很稀罕的), 在项目完成前不久,贝尔因为开发费用太大,而开发成功希望不大而把他们调回贝尔,两人深感沮丧。
回到贝尔以后,面对实验室落后的仍以批处理工作的计算机环境,他们非常怀念 MULTICS,决定自己动手改造,创造一个“舒适的,愉快的工作环境” 。 但是贝尔实验室因为退出了 MULTICS , 更不会出钱来支持他们。
1969 年 万般无奈的 Thomason 在库房里发现了一个弃之不用的 PDP-7 , 大喜过望,立刻开始实施他们的计划。但是 PDP-7 实在是老掉牙了, Thomason 又借口帮助公司开发一个字处理系统来处理专利申请书 , 冠冕堂皇的申请到一个新的,设备完善的 PDP-11 , 这才使开发工作顺利开展。
他们以极大的热情和极高的效率投入工作,使用汇编语言, 开发基本上以每个月一个模块(内核,文件系统,内存管理,I/O。。。) 的速度推进 !
请注意关键字,1. 汇编语言,2. 每月一个模块。
每次我看到这里,不由的倒吸一口凉气, 这实在是一个细思极恐的事情。
学过汇编的都知道,汇编只不过是二进制语言的一些助记符而已,连最基本的函数封装都没有,想做个循环必须用 goto , 记得大学时学汇编,写个简单的读取键盘输入,在屏幕上回显都很费劲。
可是这两位老兄竟然用汇编实现了操作系统, 并且一个月就能搞定内核,再用一个月就能搞定文件系统,你能想象得到他们到底有多牛吗?
有人可能要问了,为什么不用 C 语言呢? 答案很简单,C语言这时候还没有被他们俩发明。
Unix 在 PDP-11 上实现以后,两人很快就发现移植性很差, 这是当然,汇编语言嘛,高度依赖硬件。
他们试图用一个高级语言来重写,先选择了 BCPL(简称 B 语言) ,然后又尝试 PASCAL ,发现都不行,它们都不太贴近硬件操作。 于是两个人(主要是 Dennis Ritchie) 决定自己开发一套新的语言:这就是大名鼎鼎的 C 语言。
C 语法简洁,对计算机模型做了良好的抽象,能够直接对内存操作,并且保持了很好的移植性。
C 的语法风格深 深地影响到了他的那些著名的后辈们 C++, Java , C# ...... 都采用了大括号作为方法体的开始和结束,都使用分号来分开 statement , 至于 if .. else , while , switch 等基本控制语句几乎一样, 甚至连注释的风格都差不多。 由此可见 C 的影响力和历史地位。
Dennis Ritchie 用 C 语言重写了 Unix , "重写"说起来简单,实际上并不是简单的汇编到 C 语言的翻译, 这里边包含了很多的发明和创造。
重写过的 Unix 很快就流行起来,40 多年过去了,虽然出现了很多的类 Unix 系统,例如 Linux, 但是他们都继承了 Unix 中的基本思想, 并且发扬光大。
关于 Unix 有个很有趣的故事,传说 KenThompson 在贝尔实验室,大摇大摆的走到任何一台 Unix 机器前,输入自己的用户名和密码,就能以 root 的方式登 录! 贝尔实验室人才济济,另外一些大牛发誓要把这个漏洞找出来,他们通读了 Unix 的 C 源码,终于找到了登录的后门, 清理后门以后编译 Unix , 运行, 可是 Thompson 还是能够登录进去。
有人觉得可能是编译器中有问题,在编译 Unix 的时候植入了后门, 于是他们又用 C 语言重新写了一个编译器,用新的编译器再次编译了 Unix, 这下总算天下太平了吧。
可是仍然不管用, Thompson 依然可以用 root 登录,真是让人崩溃 !
后来 Thompson 本人解开了秘密,是第一个 C 语言编译器有问题, 这个编译器在编译 Unix 源码的时候,当然会植入后门, 这还不够,更牛的是,如果你用 C 语言写了一个新编译器,肯定也需要编译成二进制代码啊,
用什么来编译,只有用 Thompson 写的那第一个编译器来编译,好了, 你写的这个编译器就会被污染了
你的编译器再去编译 Unix , 也会植入后门 :-)
KenThompson 和 Dennis Ritchie 绝对是两位超级程序员, Thompson 后来加入 Google ,和 Rob Pike (另外一个大牛) 等人一起创造了 Go 语言, 我在这里大胆的预测一下,Go 语言将来在系统编程领域会替代 C 语言。 Dennis Ritchie 2011 年去世,享年 70 岁。
来一张获奖照吧,两个大胡子,经常分不清谁是谁,右边那位大家肯定都认得,克林顿同学给他们颁发国家技术奖
预告:下期介绍发明 C#的 Anders , 八卦一下 Microsoft 和比尔盖茨 , 敬请期待!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论