< Perl Signature Quine | Russ Allbery > Technical Notes | XEmacs and Movable Type > |
The most important thing in the programming language is the name. A language will not succeed without a good name. I have recently invented a very good name and now I am looking for a suitable language.
— Donald Knuth
Around the beginning of April, 2001, I decided that I'd gone too long without learning a new programming language. I'd been using very little other than Perl and C for quite some time, and while I'm fairly fond of both of those languages, there were ways of thinking about writing programs that I'd never been exposed to and that I was curious about. I put some time into looking around and then learned Python, but then stopped exploring new ways of programming again around 2005. At the start of 2010, I read Coders at Work, which inspired me to put effort into learning new programming techniques again.
These are my notes on the topic.
For some context for what follows, you may want to read my programming background. One's opinion on languages is strongly influenced by one's background, in my opinion.
So far, I've started on the following languages:
Here's the rest of my list, in rough priority order, with links to good starting points if I have them available:
Objective Caml. I'd like to learn a functional programming language; I have some small experience with ML and rather liked the language, plus functional languages are a large class of languages that I've never really used. While there are a huge variety of choices in the functional family, Objective Caml seems to have the best Unix support at the moment and seems to be the most easily usable for the sorts of problems I solve daily.
Mercury. I would just plan to learn Prolog, as I want to learn at least one declarative language, but I've heard bad things about existing Prolog implementations and there doesn't seem to be much activity around Prolog these days. I first became interested in Mercury by following the initial steps of the integration between one of its backends and GCC.
Eiffel. A real object-oriented language, rather than something patched together from an incompatible paradigm. Besides, I really want to study and understand the concept of programming by contract, and learning Eiffel seems to be the best way to do that.
Common Lisp. It just seems far too important to pass up, plus my experience with emacs Lisp has made me curious. After asking about, Lisp by Winston and Horn, ANSI Common Lisp and On Lisp by Paul Graham, and Object Oriented Programming in Common Lisp by Sonya Keene seemed to be the recommended books to start with. I haven't bought any of these yet.
There are a few other languages that may seem like obvious choices but which I'm not interested in for various reasons:
C++. I partly know C++ already, in the sense that I've written some programs in it, but I've never used exceptions, templates, the STL, or any real language features, so I don't really understand how the language is supposed to work. I've been tempted by it from time to time just because of the easy transition from C, but it feels like for the investment of time required I could learn a cleaner and more unique language. (Reading The Design and Evolution of C++ by Bjarne Stroustrup has almost changed my mind, though. That's an excellent book.)
Fortran. I actually find Fortran very interesting as a language, despite the fact that it's rather old and shows its age, but unfortunately its problem domain really doesn't intersect at all with the problems that I want to solve. I hardly ever do anything involving lots of computation, which is where nearly all the Fortran expertise is focused.
Ada. I'm still unsure here, as Ada95 looks like a very nice language and GNAT looks like an excellent compiler maintained by a lot of people I have a great deal of respect for. But I think I can get most of what I would get out of Ada by learning Eiffel instead, and there are things in Eiffel I'm curious about that I can't learn from Ada.
Finally, various people have written me and recommended other languages to look at. These are the recommendations that also sounded interesting to me, but which didn't make it up to my top list.
Erlang. Another functional language but with influences from Prolog, Erlang is widely used by Ericsson for embedded applications. I have been told that it deals well with concurrency. I decided that learning just one functional language is going to be hard enough and picked Objective CAML over Erlang since it seemed to have more native support for Unix scripting, and it was therefore more likely that I'd actually use it.
Mozart. A programming system built on top of the language Oz. I don't know very much about this one, except that it looks like it may take a very different approach. I'm not familiar with constraint programming, and this might be an interesting way to learn.
Ruby. This language has been recommended to me from more conventional quarters, as another scripting language. We're using Puppet heavily at work, which is written in Ruby. It sounds interesting, and some of the syntactical concepts sound like they could be rather fun, but it's close enough to Perl and Python that I'm not sure I'd learn that much from studying it. I also intensely dislike the language community's mindset around distribution of shared code and cooperation (or lack thereof) with distribution packagers, and the database code created by Ruby on Rails is horrible.
Comments on these lists are welcome, and please do feel free to point out languages you think I might have overlooked. Please don't send me anything even remotely like language advocacy, though; I'm not interested. Mark-Jason Dominus summed up my opinion pretty well in his article Why I Hate Advocacy.
< Perl Signature Quine | Russ Allbery > Technical Notes | XEmacs and Movable Type > |