我们能够从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

相关文章

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

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

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

Go语言利用泛型封装常见的Map操作

《Go语言利用泛型封装常见的Map操作》Go语言在1.18版本中引入了泛型,这是Go语言发展的一个重要里程碑,它极大地增强了语言的表达能力和灵活性,本文将通过泛型实现封装常见的Map操作,感... 目录什么是泛型泛型解决了什么问题Go泛型基于泛型的常见Map操作代码合集总结什么是泛型泛型是一种编程范式,允

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

基于Go语言实现一个压测工具

《基于Go语言实现一个压测工具》这篇文章主要为大家详细介绍了基于Go语言实现一个简单的压测工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录整体架构通用数据处理模块Http请求响应数据处理Curl参数解析处理客户端模块Http客户端处理Grpc客户端处理Websocket客户端

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英