2007-05-31

Picking Your Next Programming Language

A lot of smart developers swear by The Pragmatic Programmer, especially its advice to learn one new programming language per year. I've been planning to learn a new language for quite a while now, so I've decided to stop planning and start doing. The first step was to make a shortlist of languages I'd be interested in learning.

To build the list, I took a lot of inspiration from The Shape of Your Mind. I modified his list with some languages I've seen mentioned on the various blogs I read, and voila! Here's my list (in no particular order):

Language Comparison
Language Paradigm Typing Discipline Description
Scheme Functional Strong, dynamic one of the two main dialects of LISP; minimalist; used by SICP
Forth Concatenative (uses RPN) Typeless One of, if not the, original concatenative programming languages; known for its performance and simple parsing; reflective; Used by Open Firmware; standardized by ANSI
Factor Concatenative Strong, dynamic One of the core designers is Slava Pestov; it is currently undergoing active development, with a 1.0 release expected this year
Haskell Pure functional Static, strong, inferred lazy evaluation; monads; type classes; Haskell is pretty far out of the (ALGOL-based) mainstream, but there are a lot of resources available online to get you started.
Erlang Concurrent, functional Dynamic, strong Developed at Ericsson to support distributed, fault-tolerant, soft-real-time, non-stop applications; supports hot-swapping; actually encompasses the language and the runtime system;Follows the Actor Model for concurrency; the sequential subset of the language is functional
Python Multiparadigm: object-oriented, imperative, aspect-oriented, functional Strong, dynamic Popular "scripting" language with support for easy calls out to C; whitespace matters; list comprehensions; used extensively by Google and forms the basis of the Gentoo package management system, portage
Qi Functional optional strong, static enforced by Turing-equivalent type checker a totally badass name; built on top of LISP, so you can use all the features of LISP; aims at being a modern LISP, adding features such as optional static type-checking, partial application, pattern matching, etc.
Prolog Logic programming only type is "term" A logic programming language primarily associated with AI and computational linguistics; declarative.
Oz Multipardigm: logic, functional, imperative, object-oriented, constraint, distributed, concurrent ??? Strongly influenced by Prolog; Provides both lazy and eager evaluation; Particularly strong in the areas of distributed programming and constraint programming; primarily implemented in the Mozart Programming System
Smalltalk Pure object-oriented Strong, dynamic reflective; "code browser" environment; uses message passing and a class-based object-oriented system; influenced the design of most of the later object-oriented languages (Objective-C, Java, Python, Ruby, et al)
Clean Pure functional Uniqueness typing system Pure functional language uses its uniqueness typing system to avoid monads; list comprehensions; Clean IDE
Eiffel Object-oriented Strong, static Somewhat unique in its focus on and support for Design By Contract
Ruby Object-oriented Strong, dynamic While the language design is object-oriented (everything is an object), it supports multiple paradigms and lends itself to metaprogramming; incredible momentum; language used by Ruby on Rails; currently has very Perl-esque syntax, but that is rumored to be going away; current implementation is extremely slow, but improving performance is a high priority; lacks native Unicode support, though that is also targeted for improvement
Perl Multiparadigm Dynamic Extremely polarizing language; regexes are a prominent feature; it's module system, CPAN, is widely regarded as the standard by which other module systems should be judged; once widely criticized for poor quality of code written in it, that reputation has begun to recede, especially with the arrival of Perl 5.
C Imperative Weak, static Designed for systems implementation and machine independence; has been described as portable assembly
Objective-C Object-oriented Strong; a mixture of static and dynamic object-oriented; merger of Smalltalk and C; widely used by Apple; a mixture of static and dynamic, strong typing

Stay tuned to find out which language I picked.

P.S. Please comment with any improvements or suggestions about the information in the table above; since they are on my list of languages to learn, by definition I don't know much about them, so it's entirely likely I mischaracterized them. If I've wronged your favorite language, please let me know politely.

Back to flipping out...

Speaking of Debugging...

I've been struggling at the office lately with some XSL that is apparently trickier than it looks. Of course, as soon as I finished debugging (poorly) my problem, I see this article over at dW. I'd say Aargh! if it didn't remind me of those filthy pirates.

Back to flipping out...

2007-05-21

What is a programmer's purpose in life?

To flip out and write code! (and sometimes to debug that code).

Back to flipping out...