Many programmers have read Paul Graham's essay Beating the Averages which develops a theory of programming language hierarchies. A programmer used to a programming language that doesn't provide certain functionality has trouble imaging how that functionality could be useful. After all, they've gotten along so far without the feature, so it can't be that important, right?
In Graham's words:
As long as our hypothetical Blub programmer is looking down the power continuum, he knows he's looking down. Languages less powerful than Blub are obviously less powerful, because they're missing some feature he's used to. But when our hypothetical Blub programmer looks in the other direction, up the power continuum, he doesn't realize he's looking up. What he sees are merely weird languages. He probably considers them about equivalent in power to Blub, but with all this other hairy stuff thrown in as well. Blub is good enough for him, because he thinks in Blub.
One thing that I don't think has received enough consideration is that this reasoning applies in an interesting way to human languages as well. Different spoken language are specialized towards certain types of communication. English is a language obsessed with time, with a medley of future, past, present, perfect, and progressive tenses. But English isn't as precise at expressing formality as Spanish or French are, both of which have incorporated formality into verb conjugation. Japanese on the other hand, has codified formal speech more precisely than most Western languages1,
Japanese, further differentiating itself from English, doesn't have a future tense: saying "I will go to school" and "I go to school" are expressed in the exact same way. However, Japanese is adept at expressing emotional nuance, and has a few tricks up its sleeves to help talking about temporal events (words like ototoi, asatte, saraisyuu--which respectively mean "the day before yesterday", "the day after tomorrow", and "the week after next"--are really nice to have, and I wish English had equivalents).
Stepping back a bit, lets continue the comparison at work with Graham's argument about blub languages. Specifically, do we think we could make a case for a hierarchy of power among spoken languages? Its a difficult thought exercise to begin, in large part because each language has its own specialized domain (formality, time, emotional nuance, etc), and thus our hierarchy of power would become entirely dependent upon our definition of power. We can easily enough argue English is more powerful than Japanese--if we're talking about time--but changing the definition of power we can quickly enough reverse that statement.
However, I think we can suggest that a fairly clear power hierarchy exists between modern Italian and Latin. Italian greatly resembles Latin, except it has lost many of the tenses and complexities of Latin. Just as Lisp's tragic history of losing to its less powerful successors to its ideas, Latin's structure and grammatical depth have given way to its less potent children (the Romance languages).
Why do more powerful solutions get rejected in favor of the less powerful? The same reason why Latin has fallen into disuse: after reaching a certain point, the benefits (and costs) of having more power are trumped by convenience. The reason why programmers flocked to Python rather than Common Lisp is that Python is powerful enough, and much more convenient. Much of modern software development is dealing with technically easy things2, and the benefit from additional power doesn't justify dealing with difficult package management3, awkward string handling4, or the varied and sundry chaos provoked by divergent competing implementations5.
Until CL's inconveniences are dealt with, it won't matter where Lisp rests in the power hierarchy. All languages in heavy usage today are sufficiently powerful for the common tasks they are confronting, and the ones gaining mind-share are those that are more convenient, rather than the more powerful6.
New emerging languages that wish to become mainstream will have to compete first in convenience and second in power. This is why we are seeing a bevy of JVM based languages emerge--piggy-backing on existing Java libraries and the widespread JVM allows great convenience even with limited penetration--and its also why languages that fail to cater to convenience will flounder, even if they are markedly more powerful than existing popular languages.
It has plain speech, polite speech, and three additional varieties of honorific speech. Usually Japanese textbooks begin the explanation with partially overlapping circles and go downhill from there.↩
Web services are often quite simple to program. Difficulties like how to handle scaling require expertise in that problem domain, but the actual implementation is rarely the limiting factor. Many desktop applications are similar. There is a lot of work and detail put in, but the code isn't inherently difficult.↩
ASDF and ASDF-INSTALL are very usable tools, but they lack the simplicity of Python modules and easy_install.↩
Perhaps we have been spoiled by string centric languages like Python, Ruby and Perl, but dealing with strings in Common Lisp is a much less pleasant process.↩
Inconsistent Common Lisp implementations seems to be the root cause of almost every problem with using CL. A proactive and continued effort to develop updated Common Lisp specifications could have helped stave off this fate, but at this point its become rather damning. Its certainly quite possible to develop CL software that plays nicely across most implementations, but its an inconvenience that simply doesn't exist in recent popular languages, all of which have one official implementation. Notably, they all have spawn side projects that are creating unofficial implementations (JRuby for Ruby, Jython for Python, and so on), but those projects all use the official implementation as their specification, and thus have a frequently updated specification to track instead of an incomplete and dated one.↩
This is true for general languages like Python, but it is also true for specialist languages like Erlang. I think we'll see a trend of more domain specific languages that are extremely convenient in their niche (PHP, Erlang), but that it will be hard to develop generalist languages to be markedly more convenient than the current class. Then again, its dangerous to bet against change, especially in a field with as much history for change as programming languages. Following this line of thought, I think that the Nu language will find a healthy niche, but find it unlikely it'll ever survive outside of a symbiotic relationship with Objective-C.↩
Please: Romanic or Romance Languages, not romantic ... although they are romantic, for sure!
Duly noted, and fixed. Sorry. :/
How, exactly, are romance language "less powerful" than latin?
One of the tenets of modern linguistics is that all languages are, roughly speaking, equally 'powerful', that is, capable of being used to express certain thoughts. Whether they are one word or not, we can and do certainly say things like 'the day before yesterday' withou batting an eyelid, and we are very aware of the level of formality of our speech and others - we would never speak to our boss as we speak to our colleagues, or to them as to our friends or to our children, or to our friends' children; English is as rich in registers as any other language, but we find these things expressed differently, changing our lexis and syntax differently to the choices made in say, Japanese. As a student of Italian and Latin I would be hard pressed to find a concrete example of Italian's poverty of thought and power. Your metaphor with programming languages is very neat, but natural languages follow a different path.
Well, in fact, the same holds for programming languages. Most widely used, general-purpose languages are Turing-complete, which means they can compute any Turing-computable function (see Wikipedia). So, if you can write a solution to a problem in one Turing-complete programming language, you can theoretically also write that exact same solution in any other Turing-complete language.
In practice, however, solving a problem in one language might be a piece of cake, while solving the same problem in another language might be almost impossible, but not completely impossible.
So while in theory both programming languages are equally powerful (you can express the same solutions in both), it might be a lot harder and take a lot more work to do so in one of both, similarly to how expressing "the week after the next week" takes (a lot) more work in English than in Japanese.
As an italian speaker I disagree that italian resembles latin, there is basically nothing grammar-wise even though lexikon-wise there are quite a bit of similarities.
Apart from this, the idea of a blu paradox between natural languages may make sense, I don't know, althogh it seems straneg to me.
But food for thought: every italian sooner or later notices that english comprises various kind of love in a single verb, (you love your parents like your girlfriend like your wife), and I believe portuguese feel the same about saudade not being expressible in other languages. I doubt you don't know the difference when speaking in english though.
And we have words for the day after tomorrow and the day before yesterday, and polite conjugations, so i'd take my language is cooler than japanese ;)
There is a very real difference in the expressiveness of spoken languages, but since we grow up with our languages from a much earlier age than anyone even starts speaking a computer language, it is commensurately more difficult to notice the constraints your own spoken language applies to your very most basic thoughts.
Having spent several years now living in Japan, and a much shorter time in China, many oddities of thought and behavior I have come across could only be explained by the unique difficulties pictographic and tonally significant languages create, a kind of nightmare version of the complaints people have about meaningful whitespace or endless parentheses.
I'd be very surprised to find out that the Romance languages did not keep a constant "global expressivity" -- gaining complexities in other areas while losing, some complexities of Classical Latin.
I don't know enough of the Romance languages to point to more than a trivial instance: Classical Latin had no articles, definite or indefinite. All the Romance languages, I think, have articles. That's an example of expressivity gained, and I suspect there are many more.
If you're interested in discussion of the areas where natural languages have unique expressive possibilities, you might check out the work of Anna Weirzbicka. I don't find her theory of "semantic primes" literally convincing in all its details, but she has used it as a powerful tool to carefully explore various languages' unique expressions, "cultural keywords," including "mate" in Australian, "amaeru" in Japanese, comparing the subtle differences in meaning of Polish, Russian, and German words for "homeland," and other issues. She's a lexicographer so she talks more about words than about syntactic/grammatical possibilities, but it's still very interesting stuff.
I wouldn't want to delve too much into the details of the power of specific natural languages, but I do recognize a parallel with programming languages about the way we think.
I was born in Brazil and speak native portuguese. I learned English in my teens and have an understanding of English which is now similar to that of my portuguese. And I've also learned some japanese along the way.
I can't think in japanese yet. But I DO think in both english and portuguese. And I think in both languages togheter, not as 2 different entities. Just as if you would think "ototoi" instead of "the day before yesterday", there are many places where english words apply that portuguese words don't, and vice-versa.
And those changes DO CHANGE the way I think. I don't think I'd have the same thought process had I not known one of those languages.
This is similar to the change that you have writing algorithms once you become versed in a functional programming language, after you've programmed imperative languages (as happened to me, learning Common Lisp after years working with C++ and Java). I know program a lot of javascript (which has some functional heritage) and my thought process feels different, and I think it's mostly because of what I know about Common Lisp, and I believe it would be even more different if I had a larger understanding of Common Lisp, or if I knew a different paradigm language, like Erlang or Prolog.
Larry Wall talked about this in one of his State of the Onion addresses. He said that you could consider human languages to be turing-complete; what varied was what you were required to do. Japanese requires more emphasis on correct formalities, Romance languages have gender-specific nouns, and so on.
In general Larry Wall's speeches are thought-provoking reading.
Reply to this entry