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 I various blogs read, and voila! Here’s my list (in no particular I order):
|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…