Content deleted Content added
added citation for hello world brainfuck interpreter |
Alphanumeral (talk | contribs) Added more information regarding redstone |
||
(118 intermediate revisions by 56 users not shown) | |||
Line 1:
{{Short description|
An '''esoteric programming language''' (sometimes shortened to '''esolang''') or '''weird language'''{{r|":2"|page=5}} is a [[programming language]] designed to test the boundaries of computer programming language design, as a [[proof of concept]], as [[software art]], as a hacking interface to another language (particularly [[functional programming]] or [[procedural programming]] languages), or as a [[joke]].
Usability is rarely a goal for designers of esoteric programming languages; often their design leads to quite the opposite. Their usual aim is to remove or replace conventional language features while still maintaining a language that is [[Turing completeness|Turing-complete]], or even one for which the [[Computability theory
==History==
[[File:Hello World INTERCAL.png|thumb|"[["Hello, World!" program|Hello World!]]" program in INTERCAL]]
The earliest, and still the canonical example of an esoteric programming language, is [[INTERCAL]],<ref name="software-studies">{{Cite book |first=Matthew |last=Fuller
For many years, INTERCAL was represented only by paper copies of the INTERCAL manual. Its revival in 1990 as an implementation in [[C (programming language)|C]]{{r|":2"|page=6}} under [[Unix]] stimulated a wave of interest in the intentional design of esoteric computer languages.
{{anchor|FALSE}}
In 1993, Wouter van Oortmerssen created FALSE, a small [[stack-oriented programming language]] with syntax designed to make the code inherently obfuscated, confusing and unreadable. Its compiler is only 1024 bytes in size.<ref name="Wouter">{{cite journal |
== Common features ==
While esoteric programming languages differ in many ways, there are some common traits that characterize many languages, such as parody, minimalism, and the goal of making programming difficult.<ref name="software-studies" />
=== Unique data representations ===
Conventional [[Imperative programming|imperative programming languages]] typically allow data to be stored in variables, but esoteric languages may utilize different methods of storing and accessing data. Languages like [[Brainfuck]] and [[Malbolge]] only permit data to be read through a single [[Pointer (computer programming)|pointer]], which must be moved to a ___location of interest before data is read. Others, like [[Befunge]] and [[Shakespeare Programming Language|Shakespeare]], utilize one or more [[Stack (abstract data type)|stacks]] to hold data, leading to a manner of execution akin to [[Reverse Polish notation]]. Finally, there are languages which explore alternative forms of number representation: the Brainfuck variant Boolfuck only permits operations on single bits, while Malbolge and INTERCAL variant TriINTERCAL replace bits altogether with a base 3 [[Ternary numeral system|ternary]] system.<ref name=":1">{{cite book |last=Morr
=== Unique instruction representations ===
Esoteric languages also showcase unique ways of representing program instructions. Some languages, such as [[Befunge]] and [[#Piet|Piet]], represent programs in two or more dimensions, with program control moving around in multiple possible directions through the program.{{sfn|Cox|2013}}{{page needed|date=June 2022}} This differs from conventional languages in which a program is a set of instructions usually encountered in sequence. Other languages modify instructions to appear in an unusual form, often one that can be read by humans with an alternate meaning to the underlying instructions. [[Shakespeare Programming Language|Shakespeare]] achieves this by making all programs resemble Shakespearian plays. [[Chef programming language|Chef]] achieves the same by having all programs be recipes.<ref name=":1" /> Chef is particularly notable in that some have created programs that successfully function both as a program and as a recipe, demonstrating the ability of the language to produce this double meaning.<ref>{{Cite web |last=Mike |date=2013-03-31 |title=Baking a Hello World Cake |url=
=== Difficulty to read and write ===
Many esoteric programming languages are designed to produce code that is deeply [[Obfuscation (software)|obfuscated]], making it difficult to read and to write.<ref name=":2">{{cite conference |last1=Mateas
=== Parody and spoof ===
One of the aims of esoteric programming languages is to parody or spoof existing languages and trends in the field of programming.<ref name=":2" /> For instance, the first esoteric language
== Examples ==
Line 34:
=== Befunge ===
[[Befunge]] allows the instruction pointer to roam in multiple dimensions through the code. For example, the following program displays [["Hello, World!" program|"Hello World"]] by pushing the characters in reverse order onto the stack, then printing the characters in a loop which circulates clockwise through the instructions
{{Syntax highlight|
|befunge}}
There are many versions of Befunge, the most common being Befunge-93, named as such because of its release year.<ref>{{Cite web|url=https://catseye.tc/article/Languages.md|title=Languages|website=Cat's Eye Technologies}}</ref>
=== Binary lambda calculus ===
[[Binary lambda calculus]] is designed from an [[algorithmic information theory]] perspective to allow for the densest possible code with the most minimal means, featuring a 29-byte self interpreter, a 21-byte prime number sieve, and a 112-byte Brainfuck interpreter.<ref>{{
=== Brainfuck
[[Brainfuck]] is designed for extreme minimalism and leads to obfuscated code, with programs containing only eight distinct characters. The following program outputs "Hello,
<syntaxhighlight lang="bf">
++++++++++[>+++++++>++++++++++>+++<<<-]>++.>+.+++++++
..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.
</syntaxhighlight>
All characters other than {{code|lang=bf|+-<>,.[]}} are ignored.
=== Chef ===
Chef is a [[stack-oriented programming language]] created by [[David Morgan-Mar]], designed to make programs look like [[Recipe|cooking recipes]].<ref>{{cite book|last=Cozens|first=Simon|title=Advanced Perl programming|year=2005|publisher=O'Reilly Media|isbn=978-0-596-00456-9|page=269|quote=A final Acme curiosity, and one of my favourites, is Acme::Chef, an implementation of David Morgan-Mar's Chef programming language. In Chef, programs are expressed in the form of recipes: ...}}</ref> Programs consist of a title, a list of variables and their data values, and a list of stack manipulation instructions.<ref name="chef">{{cite web|url=
=== Chicken ===▼
=== FRACTRAN ===
A [[FRACTRAN]] program is an ordered list of positive fractions together with an initial positive integer input <math>n</math>. The program is run by multiplying the integer <math>n</math> by the first fraction <math>f</math> in the list for which <math>nf</math> is an integer. The integer <math>n</math> is then replaced by <math>nf</math> and the rule is repeated. If no fraction in the list produces an integer when multiplied by <math>n</math>, the program halts. FRACTRAN was invented by mathematician [[John Horton Conway|John Conway]].<ref>{{cite book |last1=Kneusel |first1=Ronald |title=Strange Code: Esoteric Languages That Make Programming Fun Again |date=2022 |publisher=No Starch Press |isbn=978-1718502406 |page=217 |ref=kneusel-strange-code-fractran}}</ref>
=== INTERCAL ===
[[INTERCAL]], short for "
=== JSFuck ===
[[JSFuck]] is an esoteric programming style of [[JavaScript]], where code is written using only six characters: <code>[</code>, <code>]</code>, <code>(</code>, <code>)</code>, <code>!</code>, and <code>+</code>.
Unlike Brainfuck, which requires its own compiler or interpreter, JSFuck is valid JavaScript code, meaning JSFuck programs can be run in any [[web browser]] or engine that interprets JavaScript.<ref>{{Cite web|url=https://thedailywtf.com/articles/bidding-on-security|title=Bidding on Security|last=Bailey|first=Jane|date=2016-02-29|website=The Daily WTF|language=en|access-date=2020-03-02}}</ref><ref>{{Cite web|url=https://alligator.io/js/exploring-jsfck/|title=Exploring JSF*ck|website=alligator.io|language=en|access-date=2020-03-02|archive-url=https://web.archive.org/web/20200302154212/https://alligator.io/js/exploring-jsfck/|archive-date=2020-03-02|url-status=dead}}</ref> It has been used in a number of [[cross-site scripting]] (XSS) attacks on websites such as [[eBay]] due to its ability to evade cross-site scripting detection filters.<ref name="ArsTechnica 2016 eBay">{{cite web|url=https://arstechnica.com/security/2016/02/ebay-has-no-plans-to-fix-severe-bug-that-allows-malware-distribution/|title=eBay has no plans to fix "severe" bug that allows malware distribution [Updated]|work=Ars Technica|author=Dan Goodin|date=3 February 2016}}</ref>
=== LOLCODE ===
Line 82 ⟶ 80:
=== Malbolge ===
[[Malbolge]] (named after the [[Malebolge|8th circle of Hell]]) was designed to be the most difficult and esoteric programming language. Among other features, code is self-modifying by design and the effect of an instruction depends on its address in memory.<ref>{{
[[Minecraft]] is a [[sandbox game]] developed by Mojang Studios, which contains Redstone, a material used to make circuit-like machines for logical processing.<ref>{{Cite web |title=8-Bit Computer (Turing Complete) - Redstone Creations - Redstone Discussion and Mechanisms - Minecraft: Java Edition - Minecraft Forum - Minecraft Forum |url=https://www.minecraftforum.net/forums/minecraft-java-edition/redstone-discussion-and/redstone-creations/3043582-8-bit-computer-turing-complete |access-date=2025-06-08 |website=www.minecraftforum.net}}</ref> Redstone is turing-complete, and can be considered a three-dimensional esolang.
=== Piet ===
Line 89 ⟶ 90:
'''Piet''' is a language designed by [[David Morgan-Mar]], whose programs are [[bitmap]]s that look like [[abstract art]].<ref name=":0">
{{cite web
| title = Piet
| url =
| last = Morgan-Mar
| first = David
| date = 25 January 2008
| access-date =
</ref> The execution is guided by a "pointer" that moves around the image, from one continuous coloured region to the next. Procedures are carried out when the pointer exits a region.
There are 20 colours for which behaviour is specified: 18 "colourful" colours, which are ordered by a 6-step hue cycle and a 3-step brightness cycle; and black and white, which are not ordered. When exiting a "colourful" colour and entering another one, the performed procedure is determined by the number of steps of change in hue and brightness. Black cannot be entered; when the pointer tries to enter a black region, the rules of choosing the next block are changed instead. If all possible rules are tried, the program terminates. Regions outside the borders of the image are also treated as black. White does not perform operations, but allows the pointer to "pass through". The behaviour of colours other than the 20 specified is left to the compiler or interpreter.<ref name=":0" />{{Primary source inline|date=April 2022}}
Variables are stored in memory as signed integers in a single [[Stack (abstract data type)|stack]]. Most specified procedures deal with operations on that stack, while others deal with input/output and with the rules by which the compilation pointer moves.<ref>{{cite book |last1=Kneusel |first1=Ronald |title=Strange Code: Esoteric Languages That Make Programming Fun Again |date=2022 |publisher=No Starch Press |isbn=978-1718502406 |pages=
Piet was named after the Dutch painter [[Piet Mondrian]].<ref name="Cox2013">{{harvnb|Cox|2013|p=6}}</ref> The original intended name, ''Mondrian'', was already taken by [[Mondrian (software)|an open-source statistical data-visualization system]].<ref name=":0" />
=== Shakespeare ===
[[Shakespeare
[[Hamlet#Act I|Act I: Hamlet's insults and flattery.]]
=== Unlambda ===
[[Unlambda]] is a minimalist functional programming language based on [[SKI calculus]], but combined with first-class [[continuation]]s and imperative I/O (with input usually requiring the use of continuations).<ref>{{
=== Whitespace ===
[[File:Whitespace in vim2.png|right|206px|thumb|Whitespace [[hello world program]] with syntax highlighting {{legend|#0000ab|tabs}} {{legend|#ab0000|spaces}}]]
[[Whitespace (programming language)|Whitespace]] uses only [[whitespace characters]] (space, tab, and return), ignoring all other characters, which can therefore be used for comments. This is the reverse of many traditional languages, which do not distinguish between different whitespace characters, treating tab and space the same. It also allows Whitespace programs to be hidden in the source code of programs in languages like C.{{citation needed|date=April 2022}}
== Cultural context ==
The cultural context of esolangs has been studied by Geoff Cox, who writes that esolangs "shift attention from command and control toward cultural expression and refusal",<ref>{{harvnb|Cox|2013|page=5}}</ref> seeing esolangs as similar to code art and code poetry, such as [[Mez Breeze]]'s [[mezangelle]]
==References==
Line 127 ⟶ 125:
* {{cite book |last=Paloque-Bergès |first=Camille |year=2009 |chapter=Langages ésotériques |title=Poétique des codes sur le réseau informatique |publisher=Archives contemporaines |isbn=978-2-914610-70-4}}
* {{cite book|first=Geoff |last=Cox|title=Speaking Code: Coding as Aesthetic and Political Expression|url=https://books.google.com/books?id=wgnSUL0zh5gC&pg=PA6|year=2013|publisher=MIT Press|isbn=978-0-262-01836-4}}
* {{cite book |last1=Kneusel |first1=Ronald |title=Strange Code: Esoteric Languages That Make Programming Fun Again|url=https://
==External links==
{{Commons category|Esoteric programming languages}}
* [https://esolangs.org/wiki/Main_Page Esolang, the esoteric programming languages wiki]
{{Types of programming languages}}
{{Use dmy dates|date=July 2017}}
{{Esoteric programming languages}}
{{DEFAULTSORT:Esoteric Programming Language}}
[[Category:Programming language classification]]
[[Category:Esoteric programming languages| ]]
[[Category:Computer
|