标签 Unix 下的文章

华为称 HMS 已成为全球第三大移动应用生态,有 230 万开发者

2020 年初,华为在海外市场正式发布了 HMS(华为移动服务),用来代替谷歌 GMS。3 月 31 日下午,华为举行了线上发布会,华为公司轮值董事长胡厚崑表示:“2020 年 HMS 已经成为全球第三大移动应用生态,2020 年年底全球注册开发者 230 万,其中国外 30 万,扩展应用超过 12 万个。”华为此前曾公布,截至去年 12 月,HMS 已经在 170 个国家和地区覆盖 5 亿月活用户。

此外,华为还表示鸿蒙 OS 目前已吸引到超过 20 家硬件厂商、280 家应用厂商共同参与生态建设。

Google 从 Android 设备上收集的遥测数据二十倍于苹果

有专家研究了 iOS 和 Android 设备向苹果和 Google 服务器发送的遥测数据。该研究发现即使用户选择退出遥测,iOS 和 Android 仍然会发送遥测数据。当新的 SIM 卡插入到设备中,相关信息会立即与苹果和 Google 共享。设备上预装的应用被发现在未启动或使用前就会连接苹果和 Google 服务器。

研发发现 Google 收集的数据二十倍于苹果。开机 10 分钟内,Pixel 手机向 Google 发送了 1MB 数据,而 iPhone 发送了 42KB;在闲置状态下,Pixel 手机每 12 小时向 Google 发送 1MB 数据,相比之下 iPhone 只向苹果发送 52KB 数据。

这智能手机简直就是一个手机厂商的一个个遥测终端啊。

SCO 继任者 Xinuos 继续对 IBM、红帽发起版权、反垄断诉讼

十年前以 UnXis 的名义围绕 SCO 集团资产组建的 Xinuos,当时表示对继续 SCO 长期以来对 Linux 的诉讼不感兴趣,但是如今又开始起诉 IBM 和红帽涉嫌违反版权和反垄断法。

这家公司在诉状中称,IBM 窃取了 UnixWare 和 OpenServer 代码,并利用所窃取的财产构建和销售与 AIX、z/OS大型机等 Xinuos 本身竞争的产品,并与红帽公司合谋瓜分市场后,随后收购了红帽公司。

SCO 集团在 2003 年也提出了类似的知识产权诉求。它认为,SCO 集团拥有 AT&T 的 Unix 和 UnixWare 操作系统源代码的权利,Linux 2.4.x 和 2.5.x 是 Unix 的未经授权的衍生物,IBM 发布 Linux 代码违反了其合同义务。

这可真是不死不休啊,哦不,连 SCO 公司都没有了也不休。

贝尔实验室把 UNIX 姊妹系统 Plan 9 的版权转让给基金会

上世纪 80 年代,UNIX 的创始人们在贝尔实验室还开发了一个新的操作系统 Plan 9,但是却并没有真正推向世界。虽然 Plan 9 中有许多划时代的发明,比如 UTF-8 字符编码是为 Plan 9 发明的,并在 Plan 9 中首次实现;提出通过文件系统提供操作系统服务的概念;Plan 9 分布式的设计要比微服务架构早十多年等等。但 Plan 9 一直只是一个概念验证型操作系统,可以用 QEMU 虚拟机运行它,也可以运行在 PC 和树莓派上。

事实上,有一个活跃的社区一直在从事 Plan 9 的开发。这个社区正在自下而上地组织起来,成立了新的 Plan 9 基金会。本周,诺基亚贝尔实验室将把 Plan 9 软件的版权转让Plan 9 基金会,并以 MIT 许可证重新发布了所有历史版本

这是一种“不实用”的操作系统,因为它实在太概念了,也没多少应用,但是确实是值得操作系统爱好者摆弄的好玩具。

全球最大比特币矿场出手买下了 NVIDIA 60% 的 CMP 矿卡

今年 2 月底,NVIDIA 宣布推出 CMP 系列矿卡,这些矿卡取消了视频输出接口,也不能运行 3D 游戏,只为挖矿而生。全球最大的比特币矿厂 Hut 8 Mining Corp 宣布他们已购买了价值 3000 万美元的 NVIDIA CMP 矿卡,定于 5 月下旬开始交付,预计将于夏季完成全面部署。这个新的挖矿系统可提供约 1600 GH/s 的算力,可用于挖以太币等加密货币。

虽然 CMP 矿卡推出也很受欢迎,但是 RTX 一样被疯抢,都是因为加密货币太火了。

攻击者入侵了 2 万台微软 Exchange 服务器,后门域名挑衅安全专家

Shadowserver 基金会是一个帮助网络所有者识别和修复安全威胁的非营利组织,它说已经发现了似乎被后门入侵的 21,248 台 Exchange 服务器。与这些服务器后门通讯的域名是一个名为 brian.krebsonsecurity.top 的域名,攻击者们用这个名字挑衅网络安全专家 Brian Krebs。虽然微软本月早些时候在紧急补丁发布中解决了这些缺陷,但是以及有大量的未打补丁的 Exchange 服务器被攻陷。

真是嚣张的攻击者,但是最主要还是企业的 IT 管理太烂了。

代码英雄讲述了开发人员、程序员、黑客、极客和开源反叛者如何彻底改变技术前景的真实史诗。

什么是《代码英雄》

代码英雄 Command Line Heroes 是世界领先的企业开源软件解决方案供应商红帽(Red Hat)精心制作的原创音频播客,讲述开发人员、程序员、黑客、极客和开源反叛者如何彻底改变技术前景的真实史诗。该音频博客邀请到了谷歌、NASA 等重量级企业的众多技术大牛共同讲述开源、操作系统、容器、DevOps、混合云等发展过程中的动人故事。

本文是《代码英雄》系列播客《代码英雄》第三季(8):C 语言之巨变音频脚本。

导语:C 语言和 UNIX 是现代计算的根基。我们这一季介绍的许多语言都与 C 语言有关,或者至少受到 C 语言的影响。但是 UNIX 和 C 都只是 贝尔实验室 Bell Labs 的几个开发人员作为秘密计划项目创造出来两个成果而已。

贝尔实验室是二十世纪中期的一个创新中心。Jon Gertner 将其描述为一个“创意工厂”。他们在二十世纪 60 年代最大的项目之一是帮助建立一个名为 Multics 的 分时 time-sharing 操作系统。Joy Lisi Rankin 博士解释了当时关于分时系统的一些宣传,它被描述为有可能使计算成为一种公共服务。大型团队投入了数年的精力来构建 Multics —— 但这并不是他们所希望的成果。贝尔实验室在 1969 年正式远离了分时系统。但正如 Andrew Tanenbaum 所描述的那样,一个由英雄组成的小团队还是坚持了下来。C 语言和 UNIX 就是这样的结果。他们并不知道他们的工作会对技术的发展产生多大的影响。

00:00:00 - 发言人 1

我们掀起了新一波的研究浪潮。我们的创造力正在延伸。

00:00:10 - 发言人 2

噪音、噪音。

00:00:13 - 发言人 1

这些人是贝尔电话实验室的设计工程师。

00:00:16 - Saron Yitbarek

在上世纪 60 年代,坐落于新泽西州默里山的贝尔实验室,是科技革新的中心。在那里,我们的未来科技迈出了第一步。在那里,贝尔实验室发明了激光与晶体管,它还是信息论的摇篮。在 1968 年,贝尔实验室的四名程序员创造了一种极具开拓性的工具,它根本地改变了我们世界运行的方式,也标志着贝尔实验室的种种创新达到了新的高峰。

00:00:53

我是 Saron Yitbarek,这里是《代码英雄》—— 一款来自红帽公司的原创播客。在一整季的节目中,我们追寻着编程语言世界中最具影响力的一些故事,现在,我们终于迎来了这一季的结尾。我认为,我们把最好的故事留到了最后。这个故事中的编程语言使本季中提到的其他编程语言成为了可能。在正好 50 年以前,C 语言在贝尔实验室被设计出来,这是一种非常基础的通用程序设计语言。它是如此的基础,以至于我们有时候都会忘记,C 语言的发明是多么意义深远的成就。

00:01:35

为了得到事件的全貌,我们需要回到上世纪 60 年代,正好在 C 语言的诞生之前。那是一个一切似乎都有可能的时代。

00:01:46 - Jon Gertner

在上世纪 60 年代,贝尔实验室简直是研究人员的世外桃源。在今天,已经很难找到与贝尔实验室相似的企业研发实验室了。

00:01:56 - Saron Yitbarek

这是 Jon Gertner,他是《 创意工厂:贝尔实验室与美国革新大时代 The Idea Factory: Bell Labs and the Great Age of American Innovation 》的作者。我们采访了 Jon,让他大家解释当时贝尔实验室的情况。为什么在上世纪 60 年代,贝尔实验室能够成为他所说的“创意工厂”呢?

00:02:15 - Jon Gertner

我想今天我们都相信——“竞争带来伟大的科技革新”,但是我不能确定这种观点的正确性,并且,其实,贝尔实验室的成就在一定程度上是与这种观点相悖的。贝尔实验室的工程师和科学家们并没有特别大的压力,但是与此同时,由于贝尔实验室在诸多的研究实验室中的地位,它又确实可以雇佣到最优秀、最聪明的研究者,并给他们足够的时间去研究感兴趣的问题,同时提供大量的资助。如果你能证明你的研究项目符合这家电话公司(LCTT 译注:指 AT&T)的目标和理念,你就能够得到经费。

00:03:00 - Saron Yitbarek

而 Jon 强调,虽然贝尔实验室是一个商业公司的产物,但它的价值观还是比较接近学术界的。通过让员工自行决定工作方式及内容,贝尔实验室实践了类似于开源社区的开放式领导原则。

00:03:19 - Jon Gertner

这是诸如苹果、谷歌与微软这样的大公司出现前的时代。计算机的历史更多的聚焦在西海岸,聚焦于 自制计算机俱乐部 Homebrew Computer Clum 这样的组织,以及从其中发展而出的企业;但是我认为贝尔实验室和那些企业一样重要。贝尔实验室坐落于一个现在看来几乎不可思议的地方:新泽西的郊区。但是,这里曾聚集了对科技突破做出了巨大贡献的科学家、研究者和计算机工程师,他们的研究成果对全世界都有惊天动地般的显著影响。

00:03:54 - Saron Yitbarek

分时 time-sharing ”就是这些惊天动地的项目之一。它的核心概念很简单,实现难度却极大。他们能构建一个能够同时由成百上千的用户使用的操作系统吗?这样的发明将会使当时的计算机领域为之震动。从 1964 年起,贝尔实验室的天才们,与 通用电气 General Electric 和麻省理工学院(MIT)合作,试图集体推进这项工作的进展。实际上,麻省理工学院在一年前已经有了相关的研究项目,即 MAC 计划 Project MAC ;但是现在,所有这些顶级团队已经团结起来,开始着手钻研大型主机分时操作系统的构建方式。

00:04:40

实际上早在 1959 年, 约翰·麦卡锡 John McCarthy 就提出了分时操作系统的概念。请收听我们 第七集 的节目获知更多细节。他设想了一种可以在多个用户之间切换其“注意力”的大型计算机。麦卡锡认定,这样的一种机器有潜力极大地拓展现有的计算机文化。让我们来设想一下吧,如果一千名用户能够同时在一台机器上工作,你就完成了对整个编程与计算机世界的民主化。现在,这支群星荟萃的团队准备着手将麦卡锡的梦想变成现实,并为他们想象中的操作系统起了一个名字 —— Multics(LCTT 译注:Multi- 前缀代表“多人的”)。

00:05:23

Multics 团队为分时操作系统进行了多年的工作,但是该项目遇到了严重的资金困难,并且在十年之后,项目仍然看不到尽头。雪上加霜的是,项目的领导者 Bill Baker 是一个化学家,对贝尔实验室的计算机科学部门并不感兴趣。除此之外,我们仍然能找到一个新的问题 —— 自尊心问题。

00:05:46 - Jon Gertner

在贝尔实验室,人们每天习以为常的一件事情就是独自工作。我的意思是,贝尔实验室的人们有一种感觉:他们认为自己拥有一切他们所需要的的人才和构思,并且拥有最先进的科技,当他们遇到值得解决的问题时,他们有能力去解决这样的问题。这种看法可能有一定合理性;但是 Multics 项目在贝尔实验室没有进展,在某种程度上也可能是因为像这样更加复杂的、合作性的工作在贝尔实验室的体系中运转不良,也不能让那里的高管们满意。

00:06:20 - Saron Yitbarek

Jon Gertner 是 《创意工厂》 The Idea Factory 一书的作者,他刚刚发表的新书是 《世界尽头的冰》 The Ice at the End of the World

00:06:32

贝尔实验室于 1969 年四月正式宣布放弃 Multics 项目,但这是否就是故事的结尾呢?就贝尔实验室而言,分时操作系统 Multics 之梦已经破灭。但是这个梦真的结束了吗?结果却并不是这样,并非所有贝尔实验室的研究人员都放弃了分时操作系统。四个顽固的拒不退让者在所有人都已放弃之后,继续坚持这一梦想,而那就是下一个故事了。

00:07:08

说实话,有些梦想太美好了,这样的梦想是很难被人抛弃的。

00:07:12 - Joy Lisi Rankin

这是一件大事业。

00:07:14 - Saron Yitbarek

这位是 Joy Lisi Rankin,她是 《美国计算机人物史》 A People's History of Computing in the United States 一书的作者。Joy 将会和我聊聊分时操作系统的理想,以及为什么分时操作系统如此不可或缺。

00:07:27 - Joy Lisi Rankin

开发分时操作系统是一件重要且极富雄心壮志的事,直到该项目开始之前,大部分上世纪 60 年代早期的分时系统在一台主机上都约有 40 至 50 个终端。因此,提升终端的数量是重要性很高的一件事,贝尔实验室的雄心很可能超出了大部分人的认知,这也是这个项目在实现最初目的的过程中碰到了不少困难的原因。但是,尽管如此,分时操作系统继续以不同的形态发展,并真正地走向繁荣;分时操作系统不仅仅在麻省理工学院得到发展,也走向了其他的地方。

00:08:09 - Saron Yitbarek

是啊。那么,当我们谈起上世纪 60 年代,是谁在推动分时操作系统的需求?你提到了麻省理工学院、通用电气公司和贝尔实验室。那么我们的关注点是商业还是学术团体?谁才是真正的推动者?

00:08:23 - Joy Lisi Rankin

我认为学术团体和商业团体共同推动了发展的进程,除此以外,一些 科学 scientific 团体也参与了这项事业,因为,正如我之前所说,分时操作系统是一种更加一对一、富有互动性的计算体验。但是从另一个角度来看,我也会说教育工作者也同样在推动这件事的发展。并且,从国家的层面上讲,当时也在进行关于创建全国性计算设施的对话。那么,基本上来说,所谓的全国性计算设施指的就是全国性的分时操作系统网络。真的,美国的思想领袖们也有这样的言论,他们认为这样的系统会是与供电、电话、供水一样的基础性服务。

00:09:08 - Saron Yitbarek

哇哦。

00:09:08 - Joy Lisi Rankin

对啊,我知道的!这确实很……

00:09:09 - Saron Yitbarek

那可真是一项大事业。

00:09:11 - Joy Lisi Rankin

那是一项非常大的事业。

00:09:13 - Saron Yitbarek

Joy 让我想起了一件事。尽管这一期节目主要聚焦于创造了 C 语言和 UNIX 操作系统的团队,但是在贝尔实验室之外,对分时操作系统的推动是一项运动,比任何一个团队都大。将计算机视为公共设施是一个非常有意义的想法,在这项事业中,有许多优秀的人物,可惜我们不能请他们来到这里,比如 Bob Albrecht 和 Martin Greenberger ,以及其他的一些杰出人物。

00:09:37

好的,在进行了一些预先说明之后,让我继续和 Joy 的对话吧。

00:09:41 - Joy Lisi Rankin

那么,当约翰·麦卡锡在麻省理工大学的演讲上首次公开的谈论分时操作系统时,他明确的将其与电力进行了比较,并说:“这是一个让所有人都能使用计算机的方式,不仅仅是在学校里和商业活动中,还在每个人的家里。”回首过去,再阅读当时的文章与档案,许多人都确信,未来会出现一种能够被规范化管理的计算公共设施。因此,人们对这种全国性的分时基础设施充满了信心和支持。

00:10:22 - Saron Yitbarek

非常有趣的一点是,在 1970 年,IBM 实际上已经退出了分时操作系统这一产业。即使是通用电气也出售了他们的大型主机部门,不过他们还仍然保留了一部分分时操作系统相关的业务。让我们简单地谈一谈这些吧,1970 年发生了什么?

00:10:39 - Joy Lisi Rankin

我认为 1970 年已经一定程度上已经成为某种标志,这也许是人为假想的标志,这一年标志着公共计算设施与分时操作系统产业的失败。从某些角度上来说,这种观点是错误的。我认为在上世纪 60 年代末期,麻省理工和 Multics 项目明显在创建一个支持上千个终端的分时操作系统上遇到了困难,而这是一个知名度极高、影响力很大的项目。在同一时期,数十个基于分时计算模型的商业项目在美国兴起并繁荣发展。这是一个科技泡沫。随后,对于分时操作系统的热情走向衰落。这不完全是因为通用电气出售了他们的计算主机业务,他们在上世纪 70 年代至 80 年代间一直保留着他们的分时计算业务,并且这一业务盈利状况良好。除此以外,当时的大学,例如麻省理工学院,也继续运行着他们的分时操作系统,直到上世纪 80 年代。

00:11:52

因此,依我之见,“分时系统只是一个在上世纪 70 年代破碎的科技泡沫”的公共记忆之所以产生,一定程度上是因为人们过多地关注了 Multics 的困境。然而,事实上来说,如果我们回到过去,看一看当时的人们如何使用分时操作系统,以及分时操作系统赢得了多少利润,了解一下分时操作系统的成功,我们就会发现,其实上世纪 70 年代正是分时系统繁荣的年代。

00:12:17 - Saron Yitbarek

现在让我们把眼光放回到贝尔实验室,由四位技术专家组成的小组想要创造他们自己的分时操作系统。他们是 肯·汤普逊 Ken Thompson 丹尼斯·里奇 Dennis Ritchie 道格拉斯·麦克劳伊 Doug McIlroy 约瑟夫·欧桑纳 J.F. Ossanna 。不过他们并不想完成 Multics,他们想要越级跳过 Multics,制作一个不受过往拖累、功能更为强大的操作系统,他们称之为 UNIX(LCTT 译注:Uni- 这个前缀代表“单一的”)。

00:12:39 - Joy Lisi Rankin

我认为 Multics 是 UNIX 的灵感来源,其原因在于,许多在 Multics 上工作的程序员是如此享受分时操作系统在编程上的优点,以至于在 Multics 陷入困境时,他们便想要创造一个属于他们自己的分时环境。这些来自贝尔实验室的程序员,他们决定构建他们自己的编程框架与分时操作系统,这就是 UNIX 的起源。

00:13:20 - Saron Yitbarek

Joy Lisi Rankin 是 《美国计算机人物史》 A People's History of Computing in the United States 一书的作者。

00:13:29

丹尼斯·里奇 Dennis Ritchie 将自己和其他三名同事称为一个 团队 fellowship 。他们几个开发者想要作为一个紧密的四人小团体而工作,并且他们需要一种能够协调他们程序设计的硬件。但是贝尔实验室已经放弃了分时操作系统的梦想,即便它是一个学术研究的世外桃源,给已经放弃的项目拨款这件事也超出了他们的底线。因此他们拒绝了使用新硬件的提议。为此事购买新的硬件太过昂贵了,为什么要冒险呢?但研究员们还是坚持了下来。

00:14:05

汤普逊和里奇要求得到一种类似 GE645 的机器,这是他们一直用来进行 Multics 相关工作的型号。当他们得知无法得到经费时,他们刚刚在纸上潦草地写下一些关于文件系统的想法。最后,他们在一个他们称之为“太空旅行”的游戏中成功地实现了他们的一些想法,这个游戏运行在 PDP7 机型上,这种机型基本上与 Commodore 64 是同一个级别的。没有贝尔实验室的支持,他们的开发是缓慢的,至少开始是这样的,是一个字节、一个字节地前进的。这四人组复活了分时操作系统之梦,以他们称之为 UNIX 的形式。

00:14:47

不过这里就是问题所在了:UNIX 操作系统是用汇编语言写成的。也就是说,他们用纸带向 PDP7 传输文件;你可以想象到,他们在缺乏理想的工具与上级的支持的情况下,努力构建这个开创性的操作系统时所遇到的困难。UNIX 已经获得生命,但还没有一种合适的编程语言能够让它歌唱。

00:15:23

开发者们初次尝试为 UNIX 设计的语言称为 B 语言,由 肯·汤普逊 Ken Thompson 编写。

00:15:30 - Andy Tanenbaum

这是 BCPL( 基础综合编程语言 Basic Combined Programming Language )的一种衍生语言。

00:15:33 - Saron Yitbarek

这位是 安德鲁·塔能鲍姆 Andy Tanenbaum 。他是阿姆斯特丹的一位计算机科学教授,也是许多书籍的作者,包括经典教材 《计算机网络》 Computer Networks 。让我们听听他讲解汤普逊的 B 语言背后的故事。

00:15:48 - Saron Yitbarek

所以说, B 语言是 BCPL 的一种衍生物?

00:15:51 - Andy Tanenbaum

BCPL 源于一种构建 CPL 编译器的企图,这种语言编写的编译器确实能够起到作用,而 CPL 基于 ALGOL 60,ALGOL 60 语言又源于 ALGOL 58。ALGOL 58 则源于对 Fortran 进行改进的尝试。

00:16:01 - Saron Yitbarek

搞明白了吗?现在的问题就是,B 语言有许多历史包袱。B 语言和它的这些前身相比,并没有太多的突破性改变,因此,B 语言不能完成让 UNIX 歌唱的挑战。B 语言中没有变量类型,对于初学者来说这是一个问题。除此以外,B 语言对应的汇编代码仍然比 B 语言编译器的 线程代码 threaded-code 技术 [1] 要快。

00:16:31 - Andy Tanenbaum

BCPL 和 B 语言只有一种数据类型,就是 双字节类型 word 。双字节类型在基于双字节类型开发的 IBM 的 704 和 709、7090、7094 机型上效果不错,但是从 360 和其它所有的小型电脑开始的机型都是基于 单字节类型 byte 的。在这种情况下,双字节类型就不是一个好主意了,它和现代计算机的匹配程度极其糟糕。因此,显然 B 语言无法解决现有的问题。

00:16:57 - Saron Yitbarek

那么,该团队之前工作使用过的所有机器都是基于双字节类型的,但是在基于单字节对象的操作上,这种类型的机器就不够好用了。幸运的是,在这个时间点上,贝尔实验室的领导们又回来加入了 UNIX 项目,他们意识到了这个团队中正在产生令人激动的进展。他们资助了一台价值 65000 美元的 PDP-11,并且这台机器不是基于双字节类型的,而是面向单字节的。现在,装备上了 PDP-11,丹尼斯·里奇能够在处理编程语言的难题时更进一步。

00:17:36 - Andy Tanenbaum

丹尼斯,以及在肯的少量帮助下,决定编写一种更加结构化新编程语言,包含其它数据类型,比如说 字符类型 char 整数类型 int 长整数类型 long 等等。

00:17:47 - Saron Yitbarek

因此,在 1971 年至 1973 年之间, 丹尼斯·里奇 Dennis Ritchie 一直在调整 B 语言。他增加了一种字符类型,并且构建了一个新的编译器,这样就不需要再使用线程代码技术了。两年结束时,B 语言已经变成了一种崭新的语言,这就是 C 语言。

00:18:08

C 语言是一种功能强大的语言,结合了高级功能和底层特性,能够让使用者直接进行操作系统编程。它的一切都是如此的恰到好处。C 语言从机器层次中进行了足够的抽象,以至于它也可以移植到其他的机型。它并非一种只能用来写写应用的语言。它几乎是一种通用的编程工具,无论是在个人电脑还是超级计算机上都十分有效,而这一点极其重要,因为个人电脑革命当时已经近在眼前。

00:18:49

团队的成员们在确定了 C 语言就是正确的道路之后,就立刻用它重写了 UNIX 内核和许多 UNIX 组件。因此,只要你想使用 UNIX,你就必须使用 C 语言。C 语言的成功与 UNIX 的成功紧密的结合在了一起。

00:19:06 - Andy Tanenbaum

C 语言的流行,其实主要不是因为它是一门比 B 语言更优秀的语言 —— 当然它确实比 B 语言优秀 —— 而是因为,它是编写 UNIX 的语言,并且当 UNIX 广泛发行的时候,它自带了一个 C 语言编译器;甚至最后它还配备了两个 C 语言编译器。那么,UNIX 受到了广泛欢迎,每个使用它的人都有了 C 编译器,而且 UNIX 的一切都是由 C 语言写成的。而 C 语言是一种相当不错的语言,它又是与 UNIX 共同出现的,那为什么还要找其他的编程语言呢?

00:19:33 - Saron Yitbarek

从这里开始, C 语言的价值开始显现。

00:19:35 - Andy Tanenbaum

由于 UNIX 是用 C 语言写成的,并且带有一个 C 语言编译器,C 语言与 UNIX 从一开始就在一定程度上互相依赖,因此,它们也共同成长。在一个关键的时间点,C 语言在 UNIX 系统中已经足够流行时,像 Steve Johnson 这样的人开发了可移植的 C 语言编译器,这种编译器可以为其他型号的计算机产生机器码。最终,出现了面向其他操作系统的 C 语言编译器,人们开始用 C 语言编写各种各样的软件 —— 从数据库系统到……天知道什么奇奇怪怪的玩意儿,因为 C 语言在各种环境下都可用,并且十分有效,效率很高。

00:20:07 - Saron Yitbarek

因此,不久以后,人们也开始用 C 语言编写与 UNIX 无关的程序,因为这门语言的优点是显而易见的。Andy 将为我们讲述,C 语言如何完全接管了整个编程世界。

00:20:20 - Andy Tanenbaum

我想说的是,C 语言在正确的时间出现在了正确的地点。在上世纪 70 年代,计算机的普及范围远比现在要小。普通人不会拥有计算机,并且对计算机一无所知,但是在大学和大企业所拥有的计算机中,有许多都使用了 UNIX 操作系统以及随之而来的 C 语言,也就是说,这些大学和大企业都在使用 C 语言。这些大学与大企业发布了大量的软件,也产生了大量的程序员。如果一个企业想招聘一名 C 程序员,发布招聘广告后一定会有人来应聘。如果想招聘一名 B 语言程序员,没人会来面试。

00:20:49 - Saron Yitbarek

在 C 语言的世界中,有许多基础设施 —— 软件、函数库、头文件等,这一切编程工具都构成了一个完美的闭环。

00:20:59 - Andy Tanenbaum

因此,C 语言变得越来越流行。

00:21:02 - Saron Yitbarek

现在,互联网的兴起导致了人们对 C 语言安全性的关注,这些问题在变种中得到了部分解决,比如 C#。有些时候我们会觉得,好像所有的兴奋点都在 Python 或 Go 等新语言上。但是我们希望能在播客中试图做的一件事就是让大家回忆起当下的我们与历史的紧密关联,而 C 语言的影响至今仍然是不可思议的。

00:21:29

C 语言在现代最出名的产物就是 UNIX 的教子 —— Linux,而 Linux 的绝大部分都是用 C 编写的。就连 Linux 项目使用的标准编译器 GCC( GNU 编译器集合 GNU Compiler Collection ),也是用 C 语言写成的。虽然这一点可能不太引人注意,但是今天所有聚集在 Linux 上的开源编程者,都与一种在半个世纪以前的语言相联系,而 C 语言的统治也在年复一年的增强。

00:22:02 - Andy Tanenbaum

以上这些事情的结果就是世界上占支配地位的两种操作系统的诞生。一个是运行在 Linux 操作系统上的安卓,而 Linux 是重写 UNIX 操作系统的产物。而 iOS,本质上来讲是一种 4.4 版的 Berkeley UNIX。因此,安卓和 iOS 从本质上说都是 UNIX。我怀疑几乎所有的服务器都是运行在 UNIX 或 Linux 的某个版本上的。这些服务器在幕后发挥着巨大的作用,并且任何运行 UNIX 的系统都源于 C 语言,为 UNIX 所编写的一切程序都使用了 C 语言。C 语言确实是无处不在的。

00:22:41 - Saron Yitbarek

安德鲁·塔能鲍姆 Andy Tanenbaum 是一名计算机科学教授,他是《计算机网络》一书的作者。说点有趣的题外话吧,他同时也是 MINIX,一个免费、开源版本的 UNIX 的作者,而 MINIX 事实上也是 林纳斯•托瓦兹 Linus Torvalds 开发 Linux 的灵感来源。当然,Andy 使用 C 语言编写 MINIX。

00:23:03 - Saron Yitbarek

今天,C 语言存在于我们生活中的任何一个角落,从火星上的漫游车到台式电脑上的浏览器。它影响了许多我们在本季节目中提到的语言,例如 Go、Javascript 和 Perl。由于 C 语言与 UNIX 密不可分的联系,C 语言很可能是分布最广泛的编程语言。

00:23:28 - 发言人 7

1998 年美国国家科学奖的获得者是——来自朗讯科技公司贝尔实验室的 肯·汤普逊 Kenneth L. Thompson 丹尼斯·里奇 Dennis M. Ritchie 的团队。

00:23:40 - Saron Yitbarek

回望上世纪 60 年代,这四位贝尔实验室的员工—— 肯·汤普逊 Ken Thompson 丹尼斯·里奇 Dennis Ritchie 道格拉斯·麦克劳伊 Doug McIlroy 约瑟夫·欧桑纳 J.F. Ossanna ——他们那时还不得不向上级乞求关注和资助。但是在 1998 年,汤普逊和里奇就收到了美国国家科学奖,这是为了表彰他们在 C 语言和 UNIX 上的工作。他们也共享了一百万美元的图灵奖奖金。历史的眼光是公正的。

00:24:10

在一整季的节目中,我们一直在追寻那些我们最喜爱的编程语言的发展沿革与魅力。无论它们像 C 语言一样搭上了操作系统发展的便车,又或者是像 Go 语言一样在一种新的基础架构上发展,有一件事是永恒不变的:编程语言有它们自己的生命。它们是活着的。它们出生,成长,走向成熟。有时,编程语言也会变老,走向消亡。我们越多的了解这些语言,我们越会发现编程语言是一股重要的力量,它们总是在不断地变化,以切合时代的需要。我们的职责就是意识到这些变化,并且加以回应。我们的语言一直都是构建我们想要的世界的最佳工具。

00:25:00

以上就是我们所有第三季的《代码英雄》节目。我希望大家喜欢收听我们的节目。节目的第四季已经在制作中,即将推出,敬请期待。

00:25:13

《代码英雄》是来自红帽公司的原创播客。

00:25:18

如果你想深入了解 C 语言或者本季节目中我们提到的任何其他编程语言的故事,欢迎访问 redhat.com/commandlineheroes。我是 Saron Yitbarek ,下期之前,编程不止。


  1. 线程代码 threaded-code 技术:一种通过把一系列调用指令转换成一完整的地址表,然后使用恰当的方式调用的技术。线程代码最初被用来减少代码的占用空间,提高代码密度。通俗地讲,这种技术有点类似于在 C 语言中把一系列的 switch-case 语句转化为用函数指针数组实现的形式。 ↩︎

什么是 LCTT SIG 和 LCTT LCRH SIG

LCTT SIG 是 LCTT 特别兴趣小组 Special Interest Group ,LCTT SIG 是针对特定领域、特定内容的翻译小组,翻译组成员将遵循 LCTT 流程和规范,参与翻译,并获得相应的奖励。LCRH SIG 是 LCTT 联合红帽(Red Hat)发起的 SIG,当前专注任务是《代码英雄》系列播客的脚本汉化,已有数十位贡献者加入。敬请每周三、周五期待经过我们精心翻译、校对和发布的译文。

欢迎加入 LCRH SIG 一同参与贡献,并领取红帽(Red Hat)和我们联合颁发的专属贡献者证书。


via: https://www.redhat.com/en/command-line-heroes/season-3/the-c-change

作者:Red Hat 选题:bestony 译者:QwQ2000 校对:Northurland, wxy

本文由 LCRH 原创编译,Linux中国 荣誉推出

昨天发的一篇新闻点评中,提及了在 Ubuntu 21.04 中准备修复一个十多年的 Bug:将用户主目录的默认的“世界可写”权限取消,并对这条新闻吐槽了一番。

不料,这条新闻引来了一些意料之外的吐槽,大家在公众号、知乎、今日头条上看到这篇内容后,纷纷表示“世界可写”是机翻,是误读,应该翻译为“ 全局 Global ”。因此,我觉得有必要就此写点文字来说明一下。

说实话,我也是第一次看到“世界可写”这个翻译(这个翻译不是我发明的),初看之下有点诧异,但是细思之下,我认为,这个翻译还是颇有意思的。

传统的 Unix 权限 traditional Unix permissions 模型将用户分为三类:

  • 属主 Owner 用户 User 类(u):文件/目录的所有者
  • 群组 Group 类(g):除所有者之外的文件/目录所属用户组的成员
  • 其他 Other 类(o):“世界”上除以上二者外的其他人

对于 chmod 命令来说,我们有时候需要给这三类人都统一赋予一些权限,这种情况下,我们采用 a 来代表“ 全部 All ”,有时也称之为“ 世界 World ”。这在各种文献中

对于“ 世界 World ”这个词汇,除看起来有点不太寻常,但是我觉得,这是一种 Unix 的古典黑客精神的幽默,可能是隐喻 Unix 机器里面就是一个世界吧,如果你连 Unix 用户都没有,那你就不是这个世界的。

Unix 世界只是 Unix 的 世界 World ,从来不是 全球 Gloabl

最后,“世界可写”万万要不得。022 赛高!

Unix 时间(又称为“ 纪元时间 epoch time ”)是自 1970 年 1 月 1 日以来经过的秒数。当 Unix 即将 50 岁时,让我们看一下让内核开发人员担心的地方。

对于 Unix 而言,2020 年是重要的一年。在这一年年初,Unix 进入 50 岁。

尽管 Unix 的某些早期开发早于其“纪元”的正式开始,但 1970 年 1 月 1 日仍然是 POSIX 时间的零点,也是公认的 Unix 的万物之始。自那一刻算起,2020 年 1 月 1 日将是其 50 周年。(LCTT 译注:实际上,在 1971/11/3 出版的第一版《Unix 程序员手册》中,将 1971/1/1 作为 Unix 纪元的开始,并且一秒钟记录 60 个数,但是后来发现这样 32 位整型数字只能记录两年多,后来这个纪元被一再重新定义,改为从 1970/1/1 开始,每秒 1 个数。)

Unix 时间与人类时间

就人类时间而言,50 年是很重要的。就 Unix 时间而言,50 年没有什么特别的。48.7 年同样重要。

Unix(包括 Linux)系统将日期/时间值存储为自 1970-01-01 00:00:00 UTC 以来经过的秒数(32 位整型)。要确定自该时间以来经过了多少秒钟,看看 Unix 时间值是什么样子,你可以发出如下命令:

$ date +%s
1576883876

%s 参数告诉 date 命令将当前日期/时间显示为自 1970-01-01 开始以来的秒数。

Unix 系统可以管理多少时间?

要了解 Unix 系统可以容纳多少时间,我们需要查看 32 位字段的容量。可以这样计算:

$ echo '2^32' | bc
4294967296

但是,由于 Unix 需要容纳负数,因此它会为数字的符号保留一位,从而将其减少为:

$ echo '2^31' | bc
2147483648

并且,由于 Unix 计数以 0 开头,这意味着我们有 2,147,483,648 个值,但最大的可能值为 2,147,483,647 个。Unix 日期/时间值不能超过该数字——就像汽车上的里程表可能不能超过 999,999 英里一样。加 1 该值就变为了 -2147483648。(LCTT 译注:此处原文描述有误,已修改。在达到最大值之后,即 2038/1/19 03:14:07,下 1 秒导致符号位变为 1,其余 31 位为 0,即 -2147483648,时间变为 1901/12/13 20:45:52,这就是 Y2K38 问题。)

一年有多少秒?

大多数年份的秒数可以这样计算:每天的小时数乘以每小时的分钟数乘以每分钟的秒数乘以一年中的天数:

$ expr 24 \* 60 \* 60 \* 365
31536000

在闰年,我们再增加一天:

$ expr 24 \* 60 \* 60 \* 366
31622400

(LCTT 译注:Unix 时间将一天精确定义为 24 * 60 * 60 = 86400 秒,忽略闰秒。)

Unix 将如何庆祝其 50 岁生日?

2020 年 1 月 1 日中午 12:00 是纪元时间的 1577836800。这个计算有些棘手,但主要是因为我们必须适应闰年。自该纪元开始以来,我们经历了 12 个闰年,从 1972 年开始,到上一个闰年是 2016 年。而且,当我们达到 2020 年时,我们将有 38 个常规年份。

这是使用 expr 命令进行的计算,以计算这 50 年的秒数:

$ expr 24 \* 60 \* 60 \* 365 \* 38 + 24 \* 60 \* 60 \* 366 \* 12
1577836800

前半部分是计算 38 个非闰年的秒数。然后,我们加上闰年的 366 天的类似计算。或者,你可以使用前面介绍的每年秒数,然后执行以下操作:

$ expr 31536000 \* 38 + 31622400 \* 12
1577836800

这种跟踪日期和时间的方式使 Unix 系统完全不受 Y2K 恐慌的影响,1999 年末人们开始担心进入 2000 年会对计算机系统造成严重破坏,但是实际遇到的问题比人们担心的少得多。实际上,只有以两位数格式存储年份的应用程序才会将年份变为 00,以表示时间倒退。尽管如此,许多应用程序开发人员还是做了很多额外的繁琐工作,以确保 2000 年到来时,他们的系统不会出现严重问题。

Unix 时间何时会遇到问题?

在 2038 年之前,Unix 系统不会遇到 Y2K 类型的问题,直到如上所述存储的日期将超过其 32 位空间分配。但这距离现在已经只有 18 年了,内核开发人员已经在研究如何避免灾难。但现在开始恐慌还为时过早。

2038 年的问题有时称为 Y2K38 问题。我们必须在 2038 年 1 月 19 日星期二之前解决这个问题。如果问题到时候仍未解决,则该日期之后的系统可能会认为是 1901 年。解决该问题的一种方法是切换为日期/时间信息的 64 位表示形式。有些人认为,即使那样,也会有比听起来更复杂的问题。无论如何,恐慌还为时过早。并且,与此同时,也许在新年前夜演唱了《Auld Lang Syne》之后,你可以向 Unix 唱《生日快乐》歌了。Unix 50 岁了,这仍然是大事。

(LCTT 译注:建议阅读一下 Unix 时间的维基百科页面,有更多有趣和不为人知的信息。)


via: https://www.networkworld.com/article/3511428/unix-is-turning-50-what-does-that-mean.html

作者:Sandra Henry-Stocker 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在现代微服务环境中,构建小型、单一的应用程序的旧策略又再一次流行了起来。

1984 年,Rob Pike 和 Brian W. Kernighan 在 AT&T 贝尔实验室技术期刊上发表了名为 “Unix 环境编程” 的文章,其中他们使用 BSD 的 cat -v 例子来认证 Unix 哲学。简而言之,Unix 哲学是:构建小型、单一的应用程序 —— 不管用什么语言 —— 只做一件小而美的事情,用 stdin / stdout 进行通信,并通过管道进行连接。

听起来是不是有点耳熟?

是的,我也这么认为。这就是 James Lewis 和 Martin Fowler 给出的 微服务的定义

简单来说,微服务架构的风格是将单个 应用程序开发为一套小型服务的方法,每个服务都运行在它的进程中,并用轻量级机制进行通信,通常是 HTTP 资源 API 。

虽然一个 *nix 程序或者是一个微服务本身可能非常局限甚至不是很有用,但是当这些独立工作的单元组合在一起的时候就显示出了它们真正的好处和强大。

*nix程序 vs 微服务

下面的表格对比了 *nix 环境中的程序(例如 catlsof)与微服务环境中的程序。

*nix 程序微服务
执行单元程序使用 stdin/stdout使用 HTTP 或 gRPC API
数据流管道
可配置和参数化命令行参数、环境变量和配置文件JSON/YAML 文档
发现包管理器、man、makeDNS、环境变量、OpenAPI

让我们详细的看看每一行。

执行单元

*nix 系统(如 Linux)中的执行单元是一个可执行的文件(二进制或者是脚本),理想情况下,它们从 stdin 读取输入并将输出写入 stdout。而微服务通过暴露一个或多个通信接口来提供服务,比如 HTTP 和 gRPC API。在这两种情况下,你都会发现无状态示例(本质上是纯函数行为)和有状态示例,除了输入之外,还有一些内部(持久)状态决定发生了什么。

数据流

传统的,*nix 程序能够通过管道进行通信。换句话说,我们要感谢 Doug McIlroy,你不需要创建临时文件来传递,而可以在每个进程之间处理无穷无尽的数据流。据我所知,除了我在 2017 年做的基于 Apache Kafka 小实验,没有什么能比得上管道化的微服务了。

可配置和参数化

你是如何配置程序或者服务的,无论是永久性的服务还是即时的服务?是的,在 *nix 系统上,你通常有三种方法:命令行参数、环境变量,或全面的配置文件。在微服务架构中,典型的做法是用 YAML(或者甚至是 JSON)文档,定制好一个服务的布局和配置以及依赖的组件和通信、存储和运行时配置。例如 Kubernetes 资源定义Nomad 工作规范Docker 编排 文档。这些可能参数化也可能不参数化;也就是说,除非你知道一些模板语言,像 Kubernetes 中的 Helm,否则你会发现你使用了很多 sed -i 这样的命令。

发现

你怎么知道有哪些程序和服务可用,以及如何使用它们?在 *nix 系统中通常都有一个包管理器和一个很好用的 man 页面;使用它们,应该能够回答你所有的问题。在微服务的设置中,在寻找一个服务的时候会相对更自动化一些。除了像 Airbnb 的 SmartStackNetflix 的 Eureka 等可以定制以外,通常还有基于环境变量或基于 DNS 的方法,允许您动态的发现服务。同样重要的是,事实上 OpenAPI 为 HTTP API 提供了一套标准文档和设计模式,gRPC 为一些耦合性强的高性能项目也做了同样的事情。最后非常重要的一点是,考虑到开发者经验(DX),应该从写一份好的 Makefile 开始,并以编写符合 风格 的文档结束。

优点和缺点

*nix 系统和微服务都提供了许多挑战和机遇。

模块性

要设计一个简洁、有清晰的目的,并且能够很好地和其它模块配合的某个东西是很困难的。甚至是在不同版本中实现并引入相应的异常处理流程都很困难的。在微服务中,这意味着重试逻辑和超时机制,或者将这些功能外包到 服务网格 service mesh 是不是一个更好的选择呢?这确实比较难,可如果你做好了,那它的可重用性是巨大的。

可观测性

在一个 独石 monolith (2018 年)或是一个试图做任何事情的大型程序(1984 年),当情况恶化的时候,应当能够直接的找到问题的根源。但是在一个

yes | tr \\n x | head -c 450m | grep n

或者在一个微服务设置中请求一个路径,例如,涉及 20 个服务,你怎么弄清楚是哪个服务的问题?幸运的是,我们有很多标准,特别是 OpenCensusOpenTracing。如果您希望转向微服务,可预测性仍然可能是最大的问题。

全局状态

对于 *nix 程序来说可能不是一个大问题,但在微服务中,全局状态仍然是一个需要讨论的问题。也就是说,如何确保有效的管理本地化(持久性)的状态以及尽可能在少做变更的情况下使全局保持一致。

总结一下

最后,问题仍然是:你是否在使用合适的工具来完成特定的工作?也就是说,以同样的方式实现一个特定的 *nix 程序在某些时候或者阶段会是一个更好的选择,它是可能在你的组织或工作过程中的一个最好的选择。无论如何,我希望这篇文章可以让你看到 Unix 哲学和微服务之间许多强有力的相似之处。也许我们可以从前者那里学到一些东西使后者受益。


via: https://opensource.com/article/18/11/revisiting-unix-philosophy-2018

作者:Michael Hausenblas 选题:lujun9972 译者:Jamskr 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出