Если вам интересны парадигмы, то в статье «Программирование парадигм для чайников: что должен знать каждый программист» охватывает их.
В функциональном программировании состояние неявно - программа выполняется путем вызова функций, которые вызывают другие функции. В императивном программировании и объектно-ориентированном программировании состояние является явным - вы изменяете значение переменной или поля объекта.
В каком-то смысле функциональные и императивные системы можно рассматривать как двойственные - в одном зафиксировано динамическое значение в другом.
Замыкания - которые захватывают некое явное, изменяемое состояние в объекте, который может быть вызван как функция - находятся где-то посередине, не являясь ни чисто функциональным программированием, но не совсем полноценными объектами; они больше похожи на анонимные объекты, чем на функции.
«Динамические языки» - это расплывчатый термин, обычно означающий одно из следующего:
Динамически типизированные языки - языки, которые задерживают определение типа во время выполнения, но набор типов фиксирован. Примерами являются Smalltalk, Lisps, текущие реализации Fortress. Некоторые языки со статической типизацией также допускают некоторые динамические проверки типов - Java, C #, C ++ и Ada. (это был неудачный динамический тип, приведенный от float к int в Ada, который разбил Ariane 5)
Языки с динамическими типами - языки, на которых новые типы могут создаваться во время выполнения. Самым популярным является JavaScript. Поскольку для определения типов необходимо запустить программу, для них сложно создать интегрированные среды разработки с автозаполнением с учетом типов.
Языки, которые динамически компилируются - языки, на которых новые скрипты могут быть скомпилированы во время выполнения. Это верно для bash, JSP, PHP и ASP в масштабе страницы и верно для более тонкого масштаба для lisps и JavaScript, которые поддерживают функцию 'eval', которая компилирует и запускает выражение.
Функциональные языки, которые строго типизированы, часто выполняют большое количество выводов типа, поэтому в их программах обычно менее явная типизация, чем в плохо реализованных языках статической типизации. Это может ввести в заблуждение людей, которые видели только отсутствие явной типизации в языках с динамической типизацией, верить, что вывод типа совпадает с динамической типизацией.