Although dynamically typed (so-called "scripting languages") such as Python and PHP have been gaining popularity in recent years, statically typed languages which fail on type errors at compile-time as opposed to run-time (e.g. OCaml) are often overlooked. Static typing prevents a number of stupid errors from happening at some random point in a program's execution, but forces the programmer to go through greater effort to actually design the program. I stumbled across the excellent Lambda the Ultimate programming languages weblog which has two great, largely flame-free discussions about the relative merits of both approaches. Check out the threads here and here.