[Moscow.pm] Why Perl?

Alexander Lourier aml на rulezz.ru
Ср Фев 3 12:53:05 PST 2010


On Wednesday 03 February 2010 18:35:33 Dmitry Arsentiev wrote:

> >> Питон проще, порог вхождения как минимум вдвое ниже,
> >> для экспериментов идеален.
> >
> > Было бы здорово услышать аргументацию. Не флейма ради, а чтобы
> > понимать и упоминать.
>
> Спросил у коллеги, который пробовал сам выучить Пёрл,
> а потом стал программировать на Питоне.
>
> Во-первых, отступы. Не так страшны. как их малюют.

+1. Одна строчка настроек для vim позволяет ставить их автоматически и стирать одним нажатием на backspace. А то, что даже в чужом коде визуально 
видно, какой оператор к блоку какой вложенности относится - это вообще супер.

> В-пятых. Ссылки, разыменование ссылок.
> Я спросил у коллеги, он сказал, что такого разнообразия игр со сслыками,
> как в перле, в питоне нету.
> Т.е. всякие \() , \&funcfoo, %{ $refhash } и т.д. - нету их.

Точнее, всё это есть, но доступно через функции с длинными названиями. Быстро, как в перле создать копию хеша, имея ссылку на него, дописать туда пару 
ключей, не получается - это превращается в колбасу из трех функций из стандартной библиотеки вместо { %$orig_hash, key1 => 1, key2 => 1 }, Код не 
получается писать так же быстро, как на Перле. Кстати, в литературе отмечают, что питонячий синтаксис специально задумывался для быстрой разработки. 
Убрать лишние скобки, лишние символы, лишние ключевые слова для объявления переменных и т.д. Это все помогает, но без перловых всяких \() не 
получается такого удобства.

> Правда, в питоне нету автовивификации, насколько я знаю..
> И это единственный крупный минус питона перед перлом в моих глазах.

Справедливости ради, это часто бывает и причиной ошибок. Ошибся в названии поля вместо $self->{field}->[$i] написал $self->{fieid}->[$i] - и 
разбирайся потом, откуда баг растет. Ни одного ворнинга при этом.

> В-шестых. Объекты перла слизаны с объектов питона.
> Поэтому здесь питон не хуже перла.

Уу, они совсем разные. Совсем. В перле объекты мне нравятся в сто раз больше. У меня довольно специфичная задача - онлайн-игрушка. Запускаются 
толстенные демоны, которые хранят в себе игровое состояние, и управляются событиями от игроков. В код постоянно вносятся изменения - от мелких фиксов 
до крупных нововведений.

И сложность в том, что нужно, не прерывая работу сервера, не останавливая процесс, на лету перезагружать код. В перле благословение объекта - это 
просто присвоение строчки с названием класса. А в питоне каждый класс - это сам по себе объект, и экземпляры этого класса знают то, что они 
принадлежат к этому классу, храня в себе ссылку на объект класса, а не просто строчку с его названием.

При перезагрузке файла с исходником программы перл замещает все функции в пакете на новые скомпилированные, и при вызове методов старых объектов будут 
вызываться уже новые функции. А в питоне создается новый объект класса, в него компилируется новый код. А старые объекты как ссылались на старый 
объект класса, так и продолжают ссылаться. И не пересоздав объект, изменить его класс невозможно. Это порождает необходимость использования костылей 
для перезагрузки питонячьих классов - вручную смотреть таблицы методов, переписывать их из нового объекта класса в старый и т.д.

> В-седьмых, сопровождать чужой код на питоне
> проще, чем сопровождать чужой код на перле.
> Последнее иногда просто невозможно.
> Т.е. уход крутого разработчика означает сперва "обожествление",
> а потом и омертвение  оставленного разработчиком кода.

100%. Я нуб в питоне, но легко читаю его библиотечный код, чтобы разобраться в особенностях работы. В перле это намного сложнее - подменяются функции, 
переопределяются всякие autoload'ы - пока разберешься в особенностях реализации, уже забудешь, как это все вместе работать должно.

PS. Вот за что я люблю moscow.pm - все-таки классная тут аудитория собралась. Можно спокойно без флейма обсуждать оффтопиковые технологии.  Видно, что 
пишут люди, для которых язык программирования - не религия, а инструмент для решения задач.


Подробная информация о списке рассылки Moscow-pm