Kevin Kelleher suggested an interesting way to compare programming languages: to describe each in terms of the problem it fixes. The surprising thing is how many, and how well, languages can be described this way.
Algol: Assembly language is too low-level.
Pascal: Algol doesn’t have enough data types.
Modula: Pascal is too wimpy for systems programming.
Simula: Algol isn’t good enough at simulations.
Smalltalk: Not everything in Simula is an object.
Fortran: Assembly language is too low-level.
Cobol: Fortran is scary.
PL/1: Fortran doesn’t have enough data types.
Ada: Every existing language is missing something.
Basic: Fortran is scary.
APL: Fortran isn’t good enough at manipulating arrays.
J: APL requires its own character set.
C: Assemby language is too low-level.
C++: C is too low-level.
Java: C++ is a kludge. And Microsoft is going to crush us.
C#: Java is controlled by Sun.
Lisp: Turing Machines are an awkward way to describe computation.
Scheme: MacLisp is a kludge.
T: Scheme has no libraries.
Common Lisp: There are too many dialects of Lisp.
Dylan: Scheme has no libraries, and Lisp syntax is scary.
Perl: Shell scripts/awk/sed are not enough like programming languages.
Python: Perl is a kludge.
Ruby: Perl is a kludge, and Lisp syntax is scary.
Prolog: Programming is not enough like logic.