Computation as Expression

Automatically executable language is the largest, boldest step ever in human expressiveness, and we’re not doing much with it. Computer languages allow us to describe concepts without requiring a human brain to interpret them. We have used this to instruct computers to do our taxes, at some point we will use it to redefine art and communication.

It is unusual to think of human and programming languages as instances of the same concept. They have very different uses; English to talk to each other; programming languages to instruct machines. In principle there’s nothing stopping us from defining a programming language rich enough to use in conversation, and sufficiently interpreting natural languages to use in computing. In practice the former would be clumsy, the latter is beyond our current capabilities.

Programming languages have in their form very limited subsets of the expressive elements of natural languages. We keep them strict and terse so that their semantic is well defined and can be executed. This however does not make them less capable. You could conceivably define a domain specific programming language that mimics a simplified English grammar and translate Hamlet to it. Not that you’d want to do that, but you could, and the content wouldn’t be significantly more butchered than if you had translated it into Japanese or Finnish.

What programming languages do give us that no natural language does is a strict definition of how to execute them. This allows us to write programs that a computer can execute deterministically to produce a well defined output. And this capability is the crucial bold step in human expressiveness these languages bring us. Take the Fibonacci sequence, we can define it in English like this:

The first two numbers in the sequence are 0 and 1. Any subsequent number is the sum of the last two.

Someone that knows both English and Ruby can extract the same mathematical concept from both snippets. The English version will be more immediately understandable but that is a property of the form not an inherent distinction between the program and the text. The Ruby version however, is executable and because of the way I wrote it it outputs each of the numbers of the sequence, one per line, until the end of time. The Ruby version is not only a definition of the Fibonacci sequence, it is also automatically expansible into the sequence itself1.

As far as we know, in terms of computation, there is nothing fundamentally different between our brains and a computer. We have not been able to write an artificial intelligence not because we know of something neurons can compute that transistors cannot. What this means is that for the first time in human history the expressive power of the languages we have available to communicate is sufficient to specify any construct that can be present inside a brain. For the first time language is more than a lossy method of communication between two human brains.

The English Fibonacci definition is only an executable definition in the presence of a sufficiently knowledgeable human brain, something we cannot describe down to first principles. The Ruby version however is the Fibonacci sequence even in the absence of humanity, because we can package it, together with an adequate computer, and produce the sequence without a human brain.

When applied to art, this allows us to create pieces that are something instead of representing something. When applied to communication this allows us to describe things in ways that are independent from human culture. We have explored this very timidly. Art uses programming to make representations of concepts dynamic, but they are still representations. Some of our space probes have schematically simplified communications intended to be understood without cultural context. We could instead send out programs representing advanced concepts, along with an example of a full machine to execute them.