Эту статью
первоначально намечалось написать в качестве оправдания перед самим собой -
почему прикладной программист с десятилетним стажем работы на Си перешел на Перл
для решения повседневных задач. Но перечитав внимательнее я понял, что из
"самооправдания" статья превратилась в эдакий манифест для широких масс. Вот так
мой опус "вышел в люди".
Итак, о чем
собственно идет речь? Неужели в современной программистской среде нет лучшей
альтернативы? (естественно, речь идет о программистах "широкого профиля" имеющих
выбор в области языка программирования) Что дает мне Перл? В чем его недостатки?
Попробую
ответить на все вопросы по порядку. Начнем с представления объекта обсуждения.
Не вдаваясь в подробности сообщу, что язык этот относительно молодой, но
черезвычайно мощный и интуитивно понятный для программирующего на любом языке.
За короткое время Перл прочно обосновался в таких серьезных областях
программистского ремесла как CGI, Unix scripting, Web-дизайн. Позвольте, спросит
удивленный читатель, а как насчет всеми (не)любимой, но бесспорно самой массовой
платформы - Windows? А так, - используется, но в основном в серверных
приложениях (ну там NT, Win2K и прочая), хотя Перл безо всяких проблем работает
и на стандартных редакциях "окошек". Ну почему, спросит еще более удивленный
читатель, программисты всего мира дружными рядами не ринулись строчить
Win-приложения на этом языке? А причина до смешного проста: Перл - скриптовый
(интерпретируемый) язык, что очень удобно в WWW, но совсем не удобно для
стандартного пользователя "окошек", уровень способностей которого обычно
колеблется между умением "поставить винды" и знанием "операционной системы
эксель" ;-). В результате Перл-программа будет работать только на компьютере,
где установлен интерпретатор Перла. Поэтому пользователи многочисленных клонов
Юниксов охотно пользуются Перлом в своих ежедневных задачах - ведь им не надо
напрягаться с установкой интерпретатора - он подобно Квик Бейсику (извиняюсь за
сравнение) автоматически включается в дистрибутив системы. Да-да, я не
оговорился, обыкновенные "пользователи" используют Перл - ведь он объединяет в
себе синтаксис и фунциональность таких базовых команд Юникса как grep, sed, awk,
tr, да и самого Юникс-шелла csh.
Тут
программисты на Си/Си++ сразу скривятся - интерпретатор? Но ведь это дико
неэффективно! Вынужден согласиться - да, не супер-эффективно, когда речь идет о
Бейсике. Но Перл сочетает в себе преимущества компилируемых и интерпретируемых
языков - программа переводится во внутренний код перед выполнением (как в Java)
и в то же время остается возможность загрузки и выполнения фрагментов "на лету".
Добавьте сюда поддержку объектов, возможность подключения подпрограмм написанных
на других языках (си, ассемблер), наконец огромное количество прикладных
библиотек (от доступа к базам данных и платформенно-независимой графики до
работы с Web: разбор HTML, посылка/прием почты, загрузка/посылка по HTTP и FTP),
плюс мощнейшие встроенные функции по обработке текста - вот вам вкратце весь
Перл.
К
преимуществам Перла можно отнести и Си-подобный синтаксис (с множеством удобных
расширений, хотя любители чистого Си/Си++ могут их не использовать). Несколько
смущает "квикбейсиковый" способ объявления переменных (то есть - никакого!) и
примерно такая же "явная" типизация объектов. Но при желании эта первая "фича"
может быть выключена и тогда (ну совсем как в старом добром Си) каждая
переменная должна быть описана явно. А явная типизация объектов вообще очень
удобна (сравните стандарты на имена переменных, диктуемые Win-API: p - pointer,
s - string, b - byte).
Чтобы
проиллюстрировать простоту написания программ на Перле приведу пример из личного
опыта: для собственных нужд (и из-за дремучести в области UNIX) мной был написан
неплохой Download Manager (как позже выяснилось - со всеми функциями WGET).
Написан быстро - по принципу "2 строки вокруг одной работавшей ранее". При этом
ничем выдающимся в области программирования я не блистаю, а интернет и сетевые
технологии для меня вообще "лес густой". И ведь работает "как часы", так как
основную задачу - разбор HTML - на Перле можно решить в две-три строки.
Другой
пример - за пару-тройку ночей сляпана довольно корявая (с художественной точки
зрения) игрулька для ребенка. Игрулька (написанная на скриптовом! языке)
содержит (тупейшую) анимацию, активные объекты, окошко настройки и прочая и
прочая. Программа спокойно работает на любом (при наличии Tk не ниже 8.00)
Юниксе и на любой Windows-системе (после компиляции в один большой экзешник).
При этом (из-за моей серости в программировании) не потребовалось учить все эти
дурацкие Win-API, классы окон и подобную философию). Кстати и программирование
"специально для Юниксов" мне не знакомо - знай себе манипулируй абстрактными
событиями и окошками.
Добавлю, что
любой эксперимент с графикой в Перле выглядит не сложнее программы "Hello,
world!" - достаточно запустить поставляемую с перл-Tk программку ptksh и мы уже
"в Хопре" со всеми функциями графики и даже "историей" команд. При этом можно
спокойно переносить куски кода из понравившихся примеров без боязни что что-то
"завалится" и придется перезагружаться так как программа "стрельнула" по
системной памяти - ведь в Перле нет понятия "выход за границы массива" или
"неверный указатель". Это свойство Перла делает его незаменимым с точки зрения
простоты отладки - все скаляры, будь то данные, указатели или даже объекты
классов всегда являются символьными строками, а баг в программе никогда не
приводит к порче реальной памяти. В результате можно отлаживать и "доводить до
ума" даже явно "нерабочие" куски.
Не стоит
забывать и о таком "необычном" для российского пользователя факторе как
легальная бесплатность Перла. Да-да, все вышеописанные чудеса можно безвозмездно
(то есть даром) загрузить из Всемирной Паутины и пользоваться ими с чистой
совестью.
Итак,
перейдя на Перл я получил:
- мощный, функционально полный язык с
огромным количеством надстроек, вплоть до "перегрузки операций"
- бесплатные и компактные программы
интерпретации для всех платформ
- устойчивую к ошибкам программиста
систему + удобный встроенный отладчик
- возможность строгого контроля за
синтаксисом
- средства манипуляции базами данных
и OLE объектами (последнее - только в Win)
- программный доступ в Интернет и
работу с электронной почтой
- автоматизированную сборку-разборку
HTML
- поддержку сокетов (для связки
клиент-сервер)
- несложную и легко переносимую
(Юниксы,Win,Mac) библиотеку графики - Tk
Ну ладно,
скажет нетерпеливый читатель, а где же обещанные недостатки? Помимо
интерпретируемости, Перл имеет еще один естественный недостаток - программа на
нем всегда ОТКРЫТА. Если Вы захотите написать программу-викторину вроде "Поля
Чудес" или "Миллионера", то такую игру "взломает" любой малограмотный
пользователь. Этого можно избежать откомпилировав скрипт под Windows, но
лицензия Перла требует открытости исходного кода и в этом случае. Какой-нибудь
Вася Пупкин это проигнорирует, но для серьезных продуктов такое ограничение
может стать непреодолимым препятствием. Кстати, сам Win-компилятор является
отдельным продуктом (и небесплатным!), к которому (хакеры не дремлют) уже
придуман декомпилятор.
Вопросы
переносимости также не решены в Перле на 100% (как почти в любом другом языке).
Например, программисту в Юниксе гораздо естественнее вызвать какой-нибудь
любимый grep или gfind обратившись прямо в шелл, чем искать аналогичную
библиотечную (а значит - переносимую) функцию на CPAN (стандартной библиотеке
Перл-модулей). В результате один такой вызов приведет к "падению" всей программы
под Windows или Mac. И наоборот, стоит Win-программисту "по старой привычке"
использовать функции работы с реестром, OLE-объектами и т.п., как программа
становится "невыполнимой" в Юниксе.
Несомненным
недостатком, вытекающим из ранее указанного достоинства, является "мягкое"
отношение к ошибкам программиста. Если не включить модуль строгого контроля (а
кому понравится ситуация когда компилятор то и дело требует описать переменную
или "ругается" на "подозрительные" вольности с указателями), то обращение к
строке как к указателю может привести к неожиданной порче соответствующей
переменной. А чего стоят "отрицательные" индексы массива, адресующие массив "с
конца"? Если это сделано не умышленно то программа не "завалится", но и не
пожалуется на такую вольность.
Если от
прочтения последних абзацев у читателя появилось отвращение к этому языку
советую перечитать начало статьи (во всем плохом есть немного хорошего и
наоборот). Кстати, философия Перла не так примитивна как может показаться -
стоит начать изучать этот язык и программировать на нем и у вас тут же возникнет
ощущение, что "кто-то тут все хорошо продумал". Но, впрочем, это тема для другой
статьи.
|