Software is the umbrella term for computer programs and libraries, the coded logic that makes our machines tick. At the root of all software is the code, the instructions that enable a human to tell a machine what to do. This code is written in one of the hundreds of different programming languages – such as C, Java, or Python – each of which has its own eccentricities and context-dependent advantages.
Yet regardless of the programming language being used, the functionality, logic, and efficiency of the language are always paramount – unless, of course, you’re talking about Brainfuck, an esoteric programming language that champions purposefully overcomplicated code.
I had no idea esoteric programming languages were a thing.
https://en.wikipedia.org/wiki/Whitespace_(programming_language)
I like the idea that whitespace uses the unused characters invisible characters (in most languages), so you can actually embed a whitespace program within the code of another program.
Most esoteric languages are an exercise in minimalist coding with limited instructions. They make you appreciate how wonderful high-level languages are, no matter how much you hate curly-braces and semicolons.
Befunge is interesting too, as it makes you consider 2-dimensional limitations.. kinda fun!
Yes, it’s fun, I like it a lot, but it’s still limited in what you can do (which is part of the appeal: simplicity). Still cool to see what can be done in those limitations. Modern computing is a minefield with implementation details, so that alone is enough to keep us busy. So when anything works, no matter how simple, it’s a triumph.
There are two variants: 93 and 98. Big difference, and (like any language) there are dark corners which can choke you if you’re not careful. This is where test suites come in handy (e.g. Mycology).
There are many implementations, usually people cutting their teeth on various HLLs, wanting something to test. It’s much simpler than a full-blown compiler (with parser, lexer, etc). It’s easy enough to bootstrap (akin to a very minimal Forth) and leaves enough room to delve a tiny bit into algorithms. Not as good as a full HLL (like any Wirth-designed language), but still cool to play with.
Right up there with the The International Obfuscated C Code Contest
http://ioccc.org/years.html
These guys take their programming style seriously:
http://ioccc.org/2015/yang/prog.c
http://ioccc.org/2015/dogon/prog.c
http://ioccc.org/2015/endoh1/prog.c
This is also somewhat related to code golf and polyglot programming. Basically anything to abuse the system, stretch it beyond its original goals, for weird effect.
I learned about it here…
http://99-bottles-of-beer.net/abc.html
If you enjoy looking at weird/obscure/obsfucated code then this site is worth a browse.
https://en.wikipedia.org/wiki/Intercal
https://esolangs.org/wiki/LOLScript
LOLScript and INTERCAL (the original joke language) were my first introductions to esoteric languages, though it’s been so long that I’m only vaguely certain that I encountered Intercal first
…I think because Eric S. Raymond maintains one of the two main implementations and I discovered things like The Cathedral and the Bazaar before LOLScript got written.
Once I discovered the esolangs wiki, Ook! and HQ9+ were added to my list of favourites:
https://esolangs.org/wiki/Ook!
https://esolangs.org/wiki/HQ9%2B
We already have a language like this. It’s called perl
My favorite would have to be Piet:
http://www.dangermouse.net/esoteric/piet.html
Seriously, it’s not a hard language to understand, and there are actually hardware implementations (with bounded memory of course), and there’s thousands more complex languages out there. In fact, emulation of BF is often used as a demonstration of Turing completeness for other esoteric languages, since BF has a solid proof of being Turing complete.
Some of the more interesting ones include:
Whitespace: Space, tab and newline are the only significant characters.
Thue: Turing complete substitution language that has only one operator.
Shakespeare: All programs are written in a similar manner to Shakespearean literature.
Hex: Based on the Hex thinking machine from Terry Pratchett’s Discworld (which used insects instead of electrons, so it literally ran on bugs).
Malbolge: Modulo 73 encoded language, programs look like long strings of gibberish, this is the one you want to look at if you want your brain to hurt.
Any number of languages whose names I can’t recall that use a 2D grid as the program.
While there were some that were implemented for serious reasons (e.g. Mouse), for the most part it’s just fun toying around.
The whole tiny compiler goal is a bit of an exaggeration as there’s many reasons why things are as big (or small) as they are. Ultra small size (especially less than 1 kb) is not much of a virtue (still wastes a full cluster on HDD), compared to say 64 kb, which is hardly prohibitive. Same with 1 MB vs. 2.6 MB or similar, it’s small enough. With enough elbow grease, I’m fully confident most things could be halved without major difficulty. It’s not that hard, just tedious.
Many esolangs tend to be inspired by Forth, which is easy to bootstrap and has dozens of implementations. So it’s debatable whether a full Forth is harder or more worthwhile than a simple subset. Not all esolangs try to be ultra minimal (OISC or URISC-y), but there’s a general feeling that things can be greatly simplified by removing redundancy. (Simplicity is a virtue, see Oberon.) I recently wondered if x86 assembly (esp. 8086) could be heavily simplified or if it’s easier to just support the full set. (After all, I found one DOS assembler that is only 8 kb, so there’s not much less you can do.)
Of course, nowadays nobody “seriously” cares about such concerns, everything is done in HLLs with tons of system-specific code. Alignment and error messages practically waste more than actual code. If anything, it’s probably easier (and smaller??) to just write one interpreter and use scripts than constantly compile to binary code.