Пол Грэм. Lisp: побеждая посредственность
Летом 1995 года мой друг Роберт Моррис и я основали компанию под названием Viaweb. Наш план заключался в разработке программного обеспечения, которое позволило бы пользователю создавать свой онлайновый магазин. Новизна этого софта на тот момент заключалась в том, что он работал на сервере, используя web-страницы как интерфейс.
У многих в то время была та же идея, но, насколько я знаю, Viaweb была первым web-приложением. Идея показалась нам настолько новой, что название для компании мы придумали так, чтобы оно отражало ее суть — Viaweb (“Через web“), подчеркивало, что программа работает в Сети, а не на локальном компьютере.
Это не только теоретический вопрос. Программное обеспечение — бизнес с жесткой конкуренцией, бизнес, склонный к естественным монополиям. Компания, в которой пишут софт быстрее и лучше, при прочих равных условиях вытеснит конкурентов.
Когда вы основываете компанию, то особенно остро ощущаете это. Либо вы разбогатеете, либо не получите ничего. Если в вашем начинании вы поставите не на ту технологию, ваши конкуренты не оставят от вас и мокрого места.
Мы с Робертом оба хорошо знали Lisp, и у нас не было причин не доверять своим инстинктам и не воспользоваться им. Мы знали, что все остальные пишут на C или Perl.
Другая особенность нашего софта заключалась в том, что он был написан на языке программирования Lisp.
Viaweb вначале состоял из двух частей: редактора, написанного на Lisp’е, который использовался для построения сайтов, и системы обработки заказов, написанной на C. Большую часть первой версии составлял Lisp, так как система обработки заказов была маленькая. Позже мы добавили еще два модуля, генератор изображений на C, и программу для администрирования, написанную большей частью на Perl’е.
Парадокс Блаба
Что же в Lisp’е такого прекрасного? Если он такой замечательный, почему его не используют все? Казалось бы, риторические вопросы, но на самом деле на них есть прямые ответы. Lisp настолько хорош не тем, что в нем есть некое волшебное качество, видимое только его приверженцам, а тем, что он — самый мощный язык программирования из существующих.
И причина того, что все вокруг пишут не на Lisp’е, заключается в том, что выбор языка программирования — вопрос не только технологии, но также и привычки, а ничто не меняется так медленно, как привычки. Конечно, оба эти тезиса требуют разъяснений.
Я начну с шокирующего утверждения: языки программирования отличаются друг от друга своей мощностью.
По крайней мере мало кто будет спорить, что высокоуровневые языки более мощные, чем машинный язык. Большинство программистов согласятся, что, как правило, программировать стоит не на машинном языке, а на каком-нибудь языке высокого уровня, переводя программу в машинный код с помощью компилятора. Сейчас эта идея получила даже аппаратное воплощение — с восьмидесятых годов команды процессоров разрабатываются скорее для компиляторов, чем для программистов.
Каждый знает, что писать всю программу вручную на машинном языке — ошибочно. Но гораздо реже понимают то, что существует и более общий принцип: при наличии выбора из нескольких языков ошибочно программировать на чем-то, кроме самого мощного, если на выбор не влияют другие причины.
Все языки одинаково мощные, если рассматривать их с точки зрения эквивалентности машине Тьюринга, но это не та мощь, которая важна программисту. (Никто ведь не хотел бы программировать машину Тьюринга). Мощь языка, в которой заинтересован программист, возможно, трудно определить формальными методами, однако одно из объяснений этого понятия заключается в свойствах, которые в менее мощном языке можно получить, только написав на нем интерпретатор для более мощного языка. Если в языке A есть оператор для удаления пробелов из строк, а в языке B его нет, это не делает A более мощным, чем B, так как в B можно написать процедуру, которая делала бы это.
Но, скажем, если язык A поддерживает рекурсию, а B — нет, это нечто, что нельзя исправить написанием библиотечных функций.
Есть много исключений из этого правила. Если вы пишете программу, которая должна тесно взаимодействовать с программой, написанной на определенном языке, возможно, окажется разумным писать новую программу на том же языке.
Статья:
April 2001, rev. April 2003 (This article is derived from a talk given at the 2001 Franz Developer Symposium.)