This is the companion reference for , my lecture for a friend’s college class. The video should be legible to other viewers, and the material here should be (mostly) understandable without watching the video.
Listed roughly in order of appearance in the talk, with the exception of Piet, which was moved to fit in with the other multicoded esolangs.
Don Woods, 1972.
A “prehistoric esolang”, Compiler Language With No Pronounceable Acronym (INTERCAL) was also the first joke language. I didn’t cover it because the gags aren’t that interesting.
*Wouter van Oortmerssen, 1993*
Arguably the first “true” esoteric language. A language designed to 1) have the smallest possible compiler and 2) be really hard to understand. Notable for inspiring both brainfuck and Befunge. Brainfuck took these goals further, while Befunge went in a different direction.
Urban Müller, 1993.
Arguably the most famous esoteric language, and the one that made esolangs go mainstream. Made when Müller saw FALSE and thought “I can do better than that.” While FALSE’s compiler was a whole kilobyte, Brainfuck’s compiler was 240 bytes. At the time Müller also ran the Aminet, so had enough reach to initially spread Brainfuck. The funny name and unusual coding puzzle did the rest.
The brainfuck runtime consists of an array of cells, all initialised to zero. There are eight commands:
It’s implementation-defined what happens if you decrement a 0 cell or move the pointer past the last cell. Every compiler and runtime would make its own decisions. Every other symbol is a noop, which 1) makes brainfuck relatively easy to comment, and 2) means you can secretly embed brainfuck programs in other language programs (multicoding).
Brainfuck is in the class of “Turing tarpits”, languages that are so small and simple they’re close to pure Turing machines. While it’s Turing complete, actually doing anything with brainfuck is going to be a challenge. Because brainfuck is TC you can use it to prove other languages TC: if you can write a brainfuck interpreter in language P, then P is Turing complete. For example, here’s a proof that Piet is Turing complete:

A Piet brainfuck interpreter. (source)
In the talk I gave an program that multiplies two numbers. Here’s an annotated version of the code:
+++>++< setup: set 2 and 3 as x & y
[ while cell A is not 0
- decrement cell A
>[->+>+<<] add cell B to C & D
(Now B = 0 & C = y)
>[-<+>] move C to B
(Now B = y & C = 0)
<< move back to A
] end while