Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Религиозные войны > Perl vs Python


Автор: Logo 10.5.2010, 17:47
Почему до сих пор нет этой темы? smile Начнем.
Языки очень разные по дизайну, но пересекающиеся по областям применения.

Я перлист, питон представляю только в общих чертах, поэтому опишу преимущества и недостатки с точки зрения перловика.
  • Обработка текста. Тут Perl однозначно лидер. Механизм регэкспов самый мощный, и встроенный на уровне синтаксиса.
  • ООП. Тут Perl сливает. Встроенная возможности ООП слишком низкоуровневая,  и многое нужно прописывать вручную. На практике приходится использовать дополнительные модули, которые делают это за вас, но тут тоже не все гладко, достаточно удобного модуля я не нашел (хотя может быть плохо искал).
    Есть здесь небольшое преимущество, что есть выбор модели ООП, к примеру есть модуль реализующий прототип-ориентированное ООП Class::Prototyped, но оно никак не перевешивает всех недостатков.
    В Python поддержка ООП наитивная
    Кроме того т.к. помимо скаляра в Perl есть еще структуры данных типа массив и хеш, а объект хранится в скаляре, нельзя расширить хеш или массив методами. Есть выход использовать объект как ссылку на массив вместо массива, либо использовать tie и вызывать методы через tied(@arr)->some(), но это не удобно.
  • Параметры функций. Еще один серьезный недостаток Perl. Встроенной проверки параметров нет. В функцию передается массив параметров, валидация параметров, если она нужна, лежит на программисте. Есть, конечно, довольно не плохие модули на CPAN, но они меня тоже не устраивают, подумываю написать свой.
  • Большой плюс Perl в встроенном формате встраиваемой документации POD. В комплекте идет утилита для просмотра документации, и все модули на CPAN имеют документацию в этом формате, в общем документирование скриптов - одно удовольствие. Конструкция документирования POD вроде даже перекочевала в Ruby.
  • Управление компиляцией. Тоже уникальная в своем роде вещь Perl.
  • Синтаксис. Здесь плюс-минус. У Perl гибкий синтаксис и всевозможные средства сокращения. Это плюс, если работаешь один или хорошей команде, но если идти работать на "умение разбираться в чужом коде (с)" это минус. У меня правда есть несколько претензий синтаксису Perl, но они не критичные.
    С другой стороны, поддерживать Python код мне не приходилось, поэтому не могу сказать, насколько эффективно ограничения способствуют улучшению плохого кода.

З.Ы. Сейчас мой выбор, хоть и не с легким сердцем - Perl.    

Автор: k0rvin 10.5.2010, 19:08
Цитата(Logo @ 10.5.2010,  17:47)

  • Управление компиляцией. Тоже уникальная в своем роде вещь Perl.

что это?

Автор: gcc 10.5.2010, 19:38
это наверное eval http://perldoc.perl.org/functions/eval.html  (можно еще кусок кода вставить )
вот пример (если тут речь про это) http://forum.vingrad.ru/forum/topic-290936.html

Автор: qweqwe 10.5.2010, 19:50
мне оба языка не нравятся, python меньше не нравится

Автор: Logo 10.5.2010, 21:19
Цитата(k0rvin @ 10.5.2010,  19:08)
Цитата(Logo @ 10.5.2010,  17:47)


  • Управление компиляцией. Тоже уникальная в своем роде вещь Perl.


что это?

кемелбук, глава 18.
В кратце, в процессе работы программы, то компилятор в байт-код вызывает интерпретатор байт-кода, то наоборот, интерпретатор вызывает компилятор. 
Интерпретатор вызывает компилятор при eval.
Компилятор же вызывает интерпретатор с помощью специальных блоков BEGIN {} или загрузки модуля use Module(... params ...), или no Module(... params ...) (редко используется). Когда компилятор доходит до use, он прерывает компиляцию остальной программы, загружает, компилирует, и исполняет модуль (если это первое использование модуля),  вызывает функцию import модуля с параметрами. Лишь после того, как use, BEGIN, или no отработают, компилятор продолжит компиляцию программы.
Алсо, есть магический хеш, привязанные к лексической области видимости блоков, он позволяет создавать директивы с лексической областью видимости. В него могут писать use, BEGIN, или no, и значения его видны в лексической области видимости блока.
Алсо, разные дополнительные приблуды, вроде перехвата компиляции ключегого слова, или перехвата конца компиляции лексического блока.

Автор: Фантом 10.5.2010, 21:49
Самая известная (и, на мой взгляд, точная) характеристика Perl - это язык, программу на котором через месяц после написания не сможет понять даже тот человек, который ее писал.

С дпугой стороны, пресловутые табуляторы Python - это тоже ужас.

Так что из всех языков этой ниши, на мой взгляд, лучший - Lua.


Автор: k0rvin 10.5.2010, 22:45
Цитата(Logo @ 10.5.2010,  21:19)
Цитата(k0rvin @ 10.5.2010,  19:08)
Цитата(Logo @ 10.5.2010,  17:47)



  • Управление компиляцией. Тоже уникальная в своем роде вещь Perl.



что это?

кемелбук, глава 18.
В кратце, в процессе работы программы, то компилятор в байт-код вызывает интерпретатор байт-кода, то наоборот, интерпретатор вызывает компилятор. 
Интерпретатор вызывает компилятор при eval.
Компилятор же вызывает интерпретатор с помощью специальных блоков BEGIN {} или загрузки модуля use Module(... params ...), или no Module(... params ...) (редко используется). Когда компилятор доходит до use, он прерывает компиляцию остальной программы, загружает, компилирует, и исполняет модуль (если это первое использование модуля),  вызывает функцию import модуля с параметрами. Лишь после того, как use, BEGIN, или no отработают, компилятор продолжит компиляцию программы.
Алсо, есть магический хеш, привязанные к лексической области видимости блоков, он позволяет создавать директивы с лексической областью видимости. В него могут писать use, BEGIN, или no, и значения его видны в лексической области видимости блока.
Алсо, разные дополнительные приблуды, вроде перехвата компиляции ключегого слова, или перехвата конца компиляции лексического блока.

как всё сложно... то ли дело CL:

Код

(eval 'expression)
(compile 'function-or-macro)

Автор: Logo 10.5.2010, 22:48
Цитата

Самая известная (и, на мой взгляд, точная) характеристика Perl - это язык, программу на котором через месяц после написания не сможет понять даже тот человек, который ее писал.


Это шутка smile 
Ни что не мешает написать понятную программу. С другой стороны, если тебе надо написать такой код, чтобы через месяц после его написания самому не понять, в Perl тоже ничего не будет мешать. В отличии от Python.

Автор: qweqwe 10.5.2010, 22:52
Цитата(Фантом @  10.5.2010,  21:49 Найти цитируемый пост)
С дпугой стороны, пресловутые табуляторы Python - это тоже ужас.

а что в этом плохого? это наоборот здорово, кстати табы никто не заставляет использовать, наоборот, там принято пользоваться пробелами

Автор: gcc 11.5.2010, 00:37
k0rvin, я что-то этого не видел раньше и гугл не говорит:

http://www.google.com.ua/search?hl=uk&q=python+%D0%BA%D0%BB%D0%B0%D1%81%D1%81+%D0%BD%D0%B0+%D1%8D%D1%82%D0%B0%D0%BF%D0%B5+%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F&aq=f&aqi=&aql=&oq=&gs_rfai=

http://www.google.com.ua/search?q=python+%D0%BD%D0%B0+%D1%8D%D1%82%D0%B0%D0%BF%D0%B5+%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+compile&hl=uk&start=10&sa=N

т.е. можно загрузить любые классы или пропустить те которые сейчас не нужны (не загружать их, чтобы они не занимали ресурсы) и выполниять их где угодно? т.е. загружать классы на этапе выполнения?


(хотя, говорят, в web это не очень часто нужно делать если работает в mod_* ...)

Автор: gcc 11.5.2010, 00:57
еще тема была тут http://forum.vingrad.ru/forum/topic-281755/unread-1/hl/freebsd/0.html
я бы на обоих программировал в принципе, если надо...
и еще есть: java, php, etc...

Автор: Фантом 11.5.2010, 09:34
Цитата(Logo @  10.5.2010,  22:48 Найти цитируемый пост)
Ни что не мешает написать понятную программу. С другой стороны, если тебе надо написать такой код, чтобы через месяц после его написания самому не понять, в Perl тоже ничего не будет мешать.

Как показывает опыт, если язык разрешает писать плохой код, то 99% написанного на нем кода будет плохим.  smile С Perl'ом примерно так и получается.

Цитата(qweqwe @  10.5.2010,  22:52 Найти цитируемый пост)
а что в этом плохого? это наоборот здорово, кстати табы никто не заставляет использовать, наоборот, там принято пользоваться пробелами 

Пробелы или табуляция - это уже мелочи, но сам по себе этот "двумерный синтаксис", на мой взгляд, крайне неудобен - слишком велика вероятность ошибки, которую трудно заметить.

Автор: A5uKa 11.5.2010, 10:59
http://www.staringispolite.com/likepython/

Автор: k0rvin 11.5.2010, 17:38
Цитата(gcc @ 11.5.2010,  00:37)
k0rvin, я что-то этого не видел раньше и гугл не говорит:

http://www.google.com.ua/search?hl=uk&q=python+%D0%BA%D0%BB%D0%B0%D1%81%D1%81+%D0%BD%D0%B0+%D1%8D%D1%82%D0%B0%D0%BF%D0%B5+%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F&aq=f&aqi=&aql=&oq=&gs_rfai=

http://www.google.com.ua/search?q=python+%D0%BD%D0%B0+%D1%8D%D1%82%D0%B0%D0%BF%D0%B5+%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+compile&hl=uk&start=10&sa=N

т.е. можно загрузить любые классы или пропустить те которые сейчас не нужны (не загружать их, чтобы они не занимали ресурсы) и выполниять их где угодно? т.е. загружать классы на этапе выполнения?


(хотя, говорят, в web это не очень часто нужно делать если работает в mod_* ...)

то было лирическое отступление, к питону никакого отношения не имеющее. впрочем как и к перлу =)

Автор: JackYF 11.5.2010, 17:54
Цитата(Фантом @  11.5.2010,  08:34 Найти цитируемый пост)
Как показывает опыт, если язык разрешает писать плохой код, то 99% написанного на нем кода будет плохим.

Любой язык позволяет писать нечитаемое и не работающее месиво.

Автор: djamshud 11.5.2010, 17:58
>Любой язык позволяет писать нечитаемое и не работающее месиво.

Ну как сказать... Перл в этом смысле все же даст фору многим.

http://www.linux.org.ru/forum/development/392747/page-1

Автор: Logo 11.5.2010, 22:05
Цитата

как всё сложно... то ли дело CL:


В принципе, ничего сложного. Это часть модульного механизма Perl, и используется повсеместно. 
Код

#Модуль - набор функций, и экспорт функций из модуля. По правилам стандартного модуля exporter
use MyModule qw(func1 func2 /^prefix_/ :set_of_functions !excluded_func); 


use bigrat; #использование объекта вместо простого скаляра.  

print 2 + 4.5,"\n";                   # BigFloat 6.5
print 1/3 + 1/4,"\n";                # produces 7/12

{
  no bigrat;
  print 1/3,"\n";                     # 0.33333...
}


Для пользователя и вовсе пожалуй достаточно знать, что use  это comple-time директива.


Цитата

Как показывает опыт, если язык разрешает писать плохой код, то 99% написанного на нем кода будет плохим.


Если специально писать, то будет smile. А вообще, при использовании гибкости синтаксиса по назначению, читаем код будет не хуже, а лучше более простой записи. И принцип явное лучше неявного хорош, но не универсален.







Автор: W4FhLF 12.5.2010, 04:30
Я никогда особо не писал на перле, но всё чаще пользуюсь питоном. Среди всех достоинств и синтаксического сахара, стоит отметить, что у питона гораздо шире спектр задач. Все популярные фреймфорки и библиотеки с которыми я работал имеют биндинги для питона. 

Хочешь гуй? Qt, GTK, Wx... 
Хочешь графику? Mathplotlib, OpenInventor, PyOpenGL... 
Работа с изображениями? PIL, OpenCV... 
Распознавание образов? pyFANN, pySVM... 
Параллельное программирование? mpi4py, pyCUDA (для GPU)...
Математика? NumPy, SciPy...

Кроме того python достаточно легко позволяет работать на уровне OS API. На нём легко можно писать системные утилиты. 

Автор: qweqwe 12.5.2010, 05:44
Цитата(W4FhLF @  12.5.2010,  04:30 Найти цитируемый пост)
На нём легко можно писать системные утилиты.

но лучше этого не делать xD

Автор: GoldFinch 12.5.2010, 08:17
я бы их скрестил.

Автор: A5uKa 12.5.2010, 08:30
Главное, что есть Iron Python и уже сделали для VS 2010 )

Автор: GoldFinch 12.5.2010, 08:44
A5uKa, вот когда IronPython3 сделают, тогда будет от него польза, правда небольшая

Автор: gcc 12.5.2010, 13:57
Цитата(W4FhLF @ 12.5.2010,  04:30)
Среди всех достоинств и синтаксического сахара, стоит отметить, что у питона гораздо шире спектр задач. 

это все есть давным давно, и на других языках ruby, java, etc... все или многое из перечисленного, скорее всего... smile

количество модулей на cpan  80 000 в 20 000 дистрибутивах, список авторов 8000
у perl на порядок больше готового для применения в различных задачах... 
(но это не значит что это все нельзя написать на python smile )

Добавлено @ 13:59
Цитата(A5uKa @ 12.5.2010,  08:30)
Главное, что есть Iron Python и уже сделали для VS 2010 )

я видел разрабатывался транслятор байткода .NET в представление байткода Parrot, и обратно и для использования библиотек из других языков и, в том числе и проприетарных. 

Автор: Logo 16.5.2010, 12:10
Цитата(W4FhLF @ 12.5.2010,  04:30)
Я никогда особо не писал на перле, но всё чаще пользуюсь питоном. Среди всех достоинств и синтаксического сахара, стоит отметить, что у питона гораздо шире спектр задач. Все популярные фреймфорки и библиотеки с которыми я работал имеют биндинги для питона. 

Хочешь гуй? Qt, GTK, Wx... 
Хочешь графику? Mathplotlib, OpenInventor, PyOpenGL... 
Работа с изображениями? PIL, OpenCV... 
Распознавание образов? pyFANN, pySVM... 
Параллельное программирование? mpi4py, pyCUDA (для GPU)...
Математика? NumPy, SciPy...

Кроме того python достаточно легко позволяет работать на уровне OS API. На нём легко можно писать системные утилиты.

Если заметь здесь "Python" на "Perl" почти ничего не изменится. + CPAN хороший репозиторий, а как в питоне, есть ли подобная вещь, мне не известно.



Цитата

я видел разрабатывался транслятор байткода .NET в представление байткода Parrot, и обратно и для использования библиотек из других языков и, в том числе и проприетарных. 

К Perl это имет отношение чуть меньше, чем никакого)

Автор: W4FhLF 17.5.2010, 08:23
Цитата(Logo @  16.5.2010,  12:10 Найти цитируемый пост)
Если заметь здесь "Python" на "Perl" почти ничего не изменится.


Тем не менее в задачах связанных с вычислениями и расчётами предпочтение отдают Python'y. 

Автор: GoldFinch 17.5.2010, 13:31
в питоне есть встроенная поддержка больших числел.
а в перле есть?

Автор: bems 18.5.2010, 03:08
А на перле еще кто-то пишет?

Автор: Shaggie 18.5.2010, 06:05
bems, ты не поверишь... но я могу это сказать про любой язык.

Автор: Logo 18.5.2010, 17:31
Цитата(bems @ 18.5.2010,  03:08)
А на перле еще кто-то пишет?

А на дельфях еще кто-то пишет (: ?

Автор: Logo 18.5.2010, 21:49
Цитата(GoldFinch @ 17.5.2010,  13:31)
в питоне есть встроенная поддержка больших числел.
а в перле есть?

Встроенной нету. Но, понятно, есть отдельные классы, они входят в стандартную поставку, и прагмы для перегрузки констант на создание объектов, выше как раз пример кода с use bigrat.

Автор: bems 18.5.2010, 22:00
Shaggie, конечно можешь. Свобода слова же. Ну я спросил просто, думал кто ответит
Logo, нет. Это как-то отвечает на мой вопрос?

Автор: Logo 18.5.2010, 22:32
Если это был не троллинг, то - программирует. С работой на perl проще. См. например http://hh.ru 46 вакансий perl, 23 python.


Автор: bems 18.5.2010, 22:34
Logo, а зачем, если есть РНР?

Автор: W4FhLF 19.5.2010, 11:40
bems, php де-факто для веб-разработки, однако сфера применения скриптовых языков какбэ немного шире. Там, где рулит питон php тихо отсасывает в сторонке. smile Про Perl ничего сказать не могу. 

Автор: bems 19.5.2010, 16:05
W4FhLF, дык я именно про перл на фоне рнр говорил, а не на фоне питона. Так что не в кассу

Автор: JackYF 20.5.2010, 15:44
Цитата(bems @  18.5.2010,  02:08 Найти цитируемый пост)
А на перле еще кто-то пишет? 

Да, я.

Автор: Logo 22.5.2010, 11:13
[
Цитата

Цитата(Logo @  16.5.2010,  12:10 Найти цитируемый пост)
Если заметь здесь "Python" на "Perl" почти ничего не изменится.


Тем не менее в задачах связанных с вычислениями и расчётами предпочтение отдают Python'y.


Возможно, но Perl тоже используется. У меня например стоит случайно поставленная программа из репозитория ubuntu, PerlPrimer, ДНК какие-то.

Как и Perl чаще используется для веб, хотя у Python тоже юзабелен.

То есть, как я и писал в первом посте, области применения сильно пересекаются. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)