我们能够从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语言的创造者身上学到什么东西?(转)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/weixin_30681121/article/details/99642017
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/485727

相关文章

Go 语言中的 Struct Tag 的用法详解

《Go语言中的StructTag的用法详解》在Go语言中,结构体字段标签(StructTag)是一种用于给字段添加元信息(metadata)的机制,常用于序列化(如JSON、XML)、ORM映... 目录一、结构体标签的基本语法二、json:"token"的具体含义三、常见的标签格式变体四、使用示例五、使用

Go语言使用slices包轻松实现排序功能

《Go语言使用slices包轻松实现排序功能》在Go语言开发中,对数据进行排序是常见的需求,Go1.18版本引入的slices包提供了简洁高效的排序解决方案,支持内置类型和用户自定义类型的排序操作,本... 目录一、内置类型排序:字符串与整数的应用1. 字符串切片排序2. 整数切片排序二、检查切片排序状态:

基于Go语言实现Base62编码的三种方式以及对比分析

《基于Go语言实现Base62编码的三种方式以及对比分析》Base62编码是一种在字符编码中使用62个字符的编码方式,在计算机科学中,,Go语言是一种静态类型、编译型语言,它由Google开发并开源,... 目录一、标准库现状与解决方案1. 标准库对比表2. 解决方案完整实现代码(含边界处理)二、关键实现细

如何合理管控Java语言的异常

《如何合理管控Java语言的异常》:本文主要介绍如何合理管控Java语言的异常问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍2、Thorwable类3、Error4、Exception类4.1、检查异常4.2、运行时异常5、处理方式5.1. 捕获异常

C语言中的常见进制转换详解(从二进制到十六进制)

《C语言中的常见进制转换详解(从二进制到十六进制)》进制转换是计算机编程中的一个常见任务,特别是在处理低级别的数据操作时,C语言作为一门底层编程语言,在进制转换方面提供了灵活的操作方式,今天,我们将深... 目录1、进制基础2、C语言中的进制转换2.1 从十进制转换为其他进制十进制转二进制十进制转八进制十进

$在R语言中的作用示例小结

《$在R语言中的作用示例小结》在R语言中,$是一个非常重要的操作符,主要用于访问对象的成员或组件,它的用途非常广泛,不仅限于数据框(dataframe),还可以用于列表(list)、环境(enviro... 目录1. 访问数据框(data frame)中的列2. 访问列表(list)中的元素3. 访问jav

C语言中位操作的实际应用举例

《C语言中位操作的实际应用举例》:本文主要介绍C语言中位操作的实际应用,总结了位操作的使用场景,并指出了需要注意的问题,如可读性、平台依赖性和溢出风险,文中通过代码介绍的非常详细,需要的朋友可以参... 目录1. 嵌入式系统与硬件寄存器操作2. 网络协议解析3. 图像处理与颜色编码4. 高效处理布尔标志集合

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带