Десятое правило Гринспена

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

Десятое правило Гринспена (англ. Greenspun's Tenth Rule) — афоризм из области программирования, гласящий:[1][2]

Любая достаточно сложная программа на Си или Фортране содержит заново написанную, неспецифицированную, глючную и медленную реализацию половины языка Common Lisp.

Происхождение[править | править код]

Правило было сформулировано примерно в 1993 году Филипом Гринспеном[англ.]. Хотя оно известно как «десятое», предшествующих ему правил не существует. Название сам Гринспен объяснял так:[3]

Просто я пытался дать правилу запоминающееся название.

Значение[править | править код]

Смысл правила в том, что программисты, ограниченные низкоуровневыми языками вроде Си, преодолевают ограничения языка путём введения в текст программ аналогов свойств, присущих более выразительным языкам вроде Лиспа.

Уточнение Морриса[править | править код]

Впоследствии хакер Роберт Моррис уточнил:[4]

…в том числе и сам Common Lisp.

Уточнение может рассматриваться в качестве комментария к сложности создания эффективной реализации языка Common Lisp или просто как шутливое описание работы функции eval[англ.] в Лиспе.

Дополнение о Прологе[править | править код]

Любая достаточно сложная программа на Лиспе наверняка содержит медленную реализацию половины языка Пролог.

Эта формулировка[5] отражает тот факт, что программы на Прологе содержат островки в стиле Лиспа, а программы на Лиспе — островки в стиле Пролога.

Дополнение об Эрланге[править | править код]

С распространением распределённого программирования и популяризацией идей, реализованных в языке Erlang, Роберт Вирдинг предложил такой вариант:[6]

Любая достаточно сложная распределённая программа содержит заново написанную, неспецифицированную, глючную и медленную реализацию половины языка Erlang.

Эту поправку также называют следствием Армстронга.

Обобщение[править | править код]

Правило часто варьируется путём замены слов «Common Lisp» на любимый функциональный язык говорящего (например, Scheme или Haskell). Можно обобщить, что:

Любая достаточно сложная платформа содержит заново написанную, неспецифицированную, глючную и медленную реализацию половины функционального языка.

Примечания[править | править код]