Christopher Diggins posts an interesting question in his blog on Artima related to the different programming paradigms that have become a popular discussion point over the last couple of years, especially with the increasing popularity of scripting/dynamic languages, regarding the relative merits and disadvantages of static verses dynamic languages.
A static language is one that has static compile-time type checking, whereas a dynamic language is one that that has runtime checking and variables do not have to have fixed types (ie they can change type at runtime).
Diggins proposes that this argument between static or dynamic, or even functional verses imperative programming approaches (functional languages promote programming via the use of mathematical evaluations, and imperative programming is focused on the evaluation of sequential commands) is almost redundant, since no one single approach is usually sufficient to solve a complex problem. The problem though is that languages such as Perl that offer ‘more than one way to do it’ become so difficult to master and use well, that they actually become used less as a general purpose language.
The other problem I believe is that to offer a truely general purpose language you will lose the ability to solve certain types of problems well due to the fact that you will have to make compromises to be general purpose.
This articles poses some interesting questions worth thinking about. I believe at the core though, you have to realize that you should always pick the tool that is most suited for the job at hand (within the constraints of the current problem: budget, time, resources etc) – sometimes this may be a collection of different tools that together allow you to solve the problem. Looking for one solution that will fix all problems is not guaranteed (in my opinion) to be the best solution.