我们能够从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语言中%zu的用法解读

《C语言中%zu的用法解读》size_t是无符号整数类型,用于表示对象大小或内存操作结果,%zu是C99标准中专为size_t设计的printf占位符,避免因类型不匹配导致错误,使用%u或%d可能引发... 目录size_t 类型与 %zu 占位符%zu 的用途替代占位符的风险兼容性说明其他相关占位符验证示

C语言进阶(预处理命令详解)

《C语言进阶(预处理命令详解)》文章讲解了宏定义规范、头文件包含方式及条件编译应用,强调带参宏需加括号避免计算错误,头文件应声明函数原型以便主函数调用,条件编译通过宏定义控制代码编译,适用于测试与模块... 目录1.宏定义1.1不带参宏1.2带参宏2.头文件的包含2.1头文件中的内容2.2工程结构3.条件编

Go语言并发之通知退出机制的实现

《Go语言并发之通知退出机制的实现》本文主要介绍了Go语言并发之通知退出机制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、通知退出机制1.1 进程/main函数退出1.2 通过channel退出1.3 通过cont

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码