Nicely written up but superficial analysis and trite conclusions. It would be nice if someone took this comparative analysis of programming languages a little more seriously and go beyond the tiresome "should a semicolon be a separator or a terminator" or the naive imperative-functional distinctions.<p>Take for example ML (prototypical high-level functional) vs C (prototypical low-level imperative). What makes them essentially different? In ML you have the common imperative features (assignment, references) and in C you can write functions including higher-order (via pointers). The answer you are looking for is "memory management", automatic in ML versus manual in C. Everything comes out of this distinction, down to the fact that in C you don't have lambdas and currying (because no garbage collection means no closures).<p>What makes ML and Algol 60 different? Both have a strikingly similar set of primitives, imperative and functional. The difference is call-by-value in ML vs. call-by-name in Algol 60, which leads to global effects in ML vs. local effects in Algol 60.<p>What makes Lisp different from Scheme, the misunderstanding of alpha conversion in Lisp versus its correct implementation in Scheme.<p>And so on. It would be fun if someone who actually know programming languages beyond the naive and the trivial took time to write a proper potted history and/or comparative analysis.