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