So the other day I thought it'd be a great idea to take a look at the earliest version of Python that I could find. After a few broken links and a lot of time screwing around with Google's webcache, I worked out that the oldest version I was going to (w)get my hands on was this: 0.9.1. Absolutely ISIS*-level hacking, I know.

*International Secret Intelligence Service, for any Archer fans out there.

Just quickly: my system is a Chromebook with Crouton installed. I'm running these commands in a browser tab using CrOSh (or however it's capitalised) to run an Ubuntu 14.04 chroot. My shell is Zsh, because I like the autocomplete more than Bash's default.

After downloading the .tar.gz file, I unpacked it like so:

tar -zxfv Python-0.9.1.tar.gz  # Anyone who doesn't use the hyphen before 'zxvf' is an animal. Also, I'm trying to use alt texts to help visually impaired people - let me know if you have any suggestions!

When I cd'd into the directory - yes, I know what 'cd' stands for - I spotted two README's: one looked like the original, and one was clearly a later addition.

Folders: "demo", "doc", "lib", "src"; Files: "", "README", "README.reconstructed"

For reference, I've rehosted the README and the README.reconstructed.

Full disclosure: I didn't read either of them before I started building from source. Looking back, the README is a nice helpful note from Guido, and the README.reconstructed has some helpful info I probably should have read. Oh well!

Moving on: the Makefile in the src directory is gigantic, and pretty unintelligible for the likes of me. I did like this part though: the default Python PATH includes /ufs/guido/lib/python. Way to add a personal touch, Mr. BDFL!

The default Python PATH: colon-delimited filepaths, one of which is "/ufs/guide/lib/python"

So what are we waiting for - let's get on and build this thing!

I ran make in the "src" directory.

No, really, I did do that! Why don't you trust me? There's a ton of ".c" and ".h" files in here, and a single Makefile.

It doesn't take long, but a whole host of warnings pop up: check out my build output if you're interested.

Long list of malloc, calloc and realloc errors. Check the build log below for the full thing.

Most of them are about the C functions malloc(), calloc() and realloc(): defined in stdlib.h, these functions handle allocating memory, allocating it and then clearing it to zeroes, and reallocating it (respectively). There's "conflicting types", with what looks like an "extern ANY" redefinition. My C-fu isn't really strong enough to speculate as to the precise details of what's going wrong here, but luckily I don't need to: the build succeeds.

(Even if there is a dodgy looking mv @python python at the end - I'll later discover that the README.reconstructed file mentions this too!)

There's now a "python" executable in my current directory. Let's see what it looks like, and open it up!

"ls -l python" - output is "-rwxrwxr-x 1 bede bede 186135 Jun 14 23:52 python"; "./python" - output is three greater-than signs in a row, and a blinking cursor prompt

Notice that there's no version info, no compiler info, and definitely no friendly welcome message about typing "help" for more information.

So let's try some commands!

 gives an Unhandled exception: run-time error: syntax error

Uh, right, sure. I'm a spoiled Python 3.4 baby, let's get rid of those dirty parens.

 gives an Unhandled exception: run-time error: syntax error

Wait... what? Is it the exclamation point? The comma? They're both ASCII characters; I can't imagine they'd cause a problem...

 gives an Unhandled exception: run-time error: syntax error

So at least we know it hasn't actually regressed to the point where it can't print out ASCII chars.

I played around with this for a few more minutes before I worked it out: it's the quotes. Double quotes, for whatever reason, aren't legal in Python 0.9.1.

 outputs "Hello, world!" as expected.

Praise the BDFL! I'd say this just about ties with AT&T-syntax assember for my Hardest Ever Hello World trophy (I mean, seriously? Percent signs? I know assembly isn't quite supposed to read like prose, but come on...).

Now let's get on with writing some real code. How about seeing what's currently in scope, to start off with?

Running  gives an "Unhandled exception: undefined name: locals".

Sure, of course locals isn't, well, in the locals. But dir() works, right?

 outputs an empty list literal: "[]"

Well, good news: there's no unhandled exceptions! I was getting tired of those, weren't you? Weren't you?

*ahem*. There's absolutely nothing locally scoped at the moment. Let's fix that:

 gives no output.  shows a list literal like so: "['tmoltuae']"

Woo! We've got a name in the local namespace. That's a good place to break up the article; Ghost's markdown editor starts running a little slow for larger webpages.

Next installment coming soon to a blog near you!