Monday, May 10, 2010

Language of the Year

Several some many years ago, I decided to learn a new programming language a year. I don't subscribe to the "once you're a programmer, you can learn any new language in a few weeks" theory, so I didn't intend to get to guru status on any of them in 52 weekends and a few nights. Instead, the idea was to get good enough to be able to read code well, synthesize code at a decent level of competency, and understand the ideas behind the language, then move on.

If memory serves me correctly, I started with Java, then moved through REBOL, Python, Ruby, Scheme, and Lua before I dropped the practice. I tried getting back into it with Haskell a few years ago, but didn't take it to the "ok, I get it now" level of proficiency--mostly because of time constraints of changing jobs rather than any issue with the language.

I did learn something from each of these, which is the real point of the exercise. Now I'm thinking about starting a (belated) Language of the Year for 2010. The contenders are:

Erlang
Pro: interesting concurrency (independent processes) and data (immutable) models.
Con: might be too big to get my head around in nights and weekends

Io
Pro: Small surface area; looks like "Lua with a prototype-based object model" so far; might be useful practically.
Con: Not sure there's enough new there after doing Lua and REBOL.

Clojure
Pro: Interesting transactional memory model. Also, parentheses.
Con: I'm wondering how much time I'll spend re-learning the Java environment vs. learning Clojure.

Go
Pro: Interesting concurrency model; might be useful practically.
Con: Not sure there's enough different there, compared to Clojure or Erlang.

Part of the problem is picking a language that different enough to make it worth learning, but not so different that I can't use it for small, practical tools that I can actually use day-to-day. The Haskell and Scheme experiences showed me that if I can't use what I'm practicing day-to-day, I find it hard to keep devoting time to the project.

At the moment, it's looking like Clojure > Go > Erlang > Io. I'll probably pick up a distribution for each, get as far as "hello world", and then decide.

1 comment:

David said...

I recommend learning Io. It will surprise you once you dig into the language a bit.

Sure, it uses prototypes like Lua and REBOL, but that's nothing special. Plenty of languages use prototypes for their objects. What's unique about Io is its message passing system.

Everything in the language is implemented in terms of dynamically modifiable messages. That means you can basically change anything in the language at runtime. For example, you can implement Python's docstrings in Io within the language itself (with no changes to the Io interpreter).