Esoteric programming language

From Wikipedia, the free encyclopedia

(Redirected from Funge)
Jump to: navigation, search

An esoteric programming language (sometimes shortened to esolang) is a programming language designed as a test of the boundaries of computer programming language design, as a proof of concept, or as a joke. There is usually no intention of the language being adopted for real-world programming. Such languages are often popular among hackers and hobbyists. This use of esoteric is meant to distinguish these languages from more popular programming languages. Some more popular languages may appear esoteric (in the usual sense of the word) to some, and though these could arguably be called "esoteric programming languages" too, this is not what is meant.

Usability is rarely a high priority for such languages; often quite the opposite. The usual aim is to remove or replace conventional language features while still maintaining a language that is Turing-complete, or even one for which the computational class is unknown.

Contents

The earliest, and still the canonical example of an esoteric language was INTERCAL, designed in 1972 by James M. Lyon and Don Woods, with the stated intention of being unlike any other programming language the authors were familiar with. It parodies elements of established programming languages of the day, such as Fortran, COBOL, and assembly language.

Twenty years later, Wouter van Oortmerssen created FALSE, a small stack-oriented programming language, with syntax designed to make the code inherently obfuscated, confusing, and unreadable. It is also noteworthy for having a compiler of only 1024 bytes. This inspired Urban Müller to create an even smaller language, the now-famous brainfuck, which consists of only eight recognized characters. Along with Chris Pressey's Befunge (like FALSE, but with a two-dimensional instruction pointer), brainfuck is now one of the most well-supported esoteric programming languages. These are canonical examples of minimal Turing tarpits and needlessly obfuscated language features; brainfuck's minimality borders on elegant and pure language design; in fact it is related to the P′′ family of Turing machines.

A Turing tarpit is a Turing-complete programming language with arbitrarily few commands, operators, or the equivalent. These include brainfuck (8 commands, all with 0 operands), OISC (1 command, 3 operands), and Thue (1 command, 2 operands).

The paradigm of a language can fall into a number of categories, and these categories are used to get a general understanding of the way that a specific language operates. These include imperative/despotic languages such as Brainfuck, in which instructions describe how to change data; functional languages such as Unlambda, in which data and code are more or less interchangeable and execution is the repeated application of functions to the results of other functions; and rewriting languages such as Thue, in which transformation functions are applied to an initial state.

A funge is an esoteric programming language which models its programs as metric spaces with coordinate systems (often, but not necessarily, Cartesian) and which execute instructions located at points in their program space by moving an instruction pointer (a position vector which indicates the currently executing instruction) through that space. Different instructions determine the direction in which the instruction pointer moves, and consequently, the sequence of instructions that is executed.

The current official standard for the behaviour of these programming languages is the Funge-98 Specification. This specification is a generalisation of the semantics of the Befunge programming language, which has a two-dimensional toroidal topology. Languages which adhere closely to this standard, such as Unefunge (one-dimensional) and Trefunge (three-dimensional), are sometimes called funges, while more "distant relatives" which differ in significant respects, such as Wierd, are referred to as fungeoids.

For a deterministic language, if one is given the current state of a program, the next state can always be predicted. This is not true for a nondeterministic language. Most languages are deterministic, because nondeterministic languages such as Java2K often give unreliable results, and getting even trivial programs to have a reliable output is often a monumental task. Nondeterministic languages have only a certain probability (less than unity) of behaving the way that they are expected to.

Nondeterministic languages are useful for exploring large search spaces, such as grammars, where exhaustive search is impractical. Random text generators such as the Dada Engine and rmutt are examples of this kind of nondeterminstic language.

More esoterically, nondeterministic algorithms have been employed in the theoretical investigation of hypercomputation.

A despotic language is a Turing tarpit with a stateful encoding, namely a language in which commands are used to select from a finite range of operations and apply these operations to the current state of the program. Examples include reMorse and Whirl, and arguably INTERCAL.

A system of encoding programs such that each substring of the encoding is an instruction to locate the next instruction in a list. An example based on reMorse or THRAT would be:

  • Select Next Operation in list
  • Perform Operation

With the list of operations either standard (as in reMorse or THRAT) or dynamic (as in reMorse4ever).

There is a small but thriving community on the Internet of hobbyists who program in and design esoteric programming languages.

The esolang community is active sporadically, and topics of discussion range from debate as to whether a language is Turing-complete to how one would go about representing abstract and hard to visualise mathematical concepts in a programming environment. There is a mailing list, but it is nearly abandoned and most discussion happens on the wiki (see below).

Turing completeness is a favorite topic of discussion, since it is not immediately obvious whether or not a language is Turing complete, and it often takes rather large intuitive leaps to come to a solution. New languages with new features are always being created, so proof of Turing completeness is always a challenge.

A related pursuit among programming language enthusiasts is the writing of obfuscated code.

Below are some characteristic examples of esoteric programming languages:

  • Befunge and its ilk allow the instruction pointer to roam in multiple dimensions through the code. For example the following program displays "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 >, :, v, _, comma, and ^.
"dlroW olleH">:v
             ^,_@
  • Brainfuck is designed for extreme minimalism and leads to obfuscated code, with programs containing only 8 distinct characters. e.g. the following program outputs "Hello World":
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
  • Chef is designed to make programs look like cooking recipes. e.g. the following statement pushes an item onto a stack:
Put cinnamon into 2nd mixing bowl
  • FALSE is a stack-based language with single-character commands and variables. For example, to calculate 3 + 1 by evaluating (λ x → x + 1)(3): 3[1+]!
  • One instruction set computer is a machine language with only one operation. This is actually a class of languages because one can define such a language for any given operation.
  • Piet is a visual language whose programs are bitmaps that resemble abstract art.
  • Shakespeare is designed to make programs look like Shakespearean plays. e.g. the following statement declares a point in the program which can be reached via a GOTO-type statement: Act I: Hamlet's insults and flattery..
  • Whitespace only considers the layout of whitespace and ignores all non-whitespace characters.


Advanced Search
Included Web Search Engines


Safe Search

close

Top Matching Results

Occasionally Search.com will highlight specialized results that are based on the context of your query. Examples of specialized results include specific links to news, images, or video.

Top Matching Results may highlight information from other Search.com pages, content from the CNET Network of sites, or third party content. The listings are based purely on relevance. Search.com does not receive payment for listings in this section but our partners that provide this data may get paid for listing these products.

Sponsored Links

This section contains paid listings which have been purchased by companies that want to have their sites appear for specific search terms and related content. These listings are administered, sorted and maintained by a third party and are not endorsed by Search.com.

Search Results

Search.com sends your search query to several search engines at one time and integrates the results into one list which has been sorted by relevance using Search.com's proprietary algorithm. You can customize the list of search engines included in your metasearch from the preferences.

The search engines that are used in your metasearch may allow companies to pay to have their Web sites included within the results. To view the Paid Inclusion policy for a specific search engine, please visit their Web site. Search.com does not accept payment or share revenue with any search engine partner for listings in this section.