“A language that doesn’t affect the way you think about programming, is not worth knowing” – Alan Perlis.
I’ve thought about this, and developed a short list of languages worth knowing. Not-so-coincidentally, each language in my list embodies a distinct computational model. In no particular order:
- The ALGOL family. C and its descendants. This is often the first language someone learns (in my case BASIC). Changes the way you think because: you learn programming. Functions and pointers are the big things to learn. These languages are also very close to the machine in their computational model: they epitomise the fetch-execute cycle. For many people, this is all they ever learn.
- Forth. This language is so small, there’s not much to learn, but I’m including it because it is definitely a different way of thinking. Stack-based computation.
- Lisp and its dialects. The biggest change here is code as data, which unlocks the power of macros. Closures are definitely a new way of thinking – executable data structures, for example. Also, Lisp fundamentally blurs the edit-compile-link-run workflow.
- Haskell. Lazy evaluation is the huge thing here. Currying and higher-order functional programming are also mind-stretchers, even more so than with Lisp. Pattern matching is also really important and fundamental to Haskell.
- Smalltalk. This is the one I haven’t learned yet, so I can’t say why it’s different, just that it seemed to fit in this list, from what little I know. Embodies the OO computational model.
- Erlang. I’ve recently started looking at Erlang, and to be honest I’m not sure whether it belongs in here or not. It seems quite similar to Haskell/ML, but I’m giving it the benefit of the doubt for its concurrent programming abilities.
Footnote: At university, I first learned ML, then in the second year C, with a few lectures in “Lisp for Customising Emacs”. Prolog and (I’m pretty sure) Lambda Calculus made a brief appearance, and object orientation was taught using Modula-3. It looks like these days they are still teaching ML, also teaching Java and C++, and have ditched Modula-3 (OO taught with C++? Yikes). I regret not learning more Lisp back in the day.
Edit: On reflection, I would probably add Prolog to this list as well. Which would make it seven languages worth knowing.
1 comment