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...

blog comments powered by Disqus