我通常会在有空的时候浏览Github存储库。 另外,当我开始使用新的计算机软件,工具或实用程序时,我喜欢查看特定软件的工作方式。 大多数时候,我看一下它的代码库,以了解事物如何与内部模块和外部依赖项完全配合。
几年前,我正在检查Python语言实现的源代码。 此后,我注意到了几个C源文件,并突然检查了GNU C编译器集合的实现。 我发现这个现代的C编译器是用C本身编写的。 学习事物的内部结构并进一步深入,可以为我们带来惊人的感觉和丰富的知识。 过去的开发人员已经做出了巨大的努力,为现代开发人员创造了一个和平的世界。 但是,作为现代开发人员,我们应该感谢他们的出色工作。
当我浏览Github存储库时,我注意到世界各地的开发人员已经完成了以下令人印象深刻的工作。
阿波罗11号制导计划
阿波罗11号是第一个成功的使人类登月的任务。 只有4 KB物理内存的阿波罗制导计算机(AGC)为控制航天器提供了支持。 AGC的软件以AGC汇编语言编写,并存储在称为绳索存储器的特殊只读存储器中。 一段时间之前,已扫描了源代码的扫描副本,这些副本已上传到Internet。 此后,有人将几个模块转换为文本文件,然后将其上传到Github存储库。
> Piece of code from the Lunar module of AGC, screenshot by the author
阿波罗(Apollo)工程团队付出了巨大的努力,通过用汇编语言编写了许多代码行,以取得如此惊人的成就。 在1960年代,编程比现在更加困难。 因为在那时,编程语言的抽象级别较低。 此外,程序员必须编写超级优化的代码才能有效地使用硬件。
雷神之锤III竞技场
Quake III Arena是由id Software开发的第一人称射击游戏。 它是在90年代开发的,当时3D游戏行业刚刚开始使用id Tech 3游戏引擎进行开发。 当时,硬件资源非常有限。 因此,游戏开发人员必须编写精心优化的代码以呈现图形元素。 许多游戏编程计算都需要向量归一化概念,这提出了平方根反比计算的要求。 如前所述,开发人员必须为这些与计算机图形学相关的工作选择最有效的算法。 因此,Quake III Arena团队使用一种非常聪明的方法进行快速反平方根计算,如下所示,使用位级计算。
> Fast inverse square root function in Quake III Arena, screenshot by the author
这段代码中使用的优化水平以及为在90年代实现如此出色的计算机游戏而编写的整个代码显然令人惊讶。 如今,游戏开发通常不处理这一级别的计算,因为物理功能已经由游戏引擎实现。
GNU编译器集合
C编程语言就像现代计算之父一样,因为它通过提供良好的人类可读的抽象级别而与硬件之间的距离非常近。 确实,GNU C编译器已启动。 换句话说,它是使用编译器自举概念以C编程语言编写的。 我注意到我从Github上的GNU编译器集合的代码库中看到了最长的C源文件(可以有比这更长的C源文件,但这是我看到的)。
> GNU C Compiler's C parser source file has more than 20k lines, screenshot by the author
Google Chrome
流行的Web浏览器(例如Google Chrome,Microsoft Edge和Opera)基于Chromium开源项目,该项目具有两个主要依赖项:Blink呈现引擎(是由Webkit团队开发的WebCore库的一个分支),以及v8 JavaScript引擎, 由Chromium项目团队开发。 毫无疑问,Chromium代码库非常大,并且具有许多第三方模块,例如gRPC和Skia。 但是,Chromium团队以很好的方式构造了所有组件。 他们明智地分离了用户界面相关的逻辑和内部功能逻辑,以在整个项目中实现非常好的可维护性因素。
> Well-organized abstract UI controls of Chromium, screenshot by the author
此外,此代码库还包含Chromium Android和iOS应用程序的源代码。 构建大规模的跨平台应用程序可能会有些复杂。 但是,Chromium对Linux,Windows和Mac的平台特定代码有令人印象深刻的分离。
Git
如今,Git帮助几乎每个软件开发团队管理编码历史和版本。 Git最初由Linux内核的创始人Linus Torvalds制作。 确实,Git的代码库包含一项神奇的工作,这是Gitk的源文件。 Gitk是一个GUI应用程序,可以帮助我们直观地浏览提交。 我们可以使用以下CLI命令来检查两次提交之间的差异。
- $ git diff <commit hash> <commit hash>
但是,由于它是视觉工具,因此Gitk允许我们这么快地看到修改。 Gitk的整个源代码只是一个文件。 它是使用Tk UI工具包(是Tcl的扩展)以Tcl脚本语言编写的。 他们通过仅用一个源文件实现整个GUI应用程序,也通过选择动态编程语言以加快GUI应用程序开发来完成了出色的工作。
> Gitk was implemented as a single source file with around 12k lines, screenshot by the author