丹尼斯·里奇:让乔布斯立足肩上的 C 语言之父

2023-10-22 08:50

本文主要是介绍丹尼斯·里奇:让乔布斯立足肩上的 C 语言之父,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

不知不觉, 丹尼斯·里奇离开我们 4 周年了。2011年10月12日,和里奇共事 20 多年的同事 Rob Pike 从加州到新泽西去拜访他,才发现他已经去世了。由于是独居,当时无法知道准确的死亡时间,后来确定离世日期是10月9日。据他的兄弟透露,那几年丹尼斯·里奇的健康状况一直不好,他患有前列腺癌和心脏病。


120108_eIlD_2370092.jpg


乔布斯和丹尼斯·里奇都是在同年同月离世。但之后每年的这段时间,很多媒体都会纪念乔布斯,但很少提到丹尼斯·里奇。


去年的纪念文章:《媒体记住了乔布斯,但我们不能忘了他……》



-----【下面是今年的纪念文章】-----


如果没有丹尼斯·里奇(Dennis Ritchie),就不会有我们现在所熟知的现代计算。他是 C 语言之父和 UNIX 操作系统的联合发明人。四年前我们失去了两位对业界有巨大影响的人。


不可否认,乔布斯带给我们世上从未见过的创新和标志性的产品,还有一大批对他顶礼膜拜的狂热消费者和终端用户。诸如此类的事情可能再也看不到了。


尽管我对乔布斯和他的公司有看法是有据可查的,当他去世时,我和很多业界的人一样表达了我的敬意和对他的影响力的认可。


但是苹果和乔布斯以及很多其他公司所创造的“神奇的”产品,和所有现在我们了解和写在现代计算里的东西,都要归功于丹尼斯·里奇,他于 2011 年 10 月 12 号离开人世,享年 70 岁。


丹尼斯·里奇何许人也?


普通年轻人可能都要摇头。丹尼斯·里奇是谁?


丹尼斯·里奇不像某位来自硅谷,精致的和少年得志的亿万富翁,穿着简约黑色的高领毛衣在站满粉丝的屋子里,演示新酷产品和恶意攻击对手。


不,丹尼斯·里奇是一位胡子有些凌乱的计算机科学家,他穿着羊毛衫坐在一间凌乱的办公室里。


和乔布斯在大学辍学不同,他毕业于哈佛大学,有物理学和应用数学的博士学位。他工作于新泽西的 AT&T 贝尔实验室,而不是闪闪发光的硅谷。


是的,就是 “What exit?” 的新泽西。(编注:“What exit?”是新泽西当地俚语,Garden State Parkway 是一条南北走向的高速公路,它穿过整个新泽西州,所以是一个很有用的地标。新泽西当地人问地方都问从这条高速的哪个出口出来就可以到达。)


鉴于乔布斯古怪的个性又极富创造力,人们经常把他和爱迪生作比较。我不赞同这种比较,因为实际上我们错把乔布斯当做一个真正的技术专家和发明东西的人。


有一件重要的事情我们必须要意识到:尽管乔布斯有他擅长的事情,而且他为技术和计算机业界做出很大的贡献,但事实上他并不是一个技术专家。


他对于时尚和工业设计的确很有感觉,他理解用户想要什么,他还是一个营销大师和推销员。所有这些让他成为业界的巨人。


但是说到发明家?不,他不是。


但是丹尼斯·里奇发明了和共同发明了两个关键的软件技术,它们是构成每一款计算机软件产品的DNA,现在我们直接或间接都在使用这些软件产品。这听起来让人难以置信,但它确实是真的。



首先,让我们从《 C 程序设计语言》开始


C 语言是里奇在 1969-1973 开发的,它被认为是第一个真正意义上可移植的现代编程语言。自它诞生差不多 45 年以来,它已经被移植到几乎每一个出现过的系统架构和操作系统上。


因为它是一种命令的、编译的和程序化的编程语言,它允许语法变量作用域和递归,允许内存的底层访问,还有复杂的 I/O 和字符串操作功能,这种语言变得相当通用。


里奇和布莱恩·克尼汉(Brian Kernighan)对它进行了一定程度的优化,最终于 1989 年被美国国家标准协会的 X3J11 委员会进一步细化为 ANSI C 程序设计语言。


1978年,克尼汉和里奇合著出版了《C 程序设计语言》这本书。该书被很多人简称为 “K&R C” ,是计算机科学的杰作,它也是解释现代程序设计概念的一个关键参考,甚至到今天,它还是计算机科学课程里学习程序设计的经典教材。




直到今天, ANSI C 作为一种编程语言还被大量地使用,后来它还发展出很多的姊妹语言,这些语言又都有很多的追随者。


最流行的 C++ 是由本贾尼·斯特劳斯特卢普(Bjarne Stroustrup) 于 1985 年发明,它增加了面向对象编程和类的支持,用在各式各样的操作系统上,包括像 Linux 和 Mac 这样的 UNIX 衍生品上,它作为微软 Windows 软件开发的主要编程语言长达20多年。


Objective-C,是由达石软件(Stepstone,Lumesse(路敏思)的前身)的布莱德·考克斯(Brad Cox) 和 Todd Love 在八十年代发明的,增加了 Smalltalk 消息传递功能,进一步拓展了这种语言面向对象和代码重用的特性。


Objective-C 很大程度上被认为是一个鲜为人知的 C 语言衍生品,直到它在八十年代末和九十年代初被广泛用于 NeXT 计算机系统公司的 NeXTStep 和 OpenStep 操作系统上,NeXT 是乔布斯在 1985 被赶出苹果公司后所创办的。


“下一个”发生了什么就是一段计算机领域的传奇。NeXT 于 1996 年被苹果公司收购,乔布斯在 1997 年重新回归苹果并出任公司的CEO。


2001 年苹果发布了 Mac OS X,其中大量使用了 Objective-C ,以及 NeXTStep 和 OpenStep 所引入的面向对象技术。


当 C++ 也被大量应用在 Mac 上,Objective-C 被用来在 XCode IDE 下编写本地面向对象的 “Cocoa” API ,这些 API 是 iOS 上手势识别和动画功能的核心,这些功能为 iPhone 和 iPad 增光不少。


Objective-C 还提供了 Foundation Kit 和 Application Kit,用于构建本地的 OS X 和 iOS 应用程序。


微软也有自己的 C 语言衍生品—— C# (读作 “C Sharp”),于 2001 年发明并作为 .NET 框架的编程基础。


C# 还是编写基于 Windows 运行时(WinRT)的现代应用程序的基础,WinRT 在 Windows 10上发展成统一的Windows 平台(UWP, Universal Windows Platform)。作为开发 Mono(一个.NET 框架的可移植版本)的编程环境,它也被用在 Linux 和其他 Unix 衍生系统上。


但是 C 语言的影响并不仅局限在它的衍生品上。Java 这样一个重要的企业级编程语言,在很大程度上也是基于 C 语言语法(本身也演变为 Dalvik 和 Android 运行时,它们是 Android 最基本的编程环境)。


其它语言例如 Ruby、Perl 和 PHP 等,它们是构成动态现代网络的基础,也都使用了丹尼斯·里奇发明的 C 语言语法。


所以说如果没有丹尼斯·里奇的工作,我们根本就不可能有现代的软件。


除了 C 语言,他还有 Unix


只谈 C 语言对于现代计算的重要性和它对于每个人的影响,我其实就可以结束这篇文章。但这个人的工作生涯我才讲了一半而已。


里奇还是 UNIX 操作系统的共同发明人。当然 UNIX 的原型是用汇编语言编写,到七十年代早期就完全用 C 重写了。


早在1969年,在一台 DEC PDP-7 上引导了第一个版本的“Unics”,从那开始 UNIX 已经演变出很多类似的操作系统,并运行在各种各样的系统架构上。


每一个主要的计算机供应商都曾经实现过自己的 UNIX。甚至连微软也曾经拥有一个叫做 XENIX 的产品,后来卖给了SCO(已经不存在了)。


你可点击和放大看这张图,可更好地理解这个“家族”。



UNIX 本质上有三个主要分支:


第一个分支是“System V” UNIX,现在我们知道的有 IBM的AIX、Oracle的Solaris 和 惠普的 HP-UX。这些被认为是“大家伙”的操作系统被广泛应用于世界财富 1000 强的大企业里,驱动着关键的、面向交易的商业应用和数据库。


没有 System V UNIX,那些被财富杂志 1000 强的企业不可能完成任何事情。商业都几乎停滞了。它们也许只占任何特定企业百分之十到二十的计算能力,但是这百分之二十相当重要。


第二个分支是BSD (伯克利系统发行版),包含FreeBSD、NetBSD 和 OpenBSD,这些都是 Max OS X 和 iOS 的基础。它们也被用于支持关键的基础设施骨干上,互联网就运行在上面。


第三个分支甚至不能算作一个分支——GNU/Linux。Linux内核(Linus Torvalds开发的)加上 GNU 用户空间程序、工具和实用程序,提供了一个完全重新实现的“类似UNIX” ,或者说“兼容UNIX”的操作系统。


当然 Linux 也是所有 UNIX 操作系统里最具破坏力的。从非常小的嵌入式微处理器到智能手机、到平板和桌面电脑,甚至强悍的超级计算机都可以看到它的身影。


IBM 的 Watson 就是这样一台 Linux 超级计算机,在《冒险吧!》的众目睽睽下甚至打败了Ken Jennings。


但我们还是要认识到 Linux 和 GNU 没有包含任何 UNIX 代码——因此有自由软件的递归短语 “GNU’s not UNIX”。(译者注:GNU是GNU’s Not UNIX的缩写,GNU’s not UNIX => (GNU’s Not UNIX)’s Not UNIX => ((GNU’s Not UNIX)’s Not UNIX)’s Not UNIX => …,有兴趣的话还可以找找其它的,比如 PHP、XNA等等)


但 GNU/Linux 在设计上表现得很像 UNIX,可以说如果没有里奇和他在贝尔实验室的同事们(Brian Kernighan、Ken Thompson、Douglas Mcllroy 和 Joe Ossanna)一起率先开发出 UNIX,也就不会有什么 Linux 或者任何一个开放源代码软件运动。


从这个意义上说,自由软件基金会或者 Richard Stallman 很高兴看到乔布斯离开了。


我们亏欠丹尼斯·里奇很多


虽然存在宗教和意识形态的差异。但我们亏欠丹尼斯·里奇很多,超出我们的想象。没有他的贡献,现在我们没法用个人计算机,成熟的软件应用甚至是互联网。


没有 Android 智能手机,没有昂贵的 DVR 和流媒设备,没有乔布斯和苹果创造令人惊叹的 Mac 和 iPad。


没有微软的Windows 10 和 Surface Book。


没有云计算、没有AWS(亚马逊网络服务,Amazon Web Services),没有 Azure(微软云)。


没有“为 XX 而生的应用程序”,也没有互联网这个东西。


向丹尼奇·里奇致敬 —— 感谢他带给我们这些技术,让我们可以成为今天的专家。



转载于:https://my.oschina.net/u/2370092/blog/515787

这篇关于丹尼斯·里奇:让乔布斯立足肩上的 C 语言之父的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

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

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

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

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

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

C语言线程池的常见实现方式详解

《C语言线程池的常见实现方式详解》本文介绍了如何使用C语言实现一个基本的线程池,线程池的实现包括工作线程、任务队列、任务调度、线程池的初始化、任务添加、销毁等步骤,感兴趣的朋友跟随小编一起看看吧... 目录1. 线程池的基本结构2. 线程池的实现步骤3. 线程池的核心数据结构4. 线程池的详细实现4.1 初

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而