Десятое правило Гринспена (:yvxmky hjgfnlk Ijnuvhyug)
Десятое правило Гринспена (англ. 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 (англ.)