Заранее извинюсь перед теми читателями, которые искали учебник или краткое руководство
по Перлу. Здесь я не буду рассказывать о синтаксисе языка и не приведу пример программы,
печатающей знаменитую фразу "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:
- http://www.perl.com
- http://www.oreilly.com
- http://www.activestate.com
- http://www.cpan.org
- http://www.perl.org
- http://www.perltk.org
- http://www.indigostar.com/perl2exe.htm
|