查看原文
其他

Go 在 1972 年提交了第一行代码?

IT服务圈儿 2023-02-06

The following article is from 脑子进煎鱼了 Author 陈煎鱼

来源丨经授权转自 脑子进煎鱼了(ID:eddycjy)

作者丨陈煎鱼


大家好,我是煎鱼。

关于 Go 语言的宣发,大家都知道最早是在 2007 年进行设计,于 2009 年问世,2012 年发布 1.0 版本。

Wikipedia 上的历史如下图:

但对于 Go 本身来讲,第一行为大家所知的代码又是何时提交的呢?

Go 的第一次提交

在 GitHub 上的 golang/go[1] 开源库能够找到一些端倪,如下 git commit 记录:

commit 7d7c6a97f815e9279d08cfaea7d5efb5e90695a8
Author: Brian Kernighan <bwk>
Date:   Tue Jul 18 19:05:45 1972 -0500

    hello, world

    R=ken
    DELTA=7  (7 added, 0 deleted, 0 changed)

diff --git a/src/pkg/debug/macho/testdata/hello.b b/src/pkg/debug/macho/testdata/hello.b
new file mode 100644
index 0000000000..05c4140424
--- /dev/null
+++ b/src/pkg/debug/macho/testdata/hello.b
@@ -0,0 +1,7 @@
+main( ) {
+       extrn a, b, c;
+       putchar(a); putchar(b); putchar(c); putchar('!*n');
+} 
+a 'hell';
+b 'o, w';
+c 'orld';

通过上述记录,我看到第一个提交来自 1972 年 07 月 18 日(不得不说我还没有出生)。由传奇人物 Brian Kernighan 所提交,他又是谁?

Brian Kernighan 是谁

Brian Kernighan 是贝尔实验室的成员之一,曾参加 Unix 系统的早期开发和 Plan9 的研发,是一个非常优秀的大佬。

如下图:

Brian Kernighan
  • 在 "A Tutorial Introduction to the Language B"  中,首次提出 Hello world 程序,作为编程语言入门的示范。
  • AMPL 和 AWK 的共同开发者,与 Shen Lin 为两个 NP 不完全的优化问题设计了著名的启发式算法。
  • 合著《The C Programming Language》、《The Go Programming Language》等多达 10 余本图书。

看起来 Brian 与 Go 还是有千丝万缕的关系的,又是 Plan9、Go 等底层和图书的输出,但似乎与广大了解的不一样。

他为什么会出现在第一次提交?

为什么会出现

由于这个问题已经被问烦了,Russ Cox 写了一篇《Go’s Version Control History[2]》文章做一个 Go 提交历史的梳理。

实际上前面看到的提交,对于 Go 来讲是 “假提交”,真正的第一次 Go 提交是:

commit 18c5b488a3b2e218c0e0cf2a7d4820d9da93a554
Author:     Robert Griesemer <gri@golang.org>
AuthorDate: Sun Mar 2 20:47:34 2008 -0800
Commit:     Robert Griesemer <gri@golang.org>
CommitDate: Sun Mar 2 20:47:34 2008 -0800

    Go spec starting point.

    SVN=111041

 doc/go_spec | 1197 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 1197 insertions(+)

是先定的 The Go Annotated Specification(Go 注释规范),里面包含:最近的设计决策、指导原则等大量语言细节,基本拟定了现在 Go 的样子。

先前 Brian Kernighan 的第一次 “hello world”提交,实际上是 Russ Cox 在 2009 年 10 月左右,为了准备 Go 开源,将 SVN 转到 Perforce,再转到 Mercurial 时所引入的(以上 3 个均为版本管理工具)。

也就是这个提交是人为引入的,复制自 Brian Kernighan 的 《A Tutorial Introduction to the Language B》:

main( ) {
 extrn a, b, c;
 putchar(a); putchar(b); putchar(c); putchar(’!*n’);
}

a ’hell’;
b ’o, w’;
c ’orld’;

除了本文中提到的 1972 年的提交,还又引入了 1974 年、1988 年的各种代码。

我想是为了致敬各位大佬,可以理解为一种程序员式的浪漫了。

总结

在这几十年,Go 从 SVN,再到 Perforce,到 Google Code Mercurial 又到 Gerrit Code Review,经历了多次变更,这是现在的结局和选择。

但熟悉 Go 的同学都知道,其实 Gerrit 也有许多可以提高的地方,未来相信我们会看到第 6 次变更。

而以往的假提交,更多的是为了致敬大佬,是一种程序员浪漫了:)

参考资料

[1]

golang/go: https://github.com/golang/go

[2]

Go’s Version Control History: https://research.swtch.com/govcs




1、InnoDB原理篇:为什么使用索引会变快?

2、这可能是你见过最全的网络爬虫工具库集合!

3、面试必备:聊聊MySQL的主从

4、推荐一款美观的聊天应用

5、全网讲解 "Python编码" 最全的教程了!

点分享

点点赞

点在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存