Programming Language Design as Art
NFTs have brought an onslaught of attention to gifs and other phone-friendly passive media. But not all digital art practices translate easily to singular, collectible assets. Esolangs, programming languages designed as forms of self-expression, are very possibly the least NFT-able digital art. Open ended, community based, and collaborative, they serve as a reminder that digital art has other histories and other futures.
The term esolang is a portmanteau of “esoteric” and “language.” It was coined in the 1990s, when hacker-hobbyists began creating odd languages with no practical use. While they had little interest in the art context of their work, they brought a sense of play and conceptual sophistication that feels at home alongside art by the MFA-educated. Then came digital poets and artists who recognized the potential of the medium.
One of the reasons esolangs have remained on the periphery of computational art is that they are programming languages, requiring a certain amount of computer-language literacy to understand and appreciate. It is my goal to make them accessible and worthy of appreciation to the novice and unfamiliar. I offer three entry points drawn from 10 years of interviews I’ve conducted with practitioners across the spectrum. First up is multicoding, a technique in which multiple meanings can be gleaned from the same text. Next, I explore ethnoprogramming, a recent challenge to the hegemony of English in the text of code. And finally, we turn to conceptual languages, idea-art that runs in our heads, not on our machines.
Piet, a computer language created by David Morgan-Mar in 1991 and named for Mondrian, is perhaps the canonical example of a multicoding esolang, meaning a language that layers multiple readings of a single text. In the case of Piet, that “text” is not textual at all, but an image that serves as code in the language.
A program in Piet is an image, made up of blocks of color called codels. Each codel is like a letter; in combination, they create a command. A transition from light blue to dark red means “NOT,” while moving from red to yellow of similar brightness will tell the machine to “ADD.” The program is read from the upper left, but some commands shift its directional flow, allowing serpentine paths through the image.
Piet has become the most well-known multicoding language not only because it is visual, but because of its almost ideal aesthetic elasticity. Piet programs are usually recognizable as such by people familiar with the language. Yet its aesthetic is continually personalized, expanded on, and challenged by the programmers who use it. Some create illustrations where only part of the image functions as Piet, obscuring its programmatic nature. Other programs are strictly utilitarian, without adornment. The most extreme are computer-generated themselves, appearing like bar codes or schematics for complex circuits. Tomas Scoch and Matthias Lutter have used it to make Mondrian-like images for Piet’s namesake, while others make heavier use of colors like cyan and magenta eschewed by Mondrian. One of the most astonishing, the Pi program by Richard Mitton (discussed by Morgan-Mar here) uses the image of a circle to represent a circle in code. It calculates Pi by literally dividing the area of that circle, as drawn in the program, with the square of its radius; the larger (and thus less pixelated) the circle is drawn, the more digits of Pi can be accurately calculated. This combines the lexical and semantic aspects of the circle together in a way that could only be accomplished in Piet.
There was no way for Morgan-Mar to foresee the directions people would take his language. The creator of an esolang begins a conversation with the set of rules demarcated by the language, but it is the programmers who discover its limits and intricacies. One parallel is the Oulipian challenge to write without using the letter E, which we can attempt ourselves or observe the approach of a writer by reading George Perec’s novel La Disparition (1969). Similarly, the creative potential of Piet is in the field of possibilities it creates, which we experience through the actual works programmers have created for it.
Where Piet’s code is made up of images, in:verse programs generate images or moving content. Its code doubles as poetry. What is unique in in:verse is its variable lexicon: the mapping of vocabulary to command is different for each poem (via a “wordtable”), allowing programmer-poets to finely tune their input and output. To calculate the sine of a number, one program might use the word “alien,” while another uses “mushrooms.” The most interesting in:verse programs find a resonance between their vocabulary and their visual output. Its creator, Sukanya Aneja, is an engineer and artist who built on some traditions of esolanging (in:verse’s stack-based architecture is similar to many early esolangs) while refining it for artistic purposes. Like Piet, it allows individual programmers a lot of control, but each piece is still recognizable as an in:verse work.
Jon Corbett’s language Cree# is part of a new wave of languages described by theorist Outi Laiti as “ethnoprogramming.” Corbett, who is of Métis heritage, is designing the language, which is still in progress, to reflect the language and logic of Métis culture. But before we explore it in detail, some context is helpful.
In his book Critical Code Studies, Mark Marino relates the history of programming languages that incorporate vocabulary from natural language. The source language is nearly always English. He argues that “the prevalence of English in the most widespread contemporary programming languages represents … a form of digital postcolonialism, or the manifestation of a colonizing force beyond the forms of historical, geographical, or territorial colonialism.”
Ethnoprogramming is an active response to the phenomenon that Marino describes. An important precedent for Corbett is Ramsey Nasser’s Arabic programming language ‘alb. Nasser set out to create a language for Arabic speakers learning to code, but ran into biases embedded in systems he built upon, most of which purport to be universal but had little consideration of non-English use; as a result, his work became a document of that struggle. As he asks in his essay “A Personal Computer for Children of All Cultures,” “what is the Pashto translation of AbstractSingletonProxyFactoryBean?”
Corbett, in making Cree#, wanted to go beyond replacing English keywords (commands like “let” and “print”) with Cree keywords in a static list. For one thing, Cree is a morphemic language and he wanted Cree#’s signifiers to hold programmatic meaning at the syllabic level, which is highly unusual in programming languages.
To program in Cree#, we need to understand not only Cree linguistics but also its cultural logic. To declare a variable (which can be thought of as a storage location for data), one must put it in either a mînisiwat, a berry bag, or maskihkîwiwat, a medicine bag. If the variable is everyday or transient, it would go in the berry bag. If it refers to something with cultural significance or sacred meaning, it goes in the maskihkîwiwat. Each time the programmer declares a variable, they decide where it best fits. The closest concept in mainstream languages is that of variable scope, but Corbett is encouraging the programmer to transition to a worldview that is Cree.
To that end, each Cree# program is told in the form of a story, with a set of standard characters and symbolic actions from Métis storytelling tradition, prominently featuring a trickster raven and beginning each program with a gesture of smudging. Corbett also has a variation of Cree# called Ancestral Code, designed not for general-purpose computing, but instead as a visual archive to preserve stories from Cree and Métis Elders. Corbett’s nuanced writing about the project examines the difficulties with evaluating what levels of knowledge can be spread more widely and which are meant to remain only within the culture, along with issues of unintentionally incorporating Western views of Indigenous cultures into the language.
Is HTML a programming language? This question is raised nearly constantly on Twitter. While it is really a question of what computer labor we value or consider skilled (and let it be said that html/css work is programming and can be quite challenging), the fact that this debate can happen at all points to the fact that there is no clear technical line that demarcates what is or is not a programming language. Occasionally one is attempted by equating programming languages in general with something called Turing Completeness, which roughly means the ability of a language to represent any algorithm runnable on a conventional computer. Turing Completeness is a terrible yardstick not only because of what it excludes but also because it brings in all kinds of things we wouldn’t consider programming languages, including, as recently shown, human heart tissue.
In the conceptual languages, no programming can occur. Some of these languages are extremely minimalist or maximalist. Perhaps the most minimal is Unnecessary, created in 2005 by a pseudonymous esolanger called Keymaker. For Unnecessary, any content is too much, even an empty file; only the absence of content qualifies as code within the language. The only valid program in the language is the file that doesn’t exist. Once that file is (correctly) not found, it is run: its lack of code is interpreted as a command to print the source code of the file to the screen, which results in nothing since there is no file to read, no code to print (this is known as a “null quine”). The creation of nothing from nothing is a successful outcome for Unnecessary.
In contrast, the mathematician David Madore has created a series of transfinite languages that break fundamental laws of computation and can count to the infinite. They do so by running on an infinitely large computer, which can never be built in our physical universe. While no one will ever code in them, they are perfectly valid, well-defined languages.
These conceptual languages do not run on our computers, but in our heads. Other conceptual languages may rely on self-contradictory, or intentionally ambiguous, rules. The language Malbolge, for instance, has a written definition that slightly differs from its representative compiler, both created by Olmstead. Since there is no singular digital asset that defines the language, this contradiction created a schism in the community between those who think the bug is in one or the other. Anyone can create their own Malbolge interpreter that aligns with either.
This is why esolangs are poorly served by the idea of NFTs. Of course, sooner or later, someone will create an NFT of an esolang. But imagine doing so for Piet: would it be tied to the list of rules for the language as defined by Morgan-Mar? To one of the many interpreters and programming environments others have created for Piet programming? Or to any of the thousands of Piet programs?
Part of what makes esolanging exciting is that interchange among many contributors, the knowledge that the language has more to discover. While no one discounts Morgan-Mar as Piet’s creator, his work finds its full expression through others’ efforts. Likewise, conceptual languages with programs from the infinitely large to the infinitely small challenge the idea of digital objecthood, emphasizing concept, process, and procedure, at the expense of static form. The best esolangs, like much great digital art, are conversations.
Editor’s Note: This article is part of a special edition of Hyperallergic devoted to under-recognized art histories.