The first Go program
18 Jul 2013
Tags: history

Andrew Gerrand

* Introduction

Brad Fitzpatrick and I (Andrew Gerrand) recently started restructuring
[[https://golang.org/cmd/godoc/][godoc]], and it occurred to me that it is one
of the oldest Go programs.
Robert Griesemer started writing it back in early 2009,
and we're still using it today.

When I [[https://twitter.com/enneff/status/357403054632484865][tweeted]] about
this, Dave Cheney replied with an [[https://twitter.com/davecheney/status/357406479415914497][interesting question]]:
what is the oldest Go program? Rob Pike dug into his mail and found it
in an old message to Robert and Ken Thompson.

What follows is the first Go program. It was written by Rob in February 2008,
when the team was just Rob, Robert, and Ken. They had a solid feature list
(mentioned in [[http://commandcenter.blogspot.com.au/2012/06/less-is-exponentially-more.html][this blog post]])
and a rough language specfication. Ken had just finished the first working version of
a Go compiler (it didn't produce native code, but rather transliterated Go code
to C for fast prototyping) and it was time to try writing a program with it.

Rob sent mail to the "Go team":

	From: Rob 'Commander' Pike
	Date: Wed, Feb 6, 2008 at 3:42 PM
	To: Ken Thompson, Robert Griesemer
	Subject: slist

	it works now.

	roro=% a.out
	(defn foo (add 12 34))
	return: icounter = 4440
	roro=%

	here's the code.
	some ugly hackery to get around the lack of strings.


(The `icounter` line in the program output is the number of executed
statements, printed for debugging.)

.code first-go-program/slist.go

The program parses and prints an
[[https://en.wikipedia.org/wiki/S-expression][S-expression]].
It takes no user input and has no imports, relying only on the built-in
`print` facility for output. 
It was written literally the first day there was a
[[https://golang.org/change/8b8615138da3][working but rudimentary compiler]].
Much of the language wasn't implemented and some of it wasn't even specified.

Still, the basic flavor of the language today is recognizable in this program.
Type and variable declarations, control flow, and package statements haven't
changed much.

But there are many differences and absences.
Most significant are the lack of concurrency and interfaces—both
considered essential since day 1 but not yet designed.

A `func` was a `function`, and its signature specified return values
_before_ arguments, separating them with `<-`, which we now use as the channel
send/receive operator. For example, the `WhiteSpace` function takes the integer
`c` and returns a boolean.

	function WhiteSpace(bool <- c int)

This arrow was a stop-gap measure until a better syntax arose for declaring
multiple return values.

Methods were distinct from functions and had their own keyword.

	method (this *Slist) Car(*Slist <-) {
		return this.list.car;
	}

And methods were pre-declared in the struct definition, although that changed soon.

	type Slist struct {
		...
		Car method(*Slist <-);
	}

There were no strings, although they were in the spec.
To work around this, Rob had to build the input string as an `uint8` array with
a clumsy construction. (Arrays were rudimentary and slices hadn't been designed
yet, let alone implemented, although there was the unimplemented concept of an
"open array".)

	input[i] = '('; i = i + 1;
	input[i] = 'd'; i = i + 1;
	input[i] = 'e'; i = i + 1;
	input[i] = 'f'; i = i + 1;
	input[i] = 'n'; i = i + 1;
	input[i] = ' '; i = i + 1;
	...

Both `panic` and `print` were built-in keywords, not pre-declared functions.

	print "parse error: expected ", c, "\n";
	panic "parse";

And there are many other little differences; see if you can identify some others.

Less than two years after this program was written, Go was released as an
open source project. Looking back, it is striking how much the language has
grown and matured. (The last thing to change between this proto-Go and the Go
we know today was the elimination of semicolons.)

But even more striking is how much we have learned about _writing_ Go code.
For instance, Rob called his method receivers `this`, but now we use shorter
context-specific names. There are hundreds of more significant examples
and to this day we're still discovering better ways to write Go code.
(Check out the [[https://github.com/golang/glog][glog package]]'s clever trick for
[[https://github.com/golang/glog/blob/c6f9652c7179652e2fd8ed7002330db089f4c9db/glog.go#L893][handling verbosity levels]].) 

I wonder what we'll learn tomorrow.

