Pointy
Pointy is a six-instruction Turing tarpit posted to the Esolang wiki on 10 June 2006 by Sophie Swett (writing as Ihope127), in which 'the basic datatype is the pointer': every operand is a memory address, a value is read by prefixing it with *, and the only control flow is a decrement that jumps when it finds a zero. Marinus Oosters wrote a C interpreter and a 99 Bottles of Beer program for it in July 2006; the language has not changed since, and its master-list entry as a 2011 object-oriented web language is wrong on every count
Created by Sophie Swett, who edits the Esolang wiki as Ihope127 and is best known there for /// ('Slashes'). The first implementation, a C interpreter, and the 99 Bottles of Beer program are by Marinus Oosters (wiki user Marinus), who added them on 3 July 2006
Pointy is a minimalist esoteric programming language whose entire specification fits in eight lines. It was posted to the Esolang wiki on 10 June 2006 by Sophie Swett, who edits there as Ihope127, with the one-sentence design statement “The basic datatype is the pointer.” A Pointy program is a list of three-letter instructions - LBL, CPY, INC, DEC, OUT and INP - whose operands are numbers naming cells in a flat memory; writing * in front of a number reads the cell instead of naming it, and there is nothing else. Control flow is a single instruction, DEC x foo, which decrements cell x unless it is already zero, in which case it jumps to label foo. That is enough, as the article notes in one further sentence, to simulate a Minsky machine and therefore to compute anything.
The language has exactly one implementation, a roughly 210-line C interpreter written by Marinus Oosters within three weeks of the spec, and a corpus of four published programs: a Hello World, a cat, Oosters’s 99 Bottles of Beer, and - ten years later - a Brainfuck interpreter, also by Oosters. It was never versioned, never extended and never used for anything else, and it needs to be said plainly that the catalogue entry that brought it to this site (Pointy, 2011, OOP, Web, Dormant) is wrong in every field but the name: Pointy dates from 2006, has no objects, has nothing to do with the web, and “dormant” is not quite the right word for a language that was finished the day it was written.
History and Origins
The Esolang wiki in 2006
The Esolang wiki - then at esoteric.voxelperfect.net, later esolangs.org - was the place where the esoteric-language community of the mid-2000s wrote down its inventions, and 2006 was a prolific year: the wiki’s category for languages created that year holds 78 pages. Ihope127 was one of its most active contributors. The wiki’s own record shows the account starting seventeen new main-namespace pages in 2006 (two of them the Pointer concept stub and a duplicate title), including /// (“Slashes”, 7 February 2006), the string-rewriting language that the wiki now marks as a featured language, and a run of small machines and Brainfuck variants through the spring. Pointy arrived on the evening of 10 June, between two of them.
The article’s first revision, saved at 22:03 UTC, was 588 bytes long: the attribution, the pointer sentence, five instructions and the remark about dereferencing. Six minutes later a second edit added the “missing” INP instruction (the edit summary’s own scare quotes), the claim that Pointy “is Turing-complete because it can simulate a Minsky machine” and “can also emulate Brainfuck with a tape that extends infinitely only to the right”, and five categories - Languages, 2006, Turing tarpits, Unimplemented and Low-level. One minute after that, the same author created the wiki’s “Pointer” concept article, at the time a single sentence (“A pointer is a value that represents a location of some value in memory”) with a stub marker; it has since grown into a long general essay. Pointy, in other words, was written in about ten minutes, and it shows in the best sense: there is nothing in it that is not needed.
Questions, answers and examples
The next day, wiki user Sedimin left three questions on the talk page: “Nice one :) Is there way how I can move the pointer itself? or - is there reference operator (like & in C)?” and whether OUT prints a character code or a number. Ihope127’s reply is the closest thing Pointy has to a design rationale. To change a pointer, “use INC or DEC on a pointer to the pointer (whee!)”. There is no reference operator “for the same reason that you can’t pass a function its output and get its input - that is, you can’t push a value through a function ’the wrong way’”: * is a function from addresses to values, and Pointy does not provide its inverse. The reply also supplied a cat program and a “Hi!” program (“because I’m too lazy to write a ‘Hello, world!’ program”). Sedimin took the hint, and the same day restructured the article into Instructions, Examples and Computational class sections, adding a full Hello World and the cat program. Apart from formatting, that is the article as it stands today.
Marinus Oosters and the implementation
Marinus Oosters created a wiki user page on 1 July 2006 and two days later added an “External resources” section to Pointy with two links: a C interpreter and a 99 Bottles of Beer program, both hosted on a personal machine at the bare IP address 82.176.104.9. The category changed from Unimplemented to Implemented, and Ørjan Johansen - a long-standing wiki editor who signs as Oerjan - tidied the list formatting the following day. On 21 August 2006 Oosters submitted the 99 Bottles program to 99-bottles-of-beer.net, the German-run catalogue of the song in every language its readers could supply, where it was filed as entry 1245 in the “esoteric language” category with the wiki article as its Info link.
Oosters was, by the wiki’s account, primarily an implementer of other people’s languages: the user page lists interpreters for a dozen of them (LNUSP, Gibberish, Minimal-2D, REVERSE, Word!CPU, ZOMBIE, 96, LOCK, Unreadable, Nhohnhehr, Fuckfuck and more). The hosting history of those interpreters is a small parable of hobby-web fragility. The IP-address links were replaced in August 2007 by a dynamic-DNS hostname, marinus.is-a-geek.org, and by April 2010 that was gone too. On 28 April 2010 Oosters rewrote the user page - “I had a website, but I don’t have the resources to keep a dedicated server running. I’m going to upload esolang stuff here” - and pasted the full source of pointy.c into a wiki subpage, then repointed the article’s links to the subpage and to the 99 Bottles entry. That copy, whose header comment still says “see http://esoteric.voxelperfect.net/wiki/Pointy", is the only surviving implementation of the language.
Later edits
The article’s remaining edits all concern the Turing-completeness section. Between 15 August and 1 October 2013 wiki user Poolala expanded the one-sentence Brainfuck claim into a table giving a Pointy sequence for each Brainfuck command, corrected it (“Fixed Brainfuck to Pointy conversion”, 18 August) and revised it twice more; Oerjan’s formatting pass on 1 October 2013 is the last edit the page has received. On 5 February 2016 Oosters added a Brainfuck interpreter written in Pointy to a personal wiki page collecting such interpreters in several tarpits. Nothing has happened since.
Design Philosophy
Everything is an address
The unusual thing about Pointy is not its size - six instructions is ordinary for a tarpit - but the decision to make the address rather than the value the primitive. In most counter-machine languages an instruction such as INC 5 means “add one to register 5”. In Pointy it means the same, but the operand 5 is understood as a pointer to cell 5, and INC *5 means “add one to the cell whose number is stored in cell 5”. Since * can be stacked, INC **5 follows the chain twice. Every operand of every instruction is evaluated this way, which gives the language indirect addressing at no cost in syntax and makes arrays, pointers-to-pointers and computed addresses fall out for free.
The CPY instruction is the clearest illustration. CPY x y “stores the value x in memory location y” - so CPY 108 1 puts the number 108 into cell 1, while CPY *3 4 copies the contents of cell 3 into cell 4, and CPY *x z followed by OUT *z (from the Brainfuck table) is how one prints the cell that x points to. There is no separate “load”, “store” or “move”; there is one instruction and the question of whether an operand is an immediate or a reference is answered by counting asterisks.
Two consequences of the design were spelled out by the author. First, because cell 0 exists, “there is no null pointer” and “* never fails to produce a result”: Pointy has no invalid-dereference error in principle (Oosters’s interpreter does add bounds checks). Second, there is deliberately no address-of operator. Dereference is a one-way function from pointers to values, and the language refuses to run it backwards; if you want to move a pointer, you keep a pointer to it and INC that.
One instruction for all control flow
DEC x foo does two jobs. If cell x is non-zero it decrements it and falls through; if it is zero it leaves it alone and jumps to foo. That single combined test-and-decrement is the standard minimal control primitive of counter machines (Minsky’s “decrement or branch on zero”), and Pointy adds nothing to it: there is no unconditional jump, no equality test, no comparison. The idioms that programmers built on it are visible in every surviving program:
- Unconditional jump:
DEC 0 label(or any cell known to hold zero). The 99 Bottles program relies on cell 0 never being written; the Brainfuck interpreter begins withCPY 0 0 ; Zero cell for unconditional jumpto make the assumption explicit. - Countdown loop: put a count in a cell, do the work,
DEC cell exit, jump back. - Equality test: copy both values into scratch cells and decrement them in lockstep; whichever reaches zero first tells you which was smaller, and if they reach zero on the same round they were equal. Oosters’s Brainfuck interpreter does this for every command it dispatches (
DEC 4 maybe_inc / DEC 5 not_inc / DEC 0 check_inc). - Discarding a jump: when a
DECis wanted purely for its decrement, point it at a label that is never reached in practice; the 99 Bottles program usesLBL dummyat the end of the file for this.
A Turing tarpit on purpose
Ihope127 filed Pointy under “Turing tarpits” at creation, and the classification is exact. Alan Perlis’s epigram, which the wiki quotes at the head of that category, warns of “the Turing tar-pit in which everything is possible but nothing of interest is easy”, and Pointy’s Hello World - fifteen lines to print thirteen characters, with the two repeated letters stored in cells so that they can be printed by dereference - is a fair illustration. The proof of universality is equally minimal. Cells that can be incremented and decremented-with-branch-on-zero, without bound, are the registers of a Minsky machine, and two such registers are known to suffice for universality; Pointy has as many as memory allows. The article’s second demonstration, the Brainfuck translation, is more concrete and is reproduced below.
The Language
Instruction set
The complete specification, as it has stood since June 2006:
| Instruction | Meaning |
|---|---|
LBL foo | Not really an instruction: marks a destination for a DEC jump |
CPY x y | Stores the value x in memory location y |
INC x | Increments the value at memory location x |
DEC x foo | Tries to decrement the value at memory location x. If x already held 0, jumps to foo |
OUT x | Outputs x |
INP x | Inputs a value into memory location x |
Pointers are dereferenced with *: *x is the value at location x. Comments were not part of the spec, but the examples use ; and the interpreter honours it.
What the spec leaves unsaid is also worth listing, because the interpreter had to decide it: the width of a cell, the size of memory, what OUT does with a number (print a character, as all the examples assume, or print digits), what INP returns at end of input, and whether the program halts when it runs off the end (it does). None of these were ever settled in the article, so pointy.c is in practice the definition.
Hello World
Sedimin’s June 2006 example, which prints Hello, world! (lower-case w: 119). Cells 1 and 2 hold the letters l and o, each of which occurs more than once:
CPY 108 1
CPY 111 2
OUT 72
OUT 101
OUT *1
OUT *1
OUT *2
OUT 44
OUT 32
OUT 119
OUT *2
OUT 114
OUT *1
OUT 100
OUT 33
Cat
Ihope127’s program from the talk page, with the author’s comment. Note that the loop has no exit; the language has no end-of-input test, so a Pointy cat runs until it is killed:
LBL start
INP 0
OUT *0
DEC 1 start ; the value at 1 will be 0, so this jumps to start
The 99 Bottles counter
The heart of Oosters’s 99 Bottles program is the code between verses. Cells 1 and 2 hold the tens and units as numbers, cells 3 and 4 hold the same digits as ASCII, and the four DECs do all the work:
CPY 9 1 ; high digit
CPY 8 2 ; low digit
CPY 57 3 ; high digit ASCII
CPY *3 4 ; low digit ASCII
LBL verse
OUT *3
OUT *4
... ; " bottles of beer on the wall," etc., one OUT per character
DEC 4 dummy ; low ASCII digit down one (the jump is never taken)
DEC 2 dechi ; units down one; when already 0, go handle the tens
DEC 0 continue ; unconditional jump
LBL dechi
DEC 3 dummy ; tens ASCII digit down one
DEC 1 nomore ; tens down one; when already 0, the song is over
CPY 8 2 ; reset units
CPY 57 4 ; reset units ASCII to '9'
LBL continue
... ; print "xx bottles of beer on the wall." and loop with DEC 0 verse
LBL nomore
... ; "No more bottles of beer of the wall!"
LBL dummy
Because the units counter starts at 8 rather than 9 and is reset to 8 whenever it is found at zero, the program never prints a verse ending in 0: run under the author’s own interpreter it goes 99, 98 … 91, 89, 88 … and so on down to “01 bottles”, ninety verses in all, and its closing line reads “of the wall”. These are faults of the program, not the language, and they went unremarked at 99 Bottles, where the entry gathered ten votes (average 3.30 out of 5) and no comments over eighteen years.
Brainfuck in Pointy
The article’s translation table (Poolala’s 2013 version, as tidied by Oerjan) uses three reserved cells: x holds the current Brainfuck cell number, y is a cell kept at zero for unconditional jumps, and z is scratch. Brainfuck cells are the Pointy cells that x points at, so the tape is the rest of memory:
| Brainfuck | Pointy |
|---|---|
> | INC x |
< | DEC x |
+ | INC *x |
- | DEC *x foo / DEC y bar / LBL foo / CPY 255 *x / LBL bar |
, | INP *x |
. | CPY *x z / OUT *z |
[ | DEC x foo / LBL bar / INC x |
] | DEC x foo / DEC y bar / LBL foo |
The - row shows the idiom for 8-bit wraparound (decrement, or if the cell was zero set it to 255), and the loop rows show why the tape can only extend to the right: Brainfuck’s [ and ] are simulated by decrementing and re-incrementing the pointer itself, which is only possible while it is positive. Each [/] pair needs its own fresh labels, so the table describes a translation scheme rather than a literal macro expansion.
Running Pointy
There is no package, binary or Docker image; there is pointy.c, about 210 lines of C on the wiki subpage User:Marinus/Pointy_interpreter. Its header comment records the choices the spec left open, and the source fills in the rest:
| Property | Value in pointy.c |
|---|---|
| Cell width | 32-bit unsigned integers |
| Memory | 65,536 cells (MEMSZ 0x10000), bounds-checked on every access |
| Program size | up to 65,536 lines of 200 characters; up to 256 labels of 20 characters |
| Case | instructions and labels are case-insensitive |
| Comments | from ; or # to end of line (# “so I can do #!/”) |
OUT | writes the low byte of the value with putchar |
INP | reads one byte with getchar; returns 0 once end of file has been seen |
| Errors | printed to standard error, after which the program exits |
A comment in the source observes that “of a 209-line interpreter, the actual interpreting function is only 17 lines”: all the rest is parsing, label collection and error checking, and the run loop is a switch with one case per instruction. The dereference routine counts the leading asterisks of an operand and follows that many indirections, which is the whole of the language’s semantics in a dozen lines.
To try it, copy the source from the wiki page, compile it with a C compiler and run it on a program file:
| |
The 2006 source calls exit, strcasecmp, isdigit and bzero without including the headers that declare them; compilers of the time accepted this silently, but current ones treat implicit declarations as errors unless told to use the old dialect, hence the -std=gnu89. Compiled that way on 30 August 2026, the interpreter printed Hello, world! for the wiki’s example, produced the ninety-verse song described above from the 99 Bottles source, and ran the Brainfuck-in-Pointy interpreter well enough to print “Hello” from a Brainfuck program with two consecutive loops (a quick test of the standard nested-loop Hello World produced garbled bytes instead, which may be a limitation of that program rather than of Pointy; it was not investigated further). These are observations from one machine and one afternoon, not a statement of supported platforms - the interpreter has none.
Evolution
Pointy did not evolve. Its specification was complete within six minutes of its creation, and every later edit to the article was documentation: examples on 11 June 2006, links on 3 July 2006, link repairs in 2007 and 2010, and the Brainfuck table in 2013. There were no versions, no dialects and no proposals for change; the talk page’s one exchange ended with the author explaining why a feature was absent rather than adding it. The implementation likewise: the surviving pointy.c is, as far as the record shows, the 2006 program republished unchanged in 2010. The only development after that is the 2016 Brainfuck interpreter, which is a program in Pointy rather than a change to it.
Against that record, the master-list metadata that accompanies Pointy on this site - year 2011, paradigm OOP, category Web, status Dormant - deserves a moment’s attention, because each field is checkable and each fails. No event in the language’s history falls in 2011; the nearest are Wayback captures of the old wiki URL in May, June and August of that year. Nothing in the language corresponds to objects, classes or messages. It has no connection to the web beyond being documented on a wiki. And “dormant” implies that something once stirred: Pointy was a finished ten-minute design from the start, and remains exactly what it was. It is a useful reminder that catalogue rows about tiny languages are often generated rather than researched.
Current Relevance
Pointy has no users and never did, in the ordinary sense; it exists to be looked at. The Esolang article is live and was last captured by the Internet Archive on 12 February 2026; it sits in the wiki’s Language list, its 2006 category, its Turing tarpits category and in ais523’s curated list of Turing-complete languages. The interpreter is preserved only as a <pre> block on a wiki user page - a fragile home, but one that has now outlasted two of the author’s own servers by sixteen years.
The 99 Bottles catalogue, which for two decades was the second place Pointy could be found, is another matter. The Wayback Machine’s last complete capture of entry 1245 is dated 9 November 2024, still showing “3.30 in 10 votes” and still linking to the wiki’s long-dead voxelperfect.net address; the one later capture of the entry (10 June 2025) is a near-empty page, and although the site’s front page was still being captured live on 2 May 2026, by 30 May 2026 the domain showed only a hosting provider’s parking page (its fate is discussed at more length on this site’s page for pine, another language known mainly from a 99 Bottles entry). For Pointy the loss is small, since the wiki holds everything, but the entry was the only place the program was published under Oosters’s name with a date, and it is the source of the “2006” that this page can state with confidence.
Why It Matters
Pointy is a footnote, and an honest page should say so: it is one of dozens of six-instruction machines that the esolang community produced in the 2000s, and it is not the most elegant, the most famous or the most studied of them. Its interest is threefold.
First, it is a clean example of a design idea taken to its end. Making the pointer the only datatype, and dereference the only operator, gives a counter machine indirect addressing without adding a single instruction, and the author’s refusal to add an address-of operator - on the grounds that you cannot run a function backwards - is a small, sharp piece of language-design reasoning of the kind the wiki’s talk pages were good at eliciting.
Second, it is an unusually complete record of how such a language comes to exist. Because everything happened on a wiki with revision histories, one can see the language being written (ten minutes), questioned (one day), implemented (three weeks), published (ten weeks), losing its hosting (twice) and being rescued into the wiki itself, all with timestamps. Few languages of any size have a history that can be reconstructed to the minute.
Third, it is a case study in how metadata decays. The language’s own record is exact and consistent; the summary of it that circulates in catalogue form is wrong in year, paradigm, category and status. Anyone using such lists to study the history of programming languages should treat Pointy as a calibration point: a row that could be checked in ten minutes against the primary source, and that turned out to be fiction in every column but one.
Not to be confused with
- Pointy (2011, OOP, Web) in language catalogues is this language, misdescribed; no other language of that name and description has been found.
- PointyCastle, the Dart cryptography library, and various “pointy” hat, bracket and template-tool jokes in programming folklore are unrelated.
///(“Slashes”), the same author’s better-known language, is a string-rewriting system with no relation to Pointy beyond its creator.
Sources
- Esolang wiki: Pointy, its revision history and talk page; User:Ihope127; User:Marinus, User:Marinus/Pointy interpreter and User:Marinus/Brainfuck interpreters; ///; Turing tarpit
- 99-bottles-of-beer.net, “Language Pointy” (entry 1245), via the Wayback Machine: captures of 25 September 2006, 20 March 2016, 9 November 2024 and 10 June 2025; captures of the site’s front page of 2 May and 30 May 2026
- Wayback Machine CDX index for
esoteric.voxelperfect.net/wiki/Pointyandesolangs.org/wiki/Pointy
Timeline
Notable Uses & Legacy
99 Bottles of Beer, entry 1245
Marinus Oosters's 171-instruction rendition of the song (154 of them OUT), submitted on 21 August 2006 and scored 3.30 by ten voters. It keeps a two-digit counter in cells 1-2 with ASCII copies in cells 3-4 and drives the whole thing with DEC-jumps through a permanently zero cell 0. Run under the author's own interpreter it prints ninety verses, skipping every multiple of ten (91 is followed by 89), counts down to '01 bottles', and ends with 'No more bottles of beer of the wall!' - quirks of the program, not the language, and apparently never corrected
Brainfuck interpreter in Pointy
A roughly 330-line (237-instruction) Brainfuck interpreter that Marinus Oosters added to the wiki in February 2016, alongside Brainfuck interpreters in DUP, Gibberish, HaPyLi, SADOL and Unreadable. It reads the Brainfuck program from standard input up to a '!' delimiter, stores it from cell 10 upward, dispatches each command by counting down pairs of cells until one hits zero, and implements 8-bit wraparound by hand - the standard way of showing that a tarpit can host a real (if tiny) language
The Brainfuck-to-Pointy translation table
The article's 'Computational class' section, expanded by Poolala in 2013, gives a Pointy sequence for each of the eight Brainfuck commands using three reserved cells (the tape pointer x, a permanently zero y and a scratch z). Together with the observation that INC and DEC-with-jump-on-zero over unbounded cells are exactly a Minsky machine, it is the language's entire proof of Turing-completeness, and the reason Pointy appears in ais523's list of Turing-complete languages on the wiki
Examples on the Esolang wiki
The Hello World (which stores 'l' and 'o' in cells 1 and 2 so that the repeated letters can be printed by dereference) and the cat program, both from June 2006, are the only other Pointy programs ever published. The cat program has no way to stop: DEC 1 start always jumps because cell 1 is never touched, so once input runs out it prints whatever INP returns at end of file, forever