Десятое правило Гринспена
Десятое правило Гринспена (англ. Greenspun's Tenth Rule) — афоризм из области программирования, гласящий:[1][2]
Любая достаточно сложная программа на Си или Фортране содержит заново написанную, неспецифицированную, глючную и медленную реализацию половины языка Common Lisp.
Оригинальный текст (англ.)Any sufficiently complicated C or Fortran program contains an ad hoc, informally-specified, bug-ridden, slow implementation of half of Common Lisp.
Происхождение
Правило было сформулировано примерно в 1993 году Филипом Гринспеном[англ.]. Хотя оно известно как «десятое», предшествующих ему правил не существует. Название сам Гринспен объяснял так:[3]
Просто я пытался дать правилу запоминающееся название.
Оригинальный текст (англ.)I was just trying to give the rule a memorable name.
Значение
Смысл правила в том, что программисты, ограниченные низкоуровневыми языками вроде Си, преодолевают ограничения языка путём введения в текст программ аналогов свойств, присущих более выразительным языкам вроде Лиспа.
Уточнение Морриса
Впоследствии хакер Роберт Моррис уточнил:[4]
…в том числе и сам Common Lisp.
Оригинальный текст (англ.)…including Common Lisp.
Уточнение может рассматриваться в качестве комментария к сложности создания эффективной реализации языка Common Lisp или просто как шутливое описание работы функции eval[англ.] в Лиспе.
Дополнение о Прологе
Любая достаточно сложная программа на Лиспе наверняка содержит медленную реализацию половины языка Пролог.
Оригинальный текст (англ.)Any sufficiently complicated LISP program is going to contain a slow implementation of half of Prolog.
Эта формулировка[5] отражает тот факт, что программы на Прологе содержат островки в стиле Лиспа, а программы на Лиспе — островки в стиле Пролога.
Дополнение об Эрланге
С распространением распределённого программирования и популяризацией идей, реализованных в языке Erlang, Роберт Вирдинг предложил такой вариант:[6]
Любая достаточно сложная распределённая программа содержит заново написанную, неспецифицированную, глючную и медленную реализацию половины языка Erlang.
Оригинальный текст (англ.)Any sufficiently complicated concurrent program in another language contains an ad hoc informally-specified bug-ridden slow implementation of half of Erlang.
Эту поправку также называют следствием Армстронга.
Обобщение
Правило часто варьируется путём замены слов «Common Lisp» на любимый функциональный язык говорящего (например, Scheme или Haskell). Можно обобщить, что:
Любая достаточно сложная платформа содержит заново написанную, неспецифицированную, глючную и медленную реализацию половины функционального языка.
Оригинальный текст (англ.)Any sufficiently complicated platform contains an ad hoc, informally-specified, bug-ridden, slow implementation of half of a functional programming language.
Примечания
- ↑ Revenge of the Nerds Архивная копия от 7 июня 2019 на Wayback Machine, by Paul Graham. (англ.)
- ↑ Philip Greenspun’s Research Архивная копия от 24 января 2009 на Wayback Machine (англ.)
- ↑ 10th rule of programming Архивная копия от 29 января 2008 на Wayback Machine (англ.)
- ↑ Paul Graham quotes Архивная копия от 12 августа 2005 на Wayback Machine (англ.)
- ↑ comp.lang.prolog: why not use LISP-imp of Prolog as opposed to Prolog itself? (англ.)
- ↑ [erlang-questions] Erlang concurrency Архивная копия от 25 июля 2008 на Wayback Machine (англ.)