Строгий язык программирования является языком программирования, который использует строгую парадигму программирования, что позволяет только строгие функции (функции, параметры должны быть оценены полностью, прежде чем они могут быть названы) должны быть определены пользователем. Нестрогий язык программирования позволяет пользователю определять нестрогие функции, и, следовательно, может позволить ленивым вычисления.
Почти все языки программирования общего пользования сегодня строги. Примеры включают C #, Java, Perl (все версии, то есть до версии 5 и версии 7; Raku, ранее известный как Perl 6, имеет ленивые списки), Python, Ruby, Common Lisp и ML. Примеры нестрогих языков - Haskell, Miranda и Clean. Языки, чьи обычные функции являются строгими, но которые предоставляют макросистему для создания нестрогих функций, включают Julia и Scheme. Ленивые списки также могут быть созданы на C и C ++.
В большинстве нестрогих языков нестрогость распространяется на конструкторы данных. Это позволяет манипулировать концептуально бесконечными структурами данных (такими как список всех простых чисел ) так же, как и обычными конечными структурами данных. Он также позволяет использовать очень большие, но конечные структуры данных, такие как полное дерево игры в шахматы.
У нестрогости есть несколько недостатков, которые препятствуют широкому распространению:
Строгие языки программирования часто связаны с нетерпеливым вычислением, а нестрогие языки - с ленивым вычислением, но в каждом случае возможны другие стратегии оценки. Термины «энергичный язык программирования» и «ленивый язык программирования» часто используются как синонимы для «строгого языка программирования» и «нестрогого языка программирования» соответственно.
Во многих строгих языках некоторые преимущества нестрогих функций могут быть получены за счет использования макросов или переходов.