Go 在 1972 年提交了第一行代码?
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 的研发,是一个非常优秀的大佬。
如下图:
在 "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 次变更。
而以往的假提交,更多的是为了致敬大佬,是一种程序员浪漫了:)
参考资料
golang/go: https://github.com/golang/go
[2]Go’s Version Control History: https://research.swtch.com/govcs
点分享
点点赞
点在看