In computer science, dynamic programming language is a kind of programming language in which computer programs change their structure as they run: new functions may be introduced, functions may vanish, new classes of objects may be created, new modules may appear. The details differ between languages, but in general, it is extremely difficult to compile a dynamic language down to a binary, and it is extremely difficult, perhaps impossible, to enforce design contract on a dynamic language. The code would have to understand itself in order to be able to decide whether or not a class that doesn't exist yet will meet meet the requirements of an abstract class of which it purports to belong. For methods to come and go from existence, a virtual machine is handling then run-time lookup of methods, the binary code is heavily self-modifying, or some sort of method dispatch logic is invoked.

Smalltalk, Scheme, Lisp, Dylan, Python, Perl and many other languages fit this category. C, C++, Java, and FORTRAN do not, as languages, though it is always possible to build layers on top of a language.

The article is originally from Perl Design Patterns Book