我们能够从C语言的创造者身上学到什么东西?(转)

2023-12-12 19:40

本文主要是介绍我们能够从C语言的创造者身上学到什么东西?(转),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

正如我们本周早些时候提到过,UNIX的奠基者之一、C语言的创建者,丹尼斯·里奇(Dennis Ritchie)上周去世了。尽管我感觉计算机科学和相关领域的许多人都了解里奇的重要性—一切与计算有关的东西,其成长和发展都跟里奇息息相关,但是我认为,回顾他的成就,把他高高放进Lovelace和图灵以及最近去世的乔布斯(尽管这一说法会引起争议,但起码等到历史有公论再说吧)早已入住的计算机科学先贤祠上会更有价值。

UNIX是最早的多用户操作系统之一,它使得科学家和研究人员得以分享计算机的时间,而这种设备在传统上是以批处理的方式操作的。多用户及多任务的概念之所以会引起研究人员极大的兴趣,仅仅是因为批处理程序所需的编写、运行以及收到输出所需的时间。而在批处理模式下,计算机的时间是非常昂贵的,从这里的一则奇闻轶事中可见一斑:

1969年,在仔细考虑了操作系统的问题之后,汤普森(Ken·Thompson,Unix创造者之一)利用闲暇时间开发出一个名为“太空旅行”的计算机游戏。该游戏模拟了太阳系行星的运动。玩家可以在行星之间漫游,享受其中的风景,甚至让飞船登陆到行星和月球上。

起初的时候,这款游戏是在Multics上面写出来的,然后再被编译成了Fortran语言,在一台加载GECOS操作系统的GE 635计算机上面跑。但是游戏的显示很不稳定,也很难控制,因为玩家必须输入命令来控制飞船。还有,在这台庞大的GE 635机器上,其所占用的CPU时间需要花费掉75美元,这样的成本是难以承受的。

玩一次游戏要花掉75美元,尤其是按照上世纪六十年代的货币水平,对于一名黑客来说,从中就几乎找不到丝毫的乐趣了。里奇和汤普森于是一起开发出了UNIX,让它成为黑客的乐园,在那里可以对小程序进行测试并分享其结果。他是一位专业的物理学家和数学家,但却在一个恰当的时间进入到了大型机和微型计算机的混沌初期世界里。上世纪六七十年代正是计算与世界的交互发生巨变之时。然而当时的普遍看法是“这些该死的计算机快要把我的电话账单给搞砸了”,事实上,计算机破坏了当时的现状。短短几年的时间里,纸面记录的地盘慢慢地被计算、电话交换机所侵蚀,从忙乱、蒸汽朋克的八爪章鱼慢慢变成准机械式的由路由器和终端构成的系统。贝尔实验室活跃在最前沿,承担着用铜线连接世界的任务。最重要的是,他所做的事情是非常困难的,这种困难,在今天用拖拽和自动完成功能的IDE搞开发的我们已经遗忘了。

UNIX的关键是共享概念。该操作系统始于1969年,是对贝尔实验室关闭了汤姆森和里奇都非常喜欢的操作系统Multics做出的反应。在包括MIT在内的多个组织的配合下,新泽西贝尔实验室的4人程序员组在一台疏于管理的PDP-7机器上开始了工作,他们在这台机器上移植了太空旅行,然后为了保存游戏又建立了一个文件系统。慢慢地,围绕着这一文件系统,一个对现代Linux熟悉的人都能够理解的命令结构就增生成形了。UNIX这个词慢慢地就从一小撮原始用户嘴里点点滴滴地透露了出来,1971年的时候,贝尔实验室专利申请办公室开始用它来排版文档,以便用nroff(将文本文件格式化为打印机所需要的格式的UNIX命令)来打印。

李纳斯·托沃兹(Linus Torvalds,LINUX创造者)是在1969年出生的,注意到这一点也很重要,这让他成为从所谓的UNIX时代获得好处的主要候选者。出生自一个新行业骚动喧嚣的时代很重要,盖茨、托沃兹,还有里奇都是极佳的证明。

里奇继续做出了若干其他的改进,并在开发这款C写成的操作系统时,为世界提供了首份多机器、交叉兼容的编码标准,这份标准让任何一个人,从白发苍苍的机器语言老手,到赫尔辛基的年轻学生,都能够理解和使用。即便AT&T拒绝提供给教育机构,但是此后UNIX源码还是像圣经一样从一位程序员之手传到了另一位程序员之手。这份源码是用C语言编写的,为了节省时间和周期,更重要的是,为了里奇和汤普森在思想交流中孜孜不倦的教诲—保持优雅,其中的部分核心组件则是由机器语言完成。没有一个人,甚至包括里奇本人在内,能够理解那头野兽的复杂性,最后它成为了UNIX,设计如此。其目标是,简单在前,复杂性在后,这是一个搞计算的人都能很好地效仿的模式。

实现清晰和优雅的美好理想,这种渴求也很重要。“在编码技巧上,随着更好或更多的基本观念的出现,同辈的压力和简单的荣耀使得代码块被重写或丢弃”,UNIX团队成员之一的Doug McIlroy写道:“同业相争和保护地盘几乎是闻所未闻:出现了那么多的好东西,以至于没有人需要对创新申请专利”。

问题是,在开发我们自己的产品时,我们能够从这位计算机界的巨人身上学到些什么东西呢?首先,里奇和汤普森想要获得乐趣。他们没有要去赚钱的原生动力,实际上,他们的目标是省钱,或者起码是把自己的游戏藏起来到一台成本低一点的机器上。

其次是走出你的舒适区进行工作的必要性。里奇是一位物理学家和数学家。然而,他成为了一名程序员。尽管很显然,正如Bjarne Stroustrup(C++之父)所述,他的背景在做出UNIX和C的过程中给予了他极大的帮助,里奇并不惧怕在新的、不熟悉的领域中进行尝试。“如果丹尼斯那十年决定把时间花在晦涩的数学上,Unix也许就胎死腹中了”,他写道。

第三是对于创新无为而治的重要性。里奇是幸运的,贝尔实验室有钱也有人,让他可以躲在朋友的阴影背后,根据自己的时间安排做自己想做的东西。Google似乎已经学会了这一招,与此有异曲同工之妙,他们20%的项目是内部试验项目,加上其实验室产品,这些都会慢慢地演变成为主流工具。Google创始人几乎在该公司成立之初就允许这20%的存在,可谓是汤姆森和里奇方法论的见证。有工头在监视住的时候,大家做的都是些中庸的东西,等工头离开之后,大家就用自己的设备做出杰作来。

最后,分享也很重要。一些小型的初创企业把自己的产品严严实实地藏在NDA(禁止披露协议)之后,或者,有一些创业家对网络错误地过分热情,每每看到这些都会让我忍俊不禁。出现这种情况,很显然说明他们的想法不够新颖,也不会特别成功,其态度也不会有利于成长。我要说的是,许多最近成功的创业家并不成功,因为他们说得天花乱坠,因为他们只会玩一种花样。

可以说,当今世界上最重要的软件项目Linux之所以重要,是因为其极佳的广泛性和开放性。有一些人说开放不是利润的同义词,不过这些人往好处说属于悲观主义者,往坏处说简直就是蠢蛋。

最后,里奇教育我们,计算机界并不是一个秘密社团,需要长年服务和特别的咒语才能够加入。他对知识的慷慨解囊显而易见,在我们网上做的所有事情上都有体现,尽管他的害羞是出了名的,而他却仍然充当一名讲解员,给我们留下了海量的注释和在线说明。尽管我们当中没有人能够取得他和Bell/AT&T团队那样的成就,尤其是考虑到他们当时的环境,所处的相对是信息时代起源的时间背景,现在取得不了那样的成就也没关系。毕竟,正如我们这些年来从UNIX源码所学到的东西那样:

*你不需要去理解它。

只需在它上面做就行了。

Via:TC

除非注明,本站文章均为原创或编译,转载请注明: 文章来自36氪

转载于:https://www.cnblogs.com/hakerr/archive/2011/10/22/2220999.html

这篇关于我们能够从C语言的创造者身上学到什么东西?(转)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/485727

相关文章

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时

使用C语言实现交换整数的奇数位和偶数位

《使用C语言实现交换整数的奇数位和偶数位》在C语言中,要交换一个整数的二进制位中的奇数位和偶数位,重点需要理解位操作,当我们谈论二进制位的奇数位和偶数位时,我们是指从右到左数的位置,本文给大家介绍了使... 目录一、问题描述二、解决思路三、函数实现四、宏实现五、总结一、问题描述使用C语言代码实现:将一个整

C语言字符函数和字符串函数示例详解

《C语言字符函数和字符串函数示例详解》本文详细介绍了C语言中字符分类函数、字符转换函数及字符串操作函数的使用方法,并通过示例代码展示了如何实现这些功能,通过这些内容,读者可以深入理解并掌握C语言中的字... 目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2st

Go语言中最便捷的http请求包resty的使用详解

《Go语言中最便捷的http请求包resty的使用详解》go语言虽然自身就有net/http包,但是说实话用起来没那么好用,resty包是go语言中一个非常受欢迎的http请求处理包,下面我们一起来学... 目录安装一、一个简单的get二、带查询参数三、设置请求头、body四、设置表单数据五、处理响应六、超

C语言中的浮点数存储详解

《C语言中的浮点数存储详解》:本文主要介绍C语言中的浮点数存储详解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、首先明确一个概念2、接下来,讲解C语言中浮点型数存储的规则2.1、可以将上述公式分为两部分来看2.2、问:十进制小数0.5该如何存储?2.3 浮点

基于Python实现多语言朗读与单词选择测验

《基于Python实现多语言朗读与单词选择测验》在数字化教育日益普及的今天,开发一款能够支持多语言朗读和单词选择测验的程序,对于语言学习者来说无疑是一个巨大的福音,下面我们就来用Python实现一个这... 目录一、项目概述二、环境准备三、实现朗读功能四、实现单词选择测验五、创建图形用户界面六、运行程序七、

使用Python创建一个能够筛选文件的PDF合并工具

《使用Python创建一个能够筛选文件的PDF合并工具》这篇文章主要为大家详细介绍了如何使用Python创建一个能够筛选文件的PDF合并工具,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录背景主要功能全部代码代码解析1. 初始化 wx.Frame 窗口2. 创建工具栏3. 创建布局和界面控件4

使用Go语言开发一个命令行文件管理工具

《使用Go语言开发一个命令行文件管理工具》这篇文章主要为大家详细介绍了如何使用Go语言开发一款命令行文件管理工具,支持批量重命名,删除,创建,移动文件,需要的小伙伴可以了解下... 目录一、工具功能一览二、核心代码解析1. 主程序结构2. 批量重命名3. 批量删除4. 创建文件/目录5. 批量移动三、如何安