Другие дали отличные ответы, поэтому мне остается объяснить, что на самом деле означают «динамические» языки.
В контексте виртуальной машины это означает, что тип переменной неизвестен во время компиляции. В «статических» языках тип (или, по крайней мере, его родительский класс) известен во время компиляции, и многие оптимизации основаны на этих знаниях.
С другой стороны, в динамических языках вы можете знать, содержит ли переменная тип контейнера (например, массив) или скаляр (строка, число, ...), но у вас гораздо меньше информации о типе во время компиляции.
Другая характеристика заключается в том, что динамические языки обычно значительно упрощают преобразование типов, например, в perl и javascript, если вы используете строку в качестве числа, она автоматически преобразуется в число.
Parrot разработан для упрощения и ускорения таких операций, а также для оптимизации, не зная информации о типах во время компиляции.