The first step is to download and build the most excellent Simh simulator so that we can simulate a PDP-11. Fortunately the disk images are already pre-built and downloadable, so one just has to download these and point the PDP-11 simulator at a config file and the system almost instantly boots. The full instructions are provided in great detail here.
I am rather fond of the PDP-11. It was the first mini computer I worked on back in 1987 when I was a very junior programmer at Prosig. The machine was running RSX-11M Plus rather than UNIX but even so it gave me the appreciation of what one can do on a very small multi-user machine. At the time I was maintaining, building and testing DATS signal processing tools written in Fortran 77, and some of the work involved tinkering with task builder scripts to try and cram code into the very limited memory.
So in those days size really mattered. Small was considered beautiful and this mindset was instilled into me in my formative years. So I was very pleased to find the unix-jun72 project which allows me to relive those PDP-11 days and also experience UNIX-1.
Since some of the original source code still exists, one can browse the source of the kernel and some of the core utilities. It is amazing to see the functionality that is available in very small binaries.
Let's fire up the simulator and see the size of the 'cat' command:
PDP-11 simulator V3.9-0 Disabling CR Disabling XQ RF: buffering file in memory TC0: 16b format, buffering file in memory :login: root root # ls -al /bin/cat total 1 50 sxrwr- 1 bin 134 Jan 1 00:00:00 cat
And how does that compare to a GNU cat on a 64 bit Ubuntu laptop?
ls -al /bin/cat -rwxr-xr-x 1 root root 47912 Nov 28 12:48 /bin/cat
134 bytes versus 47912 bytes. That is quite a difference! Admittedly we are comparing apples vs pears here, so obviously this is an unfair comparison, but it does illustrate how we've "progressed" since the early UNIX-1 days. Honestly I'm glad we can now write userland tools and the kernel in C rather than assembler and not have to worry about size constraints quite so much.
I'm very glad that this project exists to preserve the UNIX heritage. History has a lot to teach us. Browsing the early code is an education; it allows us to appreciate the memory constraints that shaped the design and implementation of UNIX. To be able to run this code in a simulator and tinker with a running system adds to the experience.
We've moved on a long way in 40 or so years, machines are incredibly powerful, and memory and disk is cheap. But let us not forget the "small is beautiful" ideal. There is something very appealing about tools that do just enough to be very useful and yet are not bloated with unnecessary memory hogging feature creep.