Почему я выбрал Perl?

Автор статьи: Феликс Либерман
Сайт Автора: felix.da.ru
E-mail Автора: Нет
Дата публикации: 17.07.2005

Заранее извинюсь перед теми читателями, которые искали учебник или краткое руководство по Перлу. Здесь я не буду рассказывать о синтаксисе языка и не приведу пример программы, печатающей знаменитую фразу "Hello, world!". Предоставим это авторам издательства О'Райли и профессиональным technical writers. [1,2]

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

Итак, о чем собственно идет речь? Неужели в современной программистской среде нет лучшей альтернативы? (естественно, речь идет о программистах "широкого профиля" имеющих выбор в области языка программирования) Что дает мне Перл? В чем его недостатки?

Попробую ответить на все вопросы по порядку. Начнем с представления объекта обсуждения. Не вдаваясь в подробности сообщу, что язык этот относительно молодой, но черезвычайно мощный и интуитивно понятный для программирующего на любом языке. За короткое время Перл прочно обосновался в таких серьезных областях программистского ремесла как CGI, Unix scripting, Web-дизайн. Позвольте, спросит удивленный читатель, а как насчет всеми (не)любимой, но бесспорно самой массовой платформы - Windows? А так, - используется, но в основном в серверных приложениях (ну там NT, Win2K и прочая), хотя Перл безо всяких проблем работает и на стандартных редакциях "окошек". [3] Ну почему, спросит еще более удивленный читатель, программисты всего мира дружными рядами не ринулись строчить Win-приложения на этом языке? А причина до смешного проста: Перл - скриптовый (интерпретируемый) язык, что очень удобно в WWW, но совсем не удобно для стандартного пользователя "окошек", уровень способностей которого обычно колеблется между умением "поставить винды" и знанием "операционной системы эксель" ;-). В результате Перл-программа будет работать только на компьютере, где установлен интерпретатор Перла. Поэтому пользователи многочисленных клонов Юниксов охотно пользуются Перлом в своих ежедневных задачах - ведь им не надо напрягаться с установкой интерпретатора - он подобно Квик Бейсику (извиняюсь за сравнение) автоматически включается в дистрибутив системы. Да-да, я не оговорился, обыкновенные "пользователи" используют Перл - ведь он объединяет в себе синтаксис и фунциональность таких базовых команд Юникса как grep, sed, awk, tr, да и самого Юникс-шелла csh.

Тут программисты на Си/Си++ сразу скривятся - интерпретатор? Но ведь это дико неэффективно! Вынужден согласиться - да, не супер-эффективно, когда речь идет о Бейсике. Но Перл сочетает в себе преимущества компилируемых и интерпретируемых языков - программа переводится во внутренний код перед выполнением (как в Java) и в то же время остается возможность загрузки и выполнения фрагментов "на лету". Добавьте сюда поддержку объектов, возможность подключения подпрограмм написанных на других языках (си, ассемблер), наконец огромное количество прикладных библиотек (от доступа к базам данных и платформенно-независимой графики до работы с Web: разбор HTML, посылка/прием почты, загрузка/посылка по HTTP и FTP), плюс мощнейшие встроенные функции по обработке текста - вот вам вкратце весь Перл. [4,5]

К преимуществам Перла можно отнести и Си-подобный синтаксис (с множеством удобных расширений, хотя любители чистого Си/Си++ могут их не использовать). Несколько смущает "квикбейсиковый" способ объявления переменных (то есть - никакого!) и примерно такая же "явная" типизация объектов. Но при желании эта первая "фича" может быть выключена и тогда (ну совсем как в старом добром Си) каждая переменная должна быть описана явно. А явная типизация объектов вообще очень удобна (сравните стандарты на имена переменных, диктуемые Win-API: p - pointer, s - string, b - byte).

Чтобы проиллюстрировать простоту написания программ на Перле приведу пример из личного опыта: для собственных нужд (и из-за дремучести в области UNIX) мной был написан неплохой Download Manager (как позже выяснилось - со всеми функциями WGET). Написан быстро - по принципу "2 строки вокруг одной работавшей ранее". При этом ничем выдающимся в области программирования я не блистаю, а интернет и сетевые технологии для меня вообще "лес густой". И ведь работает "как часы", так как основную задачу - разбор HTML - на Перле можно решить в две-три строки.

Другой пример - за пару-тройку ночей сляпана довольно корявая (с художественной точки зрения) игрулька для ребенка. Игрулька (написанная на скриптовом! языке) содержит (тупейшую) анимацию, активные объекты, окошко настройки и прочая и прочая. Программа спокойно работает на любом (при наличии Tk не ниже 8.00) Юниксе и на любой Windows-системе (после компиляции в один большой экзешник). При этом (из-за моей серости в программировании) не потребовалось учить все эти дурацкие Win-API, классы окон и подобную философию). Кстати и программирование "специально для Юниксов" мне не знакомо - знай себе манипулируй абстрактными событиями и окошками. [6]

Добавлю, что любой эксперимент с графикой в Перле выглядит не сложнее программы "Hello, world!" - достаточно запустить поставляемую с перл-Tk программку ptksh и мы уже "в Хопре" со всеми функциями графики и даже "историей" команд. При этом можно спокойно переносить куски кода из понравившихся примеров без боязни что что-то "завалится" и придется перезагружаться так как программа "стрельнула" по системной памяти - ведь в Перле нет понятия "выход за границы массива" или "неверный указатель". Это свойство Перла делает его незаменимым с точки зрения простоты отладки - все скаляры, будь то данные, указатели или даже объекты классов всегда являются символьными строками, а баг в программе никогда не приводит к порче реальной памяти. В результате можно отлаживать и "доводить до ума" даже явно "нерабочие" куски.

Не стоит забывать и о таком "необычном" для российского пользователя факторе как легальная бесплатность Перла. Да-да, все вышеописанные чудеса можно безвозмездно (то есть даром) загрузить из Всемирной Паутины и пользоваться ими с чистой совестью.

Итак, перейдя на Перл я получил:

  • мощный, функционально полный язык с огромным количеством надстроек, вплоть до "перегрузки операций"
  • бесплатные и компактные программы интерпретации для всех платформ
  • устойчивую к ошибкам программиста систему + удобный встроенный отладчик
  • возможность строгого контроля за синтаксисом
  • средства манипуляции базами данных и OLE объектами (последнее - только в Win)
  • программный доступ в Интернет и работу с электронной почтой
  • автоматизированную сборку-разборку HTML
  • поддержку сокетов (для связки клиент-сервер)
  • несложную и легко переносимую (Юниксы,Win,Mac) библиотеку графики - Tk

Ну ладно, скажет нетерпеливый читатель, а где же обещанные недостатки? Помимо интерпретируемости, Перл имеет еще один естественный недостаток - программа на нем всегда ОТКРЫТА. Если Вы захотите написать программу-викторину вроде "Поля Чудес" или "Миллионера", то такую игру "взломает" любой малограмотный пользователь. Этого можно избежать откомпилировав скрипт под Windows, но лицензия Перла требует открытости исходного кода и в этом случае. Какой-нибудь Вася Пупкин это проигнорирует, но для серьезных продуктов такое ограничение может стать непреодолимым препятствием. Кстати, сам Win-компилятор является отдельным продуктом (и небесплатным!), к которому (хакеры не дремлют) уже придуман декомпилятор. [7]

Вопросы переносимости также не решены в Перле на 100% (как почти в любом другом языке). Например, программисту в Юниксе гораздо естественнее вызвать какой-нибудь любимый grep или gfind обратившись прямо в шелл, чем искать аналогичную библиотечную (а значит - переносимую) функцию на CPAN (стандартной библиотеке Перл-модулей). В результате один такой вызов приведет к "падению" всей программы под Windows или Mac. И наоборот, стоит Win-программисту "по старой привычке" использовать функции работы с реестром, OLE-объектами и т.п., как программа становится "невыполнимой" в Юниксе.

Несомненным недостатком, вытекающим из ранее указанного достоинства, является "мягкое" отношение к ошибкам программиста. Если не включить модуль строгого контроля (а кому понравится ситуация когда компилятор то и дело требует описать переменную или "ругается" на "подозрительные" вольности с указателями), то обращение к строке как к указателю может привести к неожиданной порче соответствующей переменной. А чего стоят "отрицательные" индексы массива, адресующие массив "с конца"? Если это сделано не умышленно то программа не "завалится", но и не пожалуется на такую вольность.

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


Links:
  1. http://www.perl.com
  2. http://www.oreilly.com
  3. http://www.activestate.com
  4. http://www.cpan.org
  5. http://www.perl.org
  6. http://www.perltk.org
  7. http://www.indigostar.com/perl2exe.htm