From Novosibirsk, Russia? Our tiny company is looking for current or future rock-star developers.

October 09, 2006

PHP5 vs. Python/Ruby

Встретил человека, которого удовлетворяет PHP5. Мне кажется, ему легко живется в этом мире.

Языки с динамической vs. со статической типизацией — это, безусловно, предмет длительного спора. У каждого из них есть свои положительные и отрицательные стороны.

Статическая типизация даёт программисту больше уверенности в коде (иногда ложной).

Динамические языки, во-первых, позволяют выражать мысли естественно (окружающий мир тоже живет по принципам duck typing, а не строгой типизации), во-вторых, уникальной сильной стороной динамических языков является метапрограммирование.

Если вы никогда не занимались метапрограммированием, то для вас вопрос выбора языка сводится только к наличию типов у переменных, то есть фактически к ничему. (Ну, о'кей, к выбору формы выражения мыслей.) Если вы пробовали метапрограммирование на C++ (единственном поддерживающем его статически типизованном языке), то уже поняли, насколько это сложно и непригодно для повседневной деятельности.

Главное преимущество языков с динамической типизацией — применение метапрограммирования и функций высших порядков как основного способа программирования. Динамическая типизация просто делает это возможным.

Что же мы видим в PHP5? Метапрограммирование отсутствует напрочь. Авторы очень старались сделать всё, как у нормальных людей, но так и не поняли самого главного. Более того, они пытаются сделать язык похожим на Java, но только без строгой типизации (что суммирует недостатки обоих подходов в одном языке).

Лично я предпочитаю Ruby, потому что в нем красивее выглядит и метапрограммирование, и применение higher-order functions (благодаря SmallTalk'овским корням). Впрочем, это уже дело вкуса. Пусть метапрограммирование в Питоне выглядит более странно, но оно не менее мощное.

P.S. Помнится, раньше были споры про строгую типизацию, а не про статическую. А вот сегодня я, не морщась, употребляю эти термины почти как синонимы. Десять лет назад меня бы за такое линчевали.

P.P.S. Да, забыл, но впрочем это естественно, зачем говорить о том, чего нет. Функции высших порядков в PHP тоже имеют рудиментарный вид (ну то есть отсутствуют).

7 comments:

max.lapshin said...

Дискуссия на тему динамические vs. статические языки — это не про PHP. Скажем, C — достаточно последовательный язык и логичный. С++ уродлив, но последователен, особенно когда понимаешь, что именно двигало его авторами. Правда, довело не туда.
Ruby достаточно последователен и логичен (чего не скажешь о Питоне, который сейчас встал на путь «как угодно, лишь бы не как в Руби» и судорожно нагоняет функциональность новым синтаксисом).

PHP вообще повис в воздухе. Type hinting — просто смешно. Они _никогда_ не сделают его хорошим, потому что интерпретатор никогда не сможет отличить число от строки. Т.е. придумывается type hinting (теми ограниченными людьми, которые про смоллток не слышали), но из-за родовых травм PHP, его никогда не ввести.

Unknown said...

Вот не надо про C++. :) Я бы про него сказал наоборот, что он не уродлив, но и не последователен. («Design and evolution» Страуструпа я читал.) Но в любом случае я согласен, что C куда более красив.

Забавно, что по отзывам среди разработчиков PHP умные люди есть, но на выходе получается неизменно поражающий своим качеством результат. :)

Что касается Питона, не все так однозначно. Они просто развивают метапрограммирование в питоновом смысле. Вот если посмотреть на Django, то да, они мечтают сделать не как в Rails. Им осталось только подкасты на винде начать записывать. Другой вопрос, что до SmallTalk'а по метапрограммированию Питону всё ещё далеко, и если он когда-то до него дойдёт, то превратится в Ruby.

P.S. Type hinting: а вы видели Objective-C? Apple активно продвигает как раз такую смесь динамической и статической типизации. Тенденция, однако, если задуматься, что Objective-C = C + SmallTalk.

max.lapshin said...

type hinging в Objective C гораздо последовательнее, хотя бы из-за отсутствия автоматической конвертации строк в числа.

Objective C - действительно С + SmallTalk. К сожалению, я с ним особенно не сталкивался, так - тестовые примеры писал.

Что касается питона, я говорю про изменения в 2.5 Увеличение количества языковых и синтаксических сущностей там, где это совершенно не нужно.

Насчет С++-а мои претензии относятся прежде всего к шаблонам. Хотели как лучше, получилось так, что волосы дыбом встают. Ну страшно все таки, страшно.

Unknown said...

Согласен, PHP — это удовольствие для искушенных. Но самая идея type hinting интересна (хотя я бы особо пользоваться не стал — честно говоря, при активном использовании динамических языков ошибок с типами почти не делаешь).

В Питоне появляется функциональный аналог блоков Ruby. Это положительно! Другой вопрос, что блоки Ruby куда стройнее и красивее навороченных генераторов и нового оборота with.

Вообще, Питон имеет куда больше туманных мест, чем Ruby. Помню, когда-то я вникал в отличия old-style classes от new-style classes.

Но, с другой стороны, можно то же самое сказать и про Ruby. На мой взгляд, синтаксиса SmallTalk вполне достаточно для построения прилично выглядящих DSL. Все навороты Ruby — это именно навороты. И в Ruby тоже есть тёмные места, например, те же continuations и отличия proc от lambda. И от некоторых запланированных в Ruby 2 изменений волосы тоже встают дыбом (прям как от конструкции x if y else z).

Интересно, что даже SmallTalk при всей простоте синтаксиса имел тёмные места (например, слоты). Но те тёмные места были вполне техническими и необходимыми.

Опять же, есть в Ruby действительно удобные синтаксические навороты (вроде всяких звёздочек при вызове функций) по сравнению со SmallTalk. Да и перловский стиль иногда приятен.

Но самое интересное то, что Python неуклонимо склоняется к DSL. Это показатель и небольшая победа Ruby.

Unknown said...

P.S. Про C++. Есть такая вещь — очарование сложностью. Программируя на ассемблере сложную Windows-программу, можно чувствовать себя гуру, хотя на самом деле ты идиот. Но есть технологии, где иначе нельзя. Иногда даже идиотизм неизбежен.

Возьмём TeX. Я даю ему приз esoteric language of the decade. И между тем, лучшей издательской системы еще не придумали. Лучшую систему хотел написать я (наборный движок TeX, но кардинально другой входной интерфейс), если бы нашел научного руководителя. А так миру придется довольствоваться олимпиадной тестирующей. (Впрочем, её примут с большей радостью. Этих извращенцев TeX удовлетворяет.)

Страуструп не думал, что шаблоны дадут жизнь метапрограммированию на C++. Метапрограммирование делает из него совсем другой язык, но, увы, оказывается чересчур сложным самостоятельным compile-time языком. Зато можно чувствовать себя гуру. И не так давно это было необходимо, как в ситуации с TeX.

Альтернатива шаблонам C++ — шаблоны той же Ada. Метапрограммированием там не пахнет, зато контейнеры писать удобно. Но многословно. Но удобно. (С другой стороны, лишь в Ada 95 были разрешены последние хитрые моменты в синтаксисе шаблонов, позволяющие проверять их семантику во время определения. Что доказывает сложность проблемы.) Однако Страуструп знал про шаблоны Ada, когда проектировал свои. В качестве одного из показателей он приводит то, что при переписывании Booch Components (это очень большая и серьёзная библиотека контейнеров) с Ada на C++ количество строк сократилось в десять раз (с сотен тысяч до десятков тысяч).

Я не склонен ругать C++, потому что он развивался ровно так, как должен был и как мог. На разных этапах язык учитывал технические ограничения (использование системного компоновщика, например). Язык безусловно выиграл от шаблонов. Просто его нужно вовремя списывать, когда hardware созрело для Java и скриптовых языков.

max.lapshin said...

Ну насчет лучшести теха — тут ты не совсем прав, но в целом я тебя понял и согласен.
А насчет того, что процессоры доросли, есть одно большое но. До сих пор есть задачи, которые решаются только на С++. Например, невозможно написать десктопное приложение на яве. Ну нельзя и все тут. Работает, как черепаха.

Unknown said...

Безусловно, есть задачи, которые решаются только на C или C++ (например, сжатие видео какое-нибудь). Но десктопное приложение — это извините меня. Многие удобные приложения, которые я видел, были написаны на Java. (Как раз исключений мало. Например, OpenOffice и приложения Adobe.)

Заявление о том, что Java может быть медленная для десктоп-приложений, совершенно не соответствует истине. Если, конечно, у пользователя не развалюха трехлетней давности.

Более того, с выходом Vista C++ как язык для новых приложений умрёт окончательно, ибо там будет .NET.