I’m obsessed with programming languages. Typical day: Start a project in Perl, encounter obscure bug, rewrite in Erlang, repeat.
In Order Of Likelihood Of Thinking “I’ve Got A New Project, I’ll Use This Language For It”
Haskell
Pros:
Strictly typed. No null-type errors, no guessing what the hell a value is, or which obscure flags a function accepts as input.
Lazy evaluation. Infinite data structures, won’t run any code unnecessary for computation.
Functional. Can map over lists, using anonymous functions to specify filters. Can write functions that manipulate other functions. Can compose multiple functions together.
Pure. Code with no side-effects. Parallel programming is built-in and damn easy.
Code with side-effects is managed using monads.
Multiplatform. Mac, Windows, Linux.
Excellent, free book: Real World Haskell.
Quick tutorial: Learn You A Haskell.
ghci Interpreter.
ghc --make has all you need to build a stand-alone executable.
Cabal package management.
Quickcheck makes unit testing a breeze.
F# is Haskell for .NET.
#haskell is filled with helpful PhDs.
Cons:
Programs typically take more work before they compile. However, once they compile, bugs are rarely present.
Obscurity results in few tutorials, minimal documentation.
Cabal suffers from dependency issues.
Common Lisp
Pros:
Macros. Code that writes code that writes code. Can write custom code blocks.
Quicklisp package manager.
Functional.
Excellent, free book: Practical Common Lisp.
Another good book: Land of Lisp.
Cons:
Common Lisp implementations vary WILDLY in capabilities, tab completion, syntax, error traces, operating system support, package systems, maintenance, and openness to resolving fundamental design flaws (e.g., shebangs, threads, command line options).
Lisp syntax too uniform (Lots of Irritating Superfluous Parentheses).
Obscurity results in few tutorials, unreadable documentation.
Merely obtaining a Common Lisp platform is a pain.
No de facto standard. SBCL is the most popular, CCL is the easiest to install, and LispWorks is the most complete. Some only run on Windows. Some only run on Mac OS.
#lisp community is a bunch of assholes.
Ruby
Pros:
Monkeypatching. Can modify core behavior with easy, normal syntax.
Object oriented. Smalltalk-inspired OO, that is. Everything is an object. Along with monkeypatching, makes Ruby really flexible (e.g. Rails).
Some functional ability. directory.files.lines.words.letters.collect { |letter| letter.upcase } is typical.
Scripting and excellent POSIX support. Think Perl but with good OO.
RubyGems package manager.
Searchable, intuitive, detailed documentation with RDoc.
Multiplatform. Mac, Windows, Linux, even Haiku. Comes built-in on Mac.
Tutorial: Why’s (poignant) Guide to Ruby.
JRuby is Ruby for JVM.
IronRuby is Ruby for .NET.
Cons:
Slow.
OO permission issues.
RubyGems issues, especially in Ubuntu Linux.
Python
Pros:
Scripting.
Choice between functional and OO programming.
Multiplatform. Mac, Windows, Linux. Comes built-in on Mac and most Linux flavors.
Free book: Dive Into Python.
C-style names for standard library functions. No having to guess and search for functions.
OO without the inconveniences of permissions.
Jython is Python for JVM.
IronPython is Python for .NET.
Slowly gaining industry and academic acceptance. Python is a radical language for rebel programmers. That’s a joke. Try Scheme, ML, or LLVM.
Cons:
Confusing “self” object syntax. There shouldn’t be a need to specify “self” as a function parameter.
Whitespace scope. Introduces tabs-vs-spaces problems. Coding over a remote ajaxterm connection, or any terminal without a tab character, is impossible.
Multiple package systems. PyPM, Eggs, something called “PackageManager”.
Java
Pros:
Multiplatform. Mac, Windows, Linux. Comes built-in on Mac.
Excellent, highly organized documentation.
Major industry and academic support. If a programmer doesn’t know Java, he’s been out of the field for a long time.
Many books and tutorials.
Like C++, but with consistent syntax.
Good error traces.
Cons:
Verbose. Hello World takes way too many unexplained symbols.
Too few tutorials for common behaviors like generating JAR files.
Idiots gushing about how cool and object-oriented Java is. You still have to explicitly cast objects to retrieve them from ArrayLists. Primitives don’t have method calls. Read a freakin’ book. OO has been around since the 70′s. It’s not cool, it’s expected.
Obsession with colossal, overly complicated libraries like Spring and Struts. Woo, enterprise! Let’s Web 2ify our persistent relational databases.
Obsession with heavyweight text editors like NetBeans and Eclipse.
Stand-alone executables must be bundled with the hefty JVM.
C
Pros:
Fast.
Imperative is intuitive.
Can be multiplatform (Mac, Windows, Linux) if the program doesn’t use OS-dependent function calls. In particular, getting getoptlong to work on multiple platforms is a pain.
Major industry and academic support. Many tutorials, docs, and program code available.
THE book: The C Programming Language.
Foreign Function Interface (FFI) allows C to be called from almost any programming language.
Cons:
Verbose.
Malloc and free suck. Use Boehm GC instead.
NodeJS
Pros:
Event-driven, asynchronous programming. Good for servers, GUIs, etc.
NPM package manager. Super easy package creation.
Functional programming with the Underscore library.
node-quickcheck makes unit testing a breeze.
Multiplatform (Mac, Windows, Linux).
JSON configuration format is easy to read and write.
Cons:
Very new.
Slow.
Library is based on the ECMA standard. The ECMA standard is retarded. Example: Any NaN object never equals another NaN object.
Very hard to determine the type of an object. Example: typeof(o) returns “object”, but o could be an OO object or a simple hash.
Disorganized standard library (not even counting differences between Microsoft’s, Apple’s, Opera’s, Mozilla’s, and Google’s JavaScript engines).
Obscurity results in few tutorials, minimal documentation.
Erlang
Pros:
Green threads. Super easy threading and message passing syntax.
Agner package manager.
Multiplatform (Mac, Windows, Linux).
Triq makes unit testing a breeze.
Inspired a cool NoSQL database, CouchDB.
Cons:
Unintuitive syntax overall. Line endings include blanks, commas, semicolons, and periods.
Having to specify function arity.
Syntax like Haskell’s, but bludgeoned over the head a few times. Let’s make functional programming arduous.
Disorganized docs.
Poor scripting support. erl hates shebangs and is oblivious of recursive calls until a module is compiled.
The command to quit erl is top secret. It’s actually q().
Too many package managers, and some packages are only found in specific package systems.
Processing.js
Pros:
Built-in animation library.
Faster than Java applets.
Less platform-restricted than Flash, not a dying language like Flash.
Not flash.
Multiplatform: Runs in a browser.
Cons:
Runs in a browser.
Slow.
Not well documented.
Perl
Pros:
Quick to code.
Excellent POSIX support.
Multiplatform. Mac, Windows, Linux. Comes with Mac and any Linux.
CPAN package manager, with very many libraries.
Many books and tutorials.
Ubiquitous.
Cons:
Inconsistent syntax. Example: lists that contain lists.
Objects have to be “blessed”.
Syntax so cryptic, there are yearly obfuscated code competitions.
Though ubiquitous, not well-supported in industry due to obfuscation.
Hard to debug due to obfuscation and shallow error traces.
Scheme
Pros:
Smaller, more consistent standard library than Common Lisp.
Functional.
Major implementations (Racket, Chicken Scheme, MIT Scheme) are multiplatform (Mac, Windows, Linux) and have good package managers.
Rack has many tutorials.
Chicken Scheme has super easy stand-alone executable creation.
SRFIs are implementation-independent libraries full of useful functions.
Cons:
Books tend to be too technical.
“Racket” changes its name on a whim. Also known as MrEd, DrScheme, MzScheme, and PLT Scheme.
Obscure.
Smalltalk
Pros:
Took OO ideas from Simula and ran with them.
Squeak and GNU Smalltalk are popular implementations.
Squeak has an excellent GUI interface for examining objects.
Everything’s an object, even booleans.
Cons:
Squeak only runs inside a VM. No command line.
Obscure.