Introduction to Esoteric Programming Languages
Panu Kalliokoski, Lambda ry
Department of Computer Science, University of Helsinki, 3.10.2011
How to go about Esoteric Programming Languages?
- Esoteric Programming Languages (EPLs) are a huge subject
- There's (at least) as much to be learned in EPLs as there's in other
programming languages
- Many points of view: cultural, technical, theoretical, historical,
anthropological, just to name the most important ones
- Moral: don't expect to get a proper treatment of anything in such
a short time
How is this evening school organised?
- Mostly a lecture, to familiarise everybody with the various subjects
that might warrant further study
- Discussion is of course allowed and encouraged, but only when it
seems interesting for most of the audience
- everybody has their own favourites in the area, and somehow oddly
opinions differ about what is
cool
- Let's try and find the fun here!
- More information could be acquired as self study or a studying group
How to group / categorise EPLs?
- by point: making programming hard,
elegance
(minimalism), exploring
computational paradigms, funny syntax, thematic
languages, proofs of
concept
- by computational paradigm: imperative (state-changing), stack-based,
rewriting (string/tree/graph), cellular automata, reflective
- by expressive power: FSM-level, Turing machine equivalent,
unimplementable
- by cultural influence: popular, influential, novel,
just a new syntax
for Brainfuck
, number of implementations, amount of code written,
kind of code written, usage in games / competitions / whatever
Time for discussion
How to proceed with all this?
- I have prepared very short introductions to different languages
- I prefer historical order, in order to show what the points of various
languages were at that time
- Any ideas?
- Want to try them out?
INTERCAL (1972)
- The privilege of being first
- Satirical references to many existing programming languages (used
then): PLEASE, COME FROM, hard-to-use bitwise operators
- A lot of derivatives: object-oriented, threaded, trinary INTERCAL.
- Actually quite a traditional imperative programming language,
resembles BASIC and COBOL.
- a couple of implementations
- doesn't seem to inspire programmers to write programs
PLEASE GIVE UP
FALSE (1993)
- (successful) attempt to make an easily-compilable language
- very Forth-like, once used to write many fine programs but not popular
anymore
- demonstrates well how terse programs can be in certain paradigms
- gave important inspiration for the
big two
languages of -93
ß[^$1_=~][,]#
Brainfuck (1993)
- very well-known, an early attempt to make minimalist language (topped
many many times)
- an imperative language with 8 instructions
- has inspired an endless flood of
improved
brainfucks, minimalist
imperative languages of l.t. 8 instructions, and subsequent work (GA
breeding, BF competitions)
- resembles a TM with very many states, relatively easy to understand
- tens of implementations (if not hundreds)
- popular with program authors
- a lot of interesting theoretical subsequent work, such as optimisation
for numerical constants, arguments about implementation boundary
cases, etc.
[->++<]
Befunge (1993)
- (failed) attempt at making an uncompilable language
- main novelty: source code is treated as a two-dimensional grid, where
characters are primitive operations on an internal stack
- Resembles Forth (and Unix dc!) because of the stack-based nature
- Neat, it's fun to see the instruction pointers run around the source
- a couple of implementations
- popular with program authors
- main theoretical result: bf-93 only PDA equivalent because of
boundedness
0"!dlroW ,olleH">:#,_@
RUBE / REDGREEN (1997?)
- cellular automatons (big grids with independent agents
- programming like
the incredible machine
etc.
- even more game-like than Befunge (game offspring: Rubicon 2006)
- no hidden state, good learning environment (in principle)
- only one implementation for each, never very popular
- probably some uncovered corner cases in evaluation rules
Malbolge (1998)
- a deliberate attempt to make as evil (hard-to-use) programming
language as possible
- features all kinds of deliberate obfuscation: IP rewrites code as it
reads it, all registers keep changing, no proper operations at all
- nobody knows (to day) how complex programs can be written
- however, significant findings have been made that have allowed writing
loops, for instance
- Malbolge programs are too long to demonstrate
- one implementation, de facto standard
- surprisingly many programs
Unlambda (1999)
- first time somebody with an academic background joins the movement
- basically, a condensed syntax for a minimalistic version of Scheme
- designed to be
hard to compile
(but what does that mean, actually?)
- spurred a lot of excitement because it was so easily more minimalistic
than Brainfuck
- joins the functional programming tradition: first programs were
fibonacci sequences and quines, soon followed by an Unlambda
implementation in Unlambda
- does not have predefined data types, other than the program source
` ` s ` ` sii ` ki
Thue (2000)
- string rewriting as a paradigm
- starts the trend of making (not so) early computation-related papers
into programming languages
- only provides constant string rewriting, but easily Turing equivalent
(can produce context-dependent languages)
- does not have predefined data types, other than any given substring
from the total program state
bc::=abcd
Thue (2000)
- string rewriting as a paradigm
- starts the trend of making (not so) early computation-related papers
into programming languages
- only provides constant string rewriting, but easily Turing equivalent
(can produce context-dependent languages)
- does not have predefined data types, other than any given substring
from the total program state
bc::=abcd
All of the rest (because out of time :))
- Muriel
- GraNoLa/M
- Kayak
- Lazy K
- Bitwise Cyclic Tag
BCT
- SMATINY
- Backflip / ABCDXYZ
- ///
Slashes
- Underload
- You are Reading the Name of this Esolang
- Eodermdrome