Perl - Perl

Perl
Programming-republic-of-perl.png
Парадигма Мультипарадигма : функциональная , императивная , объектно-ориентированная ( классовая ), рефлексивная
Разработано Ларри Уолл
Разработчик Ларри Уолл
Впервые появился 1 февраля 1988 г . ; 33 года назад ( 1988-02-01 )
Стабильный выпуск
Предварительный выпуск
5.35.4 / 20 сентября 2021 г . ; 22 дней назад ( 2021-09-20 )
Печатная дисциплина Динамический
Язык реализации C
Операционные системы Кроссплатформенность
Лицензия Artistic License 1.0 или Стандартная общественная лицензия GNU
Расширения имени файла .plx, .pl, .pm, .xs, .t, .pod, .cgi
Веб-сайт www .perl .org
Под влиянием
AWK , BASIC , C , C ++ , Lisp , sed , оболочка Unix
Под влиянием
CoffeeScript , Groovy , JavaScript , Julia , LPC , PHP , Python , Raku , Ruby , PowerShell

Perl представляет собой семейство два высокого уровня , общего назначения , интерпретируемых , динамических языков программирования . «Perl» относится к Perl 5, но с 2000 по 2019 год он также ссылался на свой переработанный «родственный язык», Perl 6, до того, как последний был официально изменен на Raku в октябре 2019 года.

Хотя Perl официально не является аббревиатурой, используются различные бэкронимы, в том числе «Практический язык извлечения и отчетности». Perl был разработан Ларри Уоллом в 1987 году как язык сценариев Unix общего назначения для облегчения обработки отчетов. С тех пор он претерпел множество изменений и доработок. Raku, который начинался как редизайн Perl 5 в 2000 году, со временем превратился в отдельный язык. Оба языка продолжают независимо разрабатываться разными командами разработчиков и широко заимствовать идеи друг у друга.

Языки Perl заимствуют функции других языков программирования, включая C , сценарий оболочки ( sh ), AWK и sed ; Они предоставляют средства обработки текста без ограничений произвольной длины данных, как у многих современных инструментов командной строки Unix . Perl 5 получил широкую популярность в конце 1990-х как язык сценариев CGI , отчасти из-за его непревзойденных возможностей регулярного выражения и синтаксического анализа строк .

Помимо CGI, Perl 5 используется для системного администрирования , сетевого программирования , финансов, биоинформатики и других приложений, например, для графических интерфейсов пользователя . Его прозвали «швейцарской армейской бензопилой скриптовых языков» из-за его гибкости и мощности, а также его безобразия. В 1998 году его также называли « клейкой лентой, которая скрепляет Интернет », имея в виду как его повсеместное использование в качестве связующего языка, так и его кажущуюся неэлегантность.

Perl - очень выразительный язык программирования: исходный код данного алгоритма может быть коротким и хорошо сжимаемым.

Имя

Первоначально Perl назывался «Жемчужина». Уолл хотел дать языку короткое название с положительной коннотацией. Уолл обнаружил существующий язык программирования PEARL до официального выпуска Perl и изменил написание имени.

При упоминании языка имя пишется с заглавной буквы: Perl . При ссылке на саму программу имя пишется без заглавных букв ( perl ), потому что большинство Unix-подобных файловых систем чувствительны к регистру. До выпуска первой редакции Programming Perl этот язык обычно назывался perl . Рэндал Л. Шварц , однако, использовал название языка в книге с заглавной буквы, чтобы он лучше выделялся при наборе. Это различие падежей впоследствии было задокументировано как каноническое.

Название иногда расширяется в виде бэкронимов : Practical Extraction and Report Language и Собственный список патологически эклектичного мусора Уолла, который находится на странице руководства для perl.

История

Ранние версии

Ларри Уолл начал работать над Perl в 1987 году, работая программистом в Unisys , и 1 февраля 1988 года для группы новостей comp.sources.unix была выпущена версия 1.0. В течение следующих нескольких лет язык быстро расширялся.

Perl 2, выпущенный в 1988 году, отличался улучшенным механизмом регулярных выражений. Perl 3, выпущенный в 1989 году, добавил поддержку двоичных потоков данных .

Первоначально единственной документацией по Perl была одна длинная справочная страница . В 1991 году был опубликован Programming Perl , известный многим программистам Perl как «Camel Book» из-за своей обложки, который фактически стал эталоном для языка. В то же время номер версии Perl был увеличен до 4, не для того, чтобы отметить серьезное изменение языка, а для идентификации версии, которая была хорошо задокументирована в книге.

Ранний Perl 5

Perl 4 прошел через серию релизов на обслуживание , что привело к Perl 4.036 в 1993 году, после чего стена отказались от Perl 4 , чтобы начать работу над Perl 5. Начальный дизайн Perl 5 продолжение в 1994 году perl5-носильщики список рассылки был создан в мае 1994 года координировать работу по переносу Perl 5 на разные платформы. Он остается основным форумом для разработки, сопровождения и портирования Perl 5.

Perl 5.000 был выпущен 17 октября 1994 года. Это был почти полный переписанный интерпретатор , и он добавил много новых функций в язык, включая объекты , ссылки , лексические (мои) переменные и модули . Важно отметить, что модули предоставляют механизм для расширения языка без изменения интерпретатора. Это позволило стабилизировать основной интерпретатор, даже если это позволило обычным программистам Perl добавлять новые языковые функции. С тех пор Perl 5 находится в активной разработке.

Perl 5.001 был выпущен 13 марта 1995 года. Perl 5.002 был выпущен 29 февраля 1996 года с новой функцией прототипов. Это позволило авторам модулей создавать подпрограммы, которые ведут себя как встроенные функции Perl . Perl 5.003 был выпущен 25 июня 1996 года в качестве версии для системы безопасности.

Одно из самых важных событий в истории Perl 5 произошло за пределами самого языка и было следствием его модульной поддержки. 26 октября 1995 г. была создана Comprehensive Perl Archive Network (CPAN) как репозиторий для языка Perl и модулей Perl ; по состоянию на май 2017 года он содержит более 185 178 модулей в 35 190 дистрибутивах, написанных более чем 13 071 автором, и отражен более чем в 245 местах по всему миру.

Perl 5.004 был выпущен 15 мая 1997 года и включал, среди прочего, пакет UNIVERSAL, предоставляя Perl базовый объект, из которого были автоматически получены все классы , и возможность требовать версии модулей. Еще одним важным событием стало включение модуля CGI.pm , который способствовал популярности Perl как языка сценариев CGI .

Perl 5.004 добавил поддержку Microsoft Windows , Plan 9 , QNX и AmigaOS .

Perl 5.005 был выпущен 22 июля 1998 года. Этот выпуск включал в себя несколько улучшений механизма регулярных выражений , новые перехватчики в бэкэнд через B::*модули, qr//оператор кавычек регулярных выражений, большой выбор других новых основных модулей и добавленную поддержку еще нескольких операционных модулей. системы, включая BeOS .

2000–2020 гг.

Основная версия Последнее обновление
Старая версия, больше не поддерживается: 5,4 1999-04-29
Старая версия, больше не поддерживается: 5.5 1999-03-29
Старая версия, больше не поддерживается: 5,6 2003-11-15
Старая версия, больше не поддерживается: 5,8 2008-12-14
Старая версия, больше не поддерживается: 5.10 2009-08-23
Старая версия, больше не поддерживается: 5,12 2012-11-10
Старая версия, больше не поддерживается: 5,14 2013-03-10
Старая версия, больше не поддерживается: 5,16 2013-03-11
Старая версия, больше не поддерживается: 5,18 2014-10-02
Старая версия, больше не поддерживается: 5.20 2015-09-12
Старая версия, больше не поддерживается: 5,22 2017-07-15
Старая версия, больше не поддерживается: 5,24 2018-04-14
Старая версия, больше не поддерживается: 5,26 2018-11-29
Старая версия, больше не поддерживается: 5,28 2020-06-01
Старая версия, больше не поддерживается: 5.30 2020-06-01
Старая версия, но все еще поддерживается: 5,32 2021-01-23
Текущая стабильная версия: 5,34 2021-05-20
Последняя предварительная версия будущего выпуска: 5,35 2021-05-21
Будущий выпуск: 5,36 2022-05-20
Будущий выпуск: 7.0 2022?
Легенда:
Старая версия
Старая версия, поддерживается
Текущая стабильная версия
Последняя предварительная версия
Будущий выпуск

Perl 5.6 был выпущен 22 марта 2000 года. Основные изменения включали поддержку 64-битной версии , строковое представление Unicode , поддержку файлов размером более 2 ГиБ и ключевое слово «наш». При разработке Perl 5.6 было принято решение переключить схему управления версиями на более похожую на другие проекты с открытым исходным кодом; после 5.005_63 следующей версией стала 5.5.640, при этом в разрабатываемых версиях планировалось иметь нечетные номера, а в стабильных версиях - четные.

В 2000 году Уолл обратился к сообществу с призывом вносить предложения по новой версии Perl. В результате был получен 361 документ RFC (запрос комментариев), который должен был использоваться при разработке Perl 6. В 2001 году началась работа над «Апокалипсисами» для Perl 6, серией документов, предназначенных для обобщения запросов на изменения и представления дизайн следующего поколения Perl. Они были представлены как дайджест RFC, а не как официальный документ. На тот момент Perl 6 существовал только как описание языка.

Perl 5.8 был впервые выпущен 18 июля 2002 года и с тех пор обновлялся почти ежегодно. Perl 5.8 улучшил поддержку Unicode, добавил новую реализацию ввода-вывода, добавил новую реализацию потока, улучшил числовую точность и добавил несколько новых модулей. По состоянию на 2013 год эта версия по-прежнему остается самой популярной версией Perl и используется Red Hat 5, Suse 10, Solaris 10, HP-UX 11.31 и AIX 5.

В 2004 году началась работа над «Синопсами» - документами, которые первоначально суммировали Апокалипсис, но которые стали спецификацией для языка Perl 6. В феврале 2005 года Одри Танг начала работу над Pugs , интерпретатором Perl 6, написанным на Haskell . Это была первая согласованная попытка воплотить Perl 6 в реальность. Эта работа застопорилась в 2006 году.

PONIE - это аббревиатура от Perl On New Internal Engine. Проект PONIE существовал с 2003 по 2006 год и должен был стать мостом между Perl 5 и Perl 6. Это была попытка переписать интерпретатор Perl 5 для работы на Parrot , виртуальной машине Perl 6. Целью было обеспечить будущее миллионов строк кода Perl 5 в тысячах компаний по всему миру. Проект PONIE завершился в 2006 году и более активно не развивается. Некоторые улучшения, внесенные в интерпретатор Perl 5 как часть PONIE, были включены в этот проект.

18 декабря 2007 года, в год 20-летия Perl 1.0, был выпущен Perl 5.10.0. Perl 5.10.0 включает заметные новые функции, которые приближают его к Perl 6. К ним относятся оператор switch (называемый «задано» / «когда»), обновления регулярных выражений и оператор интеллектуального сопоставления (~~). Примерно в это же время началась серьезная разработка другой реализации Perl 6, известной как Rakudo Perl , разработанной в тандеме с виртуальной машиной Parrot . По состоянию на ноябрь 2009 года у Rakudo Perl были регулярные ежемесячные выпуски, и теперь это наиболее полная реализация Perl 6.

Основное изменение в процессе разработки Perl 5 произошло с Perl 5.11; Сообщество разработчиков перешло на ежемесячный цикл выпуска разрабатываемых выпусков с годовым графиком стабильных выпусков. Согласно этому плану, выпуски исправления ошибок будут следовать за стабильными выпусками каждые три месяца.

12 апреля 2010 года был выпущен Perl 5.12.0. Заметные основные улучшения включают новый package NAME VERSIONсинтаксис, оператор Yada Yada (предназначенный для обозначения кода-заполнителя, который еще не реализован), неявные ограничения, полное соответствие Y2038 , перегрузку преобразования регулярных выражений, поддержку DTrace и Unicode 5.2. 21 января 2011 года был выпущен Perl 5.12.3; он содержит обновленные модули и некоторые изменения в документации. Версия 5.12.4 была выпущена 20 июня 2011 года. Последняя версия этой ветки, 5.12.5, была выпущена 10 ноября 2012 года.

14 мая 2011 года был выпущен Perl 5.14 со встроенной поддержкой JSON .

20 мая 2012 года был выпущен Perl 5.16. Примечательные новые функции включают возможность указать конкретную версию Perl, которую нужно подражать, что позволяет пользователям обновлять свою версию Perl, но по-прежнему запускать старые сценарии, которые обычно были бы несовместимы. Perl 5.16 также обновляет ядро ​​для поддержки Unicode 6.1.

18 мая 2013 года был выпущен Perl 5.18. Примечательные новые функции включают новые перехватчики dtrace, лексические подпрограммы, больше CORE :: subs, пересмотр хеша по соображениям безопасности, поддержку Unicode 6.2.

27 мая 2014 года был выпущен Perl 5.20. Примечательные новые функции включают подписи подпрограмм, хеш-срезы / синтаксис нового среза, разыменование постфиксов (экспериментальное), Unicode 6.3, rand () с использованием согласованного генератора случайных чисел.

Некоторые обозреватели считают выпуск Perl 5.10 началом движения Modern Perl. В частности, эта фраза описывает стиль разработки, который охватывает использование CPAN, использует преимущества последних разработок в языке и строго относится к созданию высококачественного кода. В то время как книга «Современный Perl» может быть наиболее заметным носителем этой идеи, другие группы, такие как Enlighted Perl Organization, подхватили ее.

В конце 2012 и 2013 годов стартовало несколько проектов по альтернативным реализациям Perl 5: Perl5 на Perl6 от команды Rakudo Perl, moe от Stevan Little и его друзей, p2 от команды Perl11 под Reini Urban, gperl от goccy и rperl, на Kickstarter. проект, возглавляемый Уиллом Брасуэллом и связанный с проектом Perll11.

2020 г.

В июне 2020 года Perl 7 был объявлен преемником Perl 5. Первоначально Perl 7 должен был быть основан на Perl 5.32 с выпуском, ожидаемым в первой половине 2021 года, и выпускать кандидатов раньше. Этот план был пересмотрен в мае 2021 года, без каких-либо сроков выпуска или версии Perl 5 для использования в качестве базового уровня. Когда будет выпущен Perl 7, Perl 5 будет находиться в долгосрочном обслуживании. Тем не менее, для поддерживаемых версий Perl 5 будут по-прежнему исправлены важные проблемы безопасности и исправления ошибок.

Символы

Верблюд

Символ верблюда, используемый O'Reilly Media

Programming Perl , опубликованный O'Reilly Media , содержит изображение верблюда-верблюда на обложке и обычно называется «Книгой верблюдов». Это изображение стало неофициальным символом Perl, а также общей эмблемой хакеров , появляющейся на футболках и других предметах одежды.

O'Reilly владеет изображением как товарным знаком, но лицензирует его для некоммерческого использования, требуя только подтверждения и ссылки на www.perl.com. Лицензирование для коммерческого использования решается в индивидуальном порядке. O'Reilly также предоставляет логотипы «Programming Republic of Perl» для некоммерческих сайтов и кнопки «Powered by Perl» для всех сайтов, использующих Perl.

Лук

Луковый логотип, используемый Фондом Perl

Perl Foundation владеет альтернативным символом луковицы, который он лицензирует своим дочерним компаниям, Perl Mongers , PerlMonks , Perl.org и другим. Этот символ представляет собой визуальный каламбур на жемчужном луке .

Raptor

Альтернативный логотип Perl 5

Себастьян Ридель, создатель Mojolicious , создал логотип с изображением динозавра-хищника , который доступен по лицензии CC-SA, версия 4.0. Аналог хищника происходит из серии выступлений Мэтта С. Траута, начатых в 2010 году.

Обзор

По словам Уолла, у Perl есть два слогана. Первый - « Есть несколько способов сделать это », широко известный как TMTOWTDI. Второй слоган: «Легкие должны быть легкими, а сложные - возможными».

Функции

Общая структура Perl в целом унаследована от C. Perl носит процедурный характер, с переменными , выражениями , операторами присваивания , блоками , ограниченными скобками , структурами управления и подпрограммами .

Perl также использует возможности программирования оболочки. Все переменные отмечены ведущие сигилы , которые позволяют переменные быть интерполированными непосредственно в строки . Однако, в отличие от оболочки, Perl использует сигилы при любом доступе к переменным, и в отличие от большинства других языков программирования, которые используют сигилы, сигилы обозначают не тип переменной, а тип выражения. Так, например, в то время как массив обозначается знаком «@» (например @arrayname), отдельный член массива обозначается скалярным знаком «$» (например $arrayname[3]). Perl также имеет множество встроенных функций, которые предоставляют инструменты, часто используемые в программировании оболочки (хотя многие из этих инструментов реализуются программами, внешними по отношению к оболочке), например сортировка и вызов средств операционной системы .

Perl берет хэши («ассоциативные массивы») из AWK и регулярные выражения из sed . Это упрощает многие задачи синтаксического анализа, обработки текста и управления данными. Совместно с Лиспом является неявный возврат последнего значения в блоке, и все операторы также являются выражениями, которые сами могут использоваться в более крупных выражениях.

Perl 5 добавил функции, которые поддерживают сложные структуры данных , первоклассные функции (то есть замыкания как значения) и модель объектно-ориентированного программирования. К ним относятся ссылки , пакеты, диспетчеризация методов на основе классов и переменные с лексической областью видимости , а также директивы компилятора (например, strict прагма ). Важной дополнительной функцией, появившейся в Perl 5, была возможность упаковывать код в виде повторно используемых модулей. Позже Уолл заявил, что «вся цель модульной системы Perl 5 состояла в том, чтобы стимулировать рост культуры Perl, а не ядра Perl».

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

Дизайн

Дизайн Perl можно рассматривать как ответ на три основные тенденции в компьютерной индустрии: падение стоимости оборудования, рост затрат на рабочую силу и улучшение технологии компиляторов . Многие ранние компьютерные языки, такие как Fortran и C, были нацелены на эффективное использование дорогостоящего компьютерного оборудования. Напротив, Perl был разработан так, чтобы компьютерные программисты могли писать программы быстрее и проще.

Perl имеет множество функций, которые упрощают задачу программиста за счет увеличения требований к процессору и памяти. К ним относятся автоматическое управление памятью; динамическая типизация ; строки, списки и хеши; регулярные выражения; самоанализ ; и eval()функция. Perl следует теории «отсутствия встроенных ограничений», идее, аналогичной правилу Zero One Infinity .

Уолл получил образование лингвиста, и дизайн Perl во многом основан на лингвистических принципах. Примеры включают кодирование Хаффмана (общие конструкции должны быть короткими), хорошее конечное взвешивание (важная информация должна идти первой) и большой набор языковых примитивов . Perl отдает предпочтение языковым конструкциям, которые понятны и понятны людям, даже если они усложняют интерпретатор Perl.

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

Perl не навязывает какую-либо конкретную парадигму программирования ( процедурную , объектно-ориентированную , функциональную или другие) и даже не требует от программиста выбора между ними.

Существует широкая практическая склонность как к языку Perl, так и к сообществу и культуре, которые его окружают. Предисловие к программированию на Perl начинается так: «Perl - это язык для выполнения вашей работы». Одним из следствий этого является то, что Perl не является аккуратным языком. Он включает множество функций, допускает исключения из правил и использует эвристику для устранения синтаксических двусмысленностей. Из-за снисходительного характера компилятора иногда бывает трудно найти ошибки. В документации по функциям Perl говорится о вариативном поведении встроенных функций в контекстах списков и скалярных строк, говоря: «В общем, они делают то, что вы хотите, если вы не хотите согласованности».

Не существует письменной спецификации или стандарта для языка Perl для версий Perl до Perl 5, и нет планов по их созданию для текущей версии Perl. Была только одна реализация интерпретатора, и язык развивался вместе с ней. Этот интерпретатор вместе с его функциональными тестами фактически является спецификацией языка. Perl 6, однако, начинался со спецификации, и несколько проектов нацелены на реализацию части или всей спецификации.

Приложения

Perl имеет множество разнообразных приложений, которые дополняются наличием множества стандартных и сторонних модулей.

Perl в основном использовался для написания сценариев CGI : большие проекты, написанные на Perl, включают cPanel , Slash , Bugzilla , RT , TWiki и Movable Type ; Сайты с высокой посещаемостью, которые широко используют Perl, включают Priceline.com , Craigslist , IMDb , LiveJournal , DuckDuckGo , Slashdot и Ticketmaster . Это также дополнительный компонент популярного стека технологий LAMP для веб-разработки вместо PHP или Python . Perl широко используется как язык системного программирования в дистрибутиве Debian Linux .

Perl часто используется в качестве связующего языка , связывающего воедино системы и интерфейсы, которые не были специально разработаны для взаимодействия, и для « манипулирования данными », то есть преобразования или обработки больших объемов данных для таких задач, как создание отчетов. Фактически, эти сильные стороны тесно связаны. Такое сочетание делает Perl популярным универсальным языком для системных администраторов , особенно потому, что короткие программы, часто называемые « однострочными программами », можно вводить и запускать в одной командной строке .

Код Perl можно сделать переносимым в Windows и Unix; такой код часто используется поставщиками программного обеспечения (как COTS, так и заказным) для упрощения упаковки и сопровождения сценариев сборки и развертывания программного обеспечения.

Perl / Tk и wxPerl обычно используются для добавления графических пользовательских интерфейсов в сценарии Perl.

Реализация

Perl реализован как основной интерпретатор, написанный на C, вместе с большим набором модулей, написанных на Perl и C. По состоянию на 2010 год интерпретатор представляет собой 150 000 строк кода C и компилируется в исполняемый файл размером 1 МБ на типичных архитектурах машин. В качестве альтернативы интерпретатор может быть скомпилирован в библиотеку ссылок и встроен в другие программы. В дистрибутиве почти 500 модулей, включая 200 000 строк Perl и дополнительно 350 000 строк кода C (большая часть кода C в модулях состоит из таблиц кодировки символов ).

Интерпретатор имеет объектно-ориентированную архитектуру. Все элементы на Perl языковых скаляры, массивы, хэши, coderefs, дескрипторы файлов -Есть представлены в интерпретатору структур C . Операции с этими структурами определяются большим набором макросов , определений типов и функций; они составляют Perl C API . Perl API может сбить с толку непосвященных, но его точки входа следуют согласованной схеме именования , которая предоставляет руководство для тех, кто его использует.

Жизнь интерпретатора Perl в целом делится на фазу компиляции и фазу выполнения. В Perl фазы - это основные этапы жизненного цикла интерпретатора. Каждый интерпретатор проходит каждую фазу только один раз, и фазы следуют в фиксированной последовательности.

Большая часть того, что происходит на этапе компиляции Perl, - это компиляция, и большая часть того, что происходит на этапе выполнения Perl, - это выполнение, но есть существенные исключения. Perl очень важно использует свои возможности для выполнения кода Perl на этапе компиляции. Perl также задерживает компиляцию на этапе выполнения. Термины, обозначающие вид обработки, которая фактически происходит в любой момент, - это время компиляции и время выполнения . Perl находится во время компиляции в большинстве случаев во время фазы компиляции, но время компиляции также может быть введено во время фазы выполнения. Время компиляции кода в строковом аргументе, переданном evalвстроенной программе, происходит на этапе выполнения. Perl часто находится во время выполнения во время фазы компиляции и проводит большую часть фазы выполнения во время выполнения. Код в BEGINблоках выполняется во время выполнения, но на этапе компиляции.

Во время компиляции интерпретатор анализирует код Perl в синтаксическое дерево . Во время выполнения он выполняет программу путем обхода дерева . Текст анализируется только один раз, и дерево синтаксиса подлежит оптимизации перед выполнением, так что выполнение является относительно эффективным. Оптимизация синтаксического дерева во время компиляции включает сворачивание констант и распространение контекста, но также выполняется оптимизация с помощью глазка .

Perl имеет полную по Тьюрингу грамматику, потому что на синтаксический анализ может повлиять код времени выполнения, выполняемый на этапе компиляции. Следовательно, Perl не может быть проанализирован простой комбинацией лексера / парсера Lex / Yacc . Вместо этого интерпретатор реализует свой собственный лексер, который координируется с модифицированным парсером GNU bison для разрешения неоднозначностей в языке.

Часто говорят, что «только perl может анализировать Perl», имея в виду, что только интерпретатор Perl ( perl) может анализировать язык Perl ( Perl ), но даже это в целом неверно. Поскольку интерпретатор Perl может моделировать машину Тьюринга на этапе компиляции, ему нужно будет решить проблему остановки , чтобы завершить синтаксический анализ в каждом случае. Это давний результат, что проблема остановки неразрешима, и поэтому даже Perl не всегда может проанализировать Perl. Perl делает необычный выбор, предоставляя пользователю доступ ко всем его программным возможностям на собственном этапе компиляции. Стоимость с точки зрения теоретической чистоты высока, но практические неудобства возникают редко.

Другие программы, выполняющие синтаксический анализ Perl, такие как анализаторы исходного кода и автоинденторы , должны иметь дело не только с неоднозначными синтаксическими конструкциями, но и с неразрешимостью синтаксического анализа Perl в общем случае. Проект PPI Адама Кеннеди был сосредоточен на синтаксическом анализе кода Perl как документа (с сохранением его целостности как документа), а не на синтаксическом анализе Perl как исполняемого кода (что не всегда может сделать даже сам Perl). Кеннеди первым предположил, что «синтаксический анализ Perl страдает от« проблемы остановки », что позже было доказано.

Perl распространяется с более чем 250 000 функциональных тестов для основного языка Perl и более 250 000 функциональных тестов для основных модулей. Они выполняются как часть обычного процесса сборки и интенсивно используют интерпретатор и его основные модули. Разработчики Perl полагаются на функциональные тесты, чтобы гарантировать, что изменения в интерпретаторе не приведут к ошибкам программного обеспечения ; кроме того, пользователи Perl, которые видят, что интерпретатор проходит функциональные тесты в их системе, могут иметь высокую степень уверенности в том, что он работает правильно.

Доступность

Perl является двойной лицензирован под как Artistic License 1.0 и GNU General Public License . Дистрибутивы доступны для большинства операционных систем . Он особенно распространен в Unix и Unix-подобных системах, но был перенесен на большинство современных (и многих устаревших) платформ. За исключением шести зарегистрированных исключений, Perl может быть скомпилирован из исходного кода на всех POSIX- совместимых или других Unix-совместимых платформах.

Из-за необычных изменений, требуемых для классической среды Mac OS , специальный порт под названием MacPerl поставлялся отдельно.

Comprehensive Perl Archive Network осуществляет полный список поддерживаемых платформ со ссылками на распределения , доступный на каждом. CPAN также является источником общедоступных модулей Perl, которые не являются частью основного дистрибутива Perl.

Окна

Пользователи Microsoft Windows обычно устанавливают один из собственных двоичных дистрибутивов Perl для Win32, чаще всего Strawberry Perl или ActivePerl . Компиляция Perl из исходного кода под Windows возможна, но в большинстве установок отсутствует необходимый компилятор C и инструменты сборки. Это также затрудняет установку модулей из CPAN, особенно тех, которые частично написаны на C.

ActivePerl - это дистрибутив с закрытым исходным кодом от ActiveState, который имеет регулярные выпуски, отслеживающие основные выпуски Perl. Дистрибутив ранее включал диспетчер пакетов Perl (PPM), популярный инструмент для установки, удаления, обновления и управления использованием общих модулей Perl; однако этот инструмент был прекращен с ActivePerl 5.28. Включен также PerlScript , механизм Windows Script Host (WSH), реализующий язык Perl. Visual Perl - это инструмент ActiveState, который добавляет Perl в пакет разработки Visual Studio .NET. А VBScript -в-Perl конвертер, а также компилятор Perl для Windows, и преобразователи AWK и СЭД на Perl также были произведены этой компанией и включены в ActiveState CD для Windows , , которая включает в себя все их распределения плюс Комодо IDE и все, кроме первого, в его варианте Unix / Linux / Posix в 2002 году и позже.

Strawberry Perl - это дистрибутив с открытым исходным кодом для Windows. С января 2008 года он выпускает регулярные ежеквартальные выпуски, включая новые модули по мере поступления отзывов и запросов. Strawberry Perl нацелен на то, чтобы иметь возможность устанавливать модули, подобные стандартным дистрибутивам Perl, на других платформах, включая компиляцию модулей XS.

Cygwin эмуляции еще один способ запуска Perl под Windows. Cygwin предоставляет Unix-подобную среду в Windows, и Perl и CPAN доступны как стандартные предварительно скомпилированные пакеты в программе установки Cygwin. Поскольку Cygwin также включает в себя gcc , также возможна компиляция Perl из исходных текстов.

Исполняемый файл Perl включен в несколько наборов ресурсов Windows в каталоге с другими инструментами создания сценариев.

Реализации Perl поставляются с MKS Toolkit , Interix (основа более ранних реализаций Windows Services для Unix ) и UWIN .

Интерфейсы базы данных

Возможности Perl по обработке текста могут использоваться для генерации SQL- запросов; массивы, хэши и автоматическое управление памятью упрощают сбор и обработку возвращаемых данных. Например, в интерфейсе прикладного программирования (API) Perl DBI Тима Бунса аргументами API может быть текст SQL-запросов; таким образом, можно программировать одновременно на нескольких языках (например, для создания веб-страницы с использованием HTML , JavaScript и SQL в документе здесь ). Использование интерполяции переменных Perl для программной настройки каждого из запросов SQL и спецификации массивов или хэшей Perl в качестве структур для программного хранения результирующих наборов данных из каждого запроса SQL позволяет создать высокоуровневый механизм для обработки больших объемов данных. для пост-обработки подпрограммой Perl. В ранних версиях Perl интерфейсы базы данных создавались путем повторного связывания интерпретатора с клиентской библиотекой базы данных. Это было достаточно сложно, так что это было сделано только для нескольких наиболее важных и наиболее широко используемых баз данных, и это ограничивало получаемый исполняемый файл использованием только одного интерфейса базы данных за раз. perl

В Perl 5 интерфейсы баз данных реализованы модулями Perl DBI. Модуль DBI (интерфейс базы данных) представляет собой единый, независимый от базы данных интерфейс для приложений Perl, в то время как модули DBD (драйвер базы данных) обрабатывают детали доступа примерно к 50 различным базам данных; существуют драйверы DBD для большинства баз данных ANSI SQL .

DBI обеспечивает кэширование дескрипторов и запросов к базе данных, что может значительно повысить производительность в средах с длительным сроком службы, таких как mod perl , помогая системам большого объема предотвращать скачки нагрузки, как в эффекте Slashdot .

В современных приложениях Perl, особенно написанных с использованием веб-фреймворков, таких как Catalyst , модуль DBI часто используется косвенно через объектно-реляционные преобразователи, такие как DBIx :: Class , Class :: DBI или Rose :: DB :: Object, которые генерируют запросы SQL. и обрабатывать данные прозрачно для автора приложения.

Сравнительная производительность

Игра Computer Language Benchmarks Game сравнивает производительность реализаций типичных задач программирования на нескольких языках программирования. Представленные реализации Perl обычно работают в верхней части спектра использования памяти и дают различные результаты по скорости. Производительность Perl в тестовой игре типична для интерпретируемых языков.

Большие программы Perl запускаются медленнее, чем аналогичные программы на компилируемых языках, потому что Perl должен компилировать исходный код каждый раз при запуске. В своем выступлении на конференции YAPC :: Europe 2005 и в последующей статье «Своевременное начало» Жан-Луи Лерой обнаружил, что выполнение его программ на Perl заняло гораздо больше времени, чем ожидалось, поскольку интерпретатор Perl потратил значительное время на поиск модулей в своем слишком большом объеме. включить путь. В отличие от Java, Python и Ruby, Perl имеет только экспериментальную поддержку предварительной компиляции. Следовательно, программы Perl платят за эти накладные расходы при каждом выполнении. Фаза выполнения типичных программ достаточно продолжительна, поэтому амортизированное время запуска несущественно, но тесты, измеряющие очень короткое время выполнения, вероятно, будут искажены из-за этих накладных расходов.

Для улучшения этой ситуации был введен ряд инструментов. Первым таким инструментом был Apache mod perl , который пытался устранить одну из наиболее распространенных причин быстрого запуска небольших Perl-программ: веб- разработку CGI . ActivePerl через Microsoft ISAPI обеспечивает аналогичные улучшения производительности.

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

Оптимизация

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

Perl 5

Perl 5, язык, обычно называемый Perl, продолжает активно развиваться. Perl 5.12.0 был выпущен в апреле 2010 года с некоторыми новыми функциями, на которые повлиял дизайн Perl 6, за которым последовали Perl 5.14.1 (выпущен 17 июня 2011 года), Perl 5.16.1 (выпущен 9 августа 2012 года), и Perl 5.18.0 (выпущен 18 мая 2013 г.). Разрабатываемые версии Perl 5 выпускаются ежемесячно, а основные выпуски выходят один раз в год.

Относительная доля поисковых запросов «Perl программирование» в Интернете по сравнению с аналогичными поисками других языков программирования неуклонно снижалась с примерно 10% в 2005 году до примерно 2% в 2011 году и примерно до 0,7% в 2020 году.

Раку (Perl 6)

Camelia , логотип проекта Perl 6

На конференции Perl 2000 года Джон Орвант привел аргументы в пользу новой крупной языковой инициативы. Это привело к решению начать работу над редизайном языка, который будет называться Perl 6. Предложения по новым языковым функциям были запрошены от сообщества Perl в целом, которое представило более 300 RFC .

Следующие несколько лет Уолл потратил на переваривание RFC и синтез их в целостную структуру для Perl 6. Он представил свой проект для Perl 6 в серии документов, названных «апокалипсисами», пронумерованных в соответствии с главами в Программе Perl . По состоянию на январь 2011 года разрабатываемая спецификация Perl 6 была инкапсулирована в проектные документы под названием Synopses - пронумерованные, чтобы соответствовать Apocalypses.

В дипломной работе Брэдли М. Куна под руководством Уолла рассматривалось возможное использование виртуальной машины Java в качестве среды выполнения для Perl. Тезис Куна показал, что такой подход проблематичен. В 2001 году было решено, что Perl 6 будет работать на кросс-языковой виртуальной машине под названием Parrot . Это будет означать, что другие языки, нацеленные на Parrot, получат собственный доступ к CPAN , что обеспечит некоторый уровень межъязыковой разработки.

В 2005 году Одри Танг создала проект Pugs , реализацию Perl 6 на Haskell . Это действовало и продолжает действовать как тестовая платформа для языка Perl 6 (отдельно от разработки фактической реализации), позволяя разработчикам языка исследовать. Проект Pugs породил активное межъязыковое сообщество Perl / Haskell, сосредоточенное вокруг IRC-канала Libera Chat #raku. Команда разработчиков Perl 6 приняла на себя многие идеи функционального программирования .

В 2012 году разработка Perl 6 была сосредоточена в основном на двух компиляторах:

  1. Rakudo , реализация, работающая на виртуальной машине Parrot и виртуальной машине Java.
  2. Niecza , который нацелен на Common Language Runtime .

В 2013 году была анонсирована MoarVM («Метамодель в среде выполнения»), виртуальная машина на основе языка C, разработанная в первую очередь для Rakudo.

В октябре 2019 года Perl 6 был переименован в Raku.

По состоянию на 2017 год только реализация Rakudo и MoarVM находятся в стадии активной разработки, а другие виртуальные машины, такие как виртуальная машина Java и JavaScript , поддерживаются.

Perl 7

Perl 7 был анонсирован 24 июня 2020 года на «конференции Perl в облаке» как преемник Perl 5. Основанный на Perl 5.32, Perl 7 разработан для обеспечения обратной совместимости с современным кодом Perl 5; Код Perl 5 без шаблонного (pragma) заголовка необходимо добавить, use compat::perl5;чтобы он оставался совместимым, но современный код может отбросить некоторые из шаблонных.

Сообщество Perl

Культура и сообщество Perl развивались вместе с самим языком. Usenet был первой общедоступной площадкой, на которой был представлен Perl, но в ходе своего развития сообщество Perl формировалось в результате роста расширяющихся Интернет-сервисов, включая появление Всемирной паутины. Фактически, сообщество, окружающее Perl, было темой первого выступления Уолла «State of the Onion».

Состояние лука

State of the Onion - так называется ежегодный краткий обзор развития Perl и его сообщества в стиле программных заметок Wall . Они характеризуются его отличительным юмором, используя отсылки к культуре Перла, более широкой культуре хакеров, лингвистическому фону Уолла, иногда его семейной жизни, а иногда даже его христианскому происхождению.

Каждый доклад сначала проводится на различных конференциях по Perl, а затем публикуется в Интернете.

Игры на Perl

JAPH
В электронной почте, Usenet и на досках объявлений распространенной тенденцией являются программы « Просто еще один хакер Perl » (JAPH), разработанные Рэндалом Л. Шварцем , одним из первых профессиональных инструкторов Perl. Выражаясь языком Perl-культуры, Perl-программисты известны как Perl-хакеры, и отсюда появилась практика написания коротких программ для печати фразы «Просто еще один Perl-хакер». В духе первоначальной концепции эти программы умеренно запутаны и достаточно короткие, чтобы поместиться в подпись электронного письма или сообщения Usenet. «Канонический» JAPH, разработанный Шварцем, включает запятую в конце, хотя ее часто опускают.
Perl гольф
Perl «гольф» - это времяпрепровождение, заключающееся в сокращении количества символов (клавишных «штрихов»), используемых в Perl-программе, до минимума, почти так же, как игроки в гольф стремятся сделать как можно меньше выстрелов за раунд. Первое использование этой фразы подчеркнуло разницу между обычным кодом, предназначенным для обучения новичка, и краткими хаками, которые могут развлечь опытных программистов Perl, примером которых являются JAPH , которые уже использовались в подписях в сообщениях Usenet и в других местах. Подобные трюки были неназванным времяпрепровождением на языке APL в предыдущие десятилетия. Использование Perl для написания программы, выполняющей шифрование RSA, вызвало широкий практический интерес к этому занятию. В последующие годы термин « кодовый гольф » стал применяться к времяпрепровождению на других языках. Perl Golf Apocalypse проходил на Perl Conference 4.0 в Монтерее, Калифорния, в июле 2000 года.
Обфускация
Как и в случае с C, соревнования по запутанному коду были широко известным развлечением в конце 1990-х годов. Конкурс « Обфусцированный Perl» - это конкурс, проводившийся журналом Perl Journal с 1996 по 2000 год, который стал главным достоинством синтаксической гибкости Perl. Награды присуждались за такие категории, как «самые мощные» - программы, эффективно использующие пространство, - и «лучшая четырехстрочная подпись» за программы, которые умещаются в четыре строки по 76 символов в стиле блока подписи Usenet .
Поэзия
Поэзия Perl - это практика написания стихов, которые могут быть скомпилированы как юридический код Perl, например, произведение, известное как Black Perl . Поэзия Perl стала возможной благодаря большому количеству английских слов, которые используются в языке Perl. Новые стихи регулярно отправляются сообществу PerlMonks .

Perl в IRC

Существует ряд каналов IRC, которые предлагают поддержку языка и некоторых модулей.

Сеть IRC каналы
irc.libera.chat #perl #raku
irc.perl.org #moose #poe #catalyst # dbix-class # perl-help #distzilla #epo #corehackers #sdl # win32 #toolchain #padre #dancer
irc.slashnet.org #perlmonks
irc.oftc.net #perl
irc.efnet.net #perlhelp
irc.rizon.net #perl
irc.debian.org # debian-perl (упаковка модулей Perl для Debian)

CPAN Acme

Также есть много примеров кода, написанного исключительно для развлечения на CPAN . Lingua::Romana::Perligata, например, позволяет писать программы на латыни . После выполнения такой программы модуль переводит ее исходный код в обычный Perl и запускает его.

Сообщество Perl выделило пространство имен « Acme » для модулей, которые по своей природе забавны (но его объем расширился, включив исследовательский или экспериментальный код или любой другой модуль, который никогда не предназначен для использования в производстве). Некоторые модули Acme намеренно реализованы забавными способами. Сюда входит Acme::Bleachодин из первых модулей в Acme::пространстве имен, который позволяет «осветлить» исходный код программы (то есть все символы заменять пробелами) и при этом по-прежнему работать.

Пример кода

В более старых версиях Perl программу Hello World можно было бы написать как:

print "Hello, World!\n";

Вот более сложная программа на Perl, которая отсчитывает секунды от заданного начального значения:

#!/usr/bin/perl
use strict;
use warnings;

my ( $remaining, $total );

$remaining = $total = shift(@ARGV);

STDOUT->autoflush(1);

while ( $remaining ) {
    printf ( "Remaining %s/%s \r", $remaining--, $total );
    sleep 1;
}

print "\n";

Интерпретатор Perl также можно использовать для разовых сценариев в командной строке. В следующем примере (вызванном из sh-совместимой оболочки, такой как Bash) строка «Bob» во всех файлах, оканчивающихся на .txt в текущем каталоге, преобразуется в «Robert»:

$ perl -i.bak -lp -e 's/Bob/Robert/g' *.txt

Критика

Критики называли Perl « линейным шумом » и языком только для записи . Самое раннее такое упоминание было в первом издании книги Learning Perl , учебного пособия по Perl 4, написанного Рэндалом Л. Шварцем , в первой главе которого он заявляет: «Да, иногда Perl выглядит как линейный шум для непосвященных, но для опытного программиста на Perl это выглядит как линейный шум с контрольной суммой с жизненной миссией ". Он также заявил, что обвинения в том, что Perl является языком, предназначенным только для записи, можно избежать, если кодировать с «должной осторожностью». В обзорном документе Perl perlintro говорится, что имена встроенных «магических» скалярных переменных «выглядят как знаки препинания или линейный шум». Тем не менее, модуль английского языка предлагает как длинные, так и короткие варианты английского языка. В документе perlstyle говорится, что линейный шум в регулярных выражениях можно уменьшить с помощью /xмодификатора для добавления пробелов.

Согласно Perl 6 FAQ , Perl 6 был разработан для смягчения «обычных подозрений», которые вызывают утверждение «линейного шума» от критиков Perl 5, включая удаление «большинства переменных пунктуации» и санацию синтаксиса регулярных выражений. . В FAQ Perl 6 также говорится, что то, что иногда называют строковым шумом Perl, является «фактическим синтаксисом языка», так же как герундий и предлоги являются частью английского языка . В публикации в блоге в декабре 2012 года, несмотря на утверждение, что «Rakudo Perl 6 потерпел неудачу и будет продолжать терпеть неудачу, если не получит некоторого контроля со стороны взрослых», хроматик заявил, что дизайн Perl 6 имеет «четко определенную грамматику», а также « улучшенная система типов, унифицированная объектная система с интеллектуальной метамоделью, метаоператорами и более четкая система контекста, обеспечивающая такие тонкости, как повсеместная лень ». Он также заявил, что «Perl 6 обладает согласованностью и согласованностью, которых не хватает Perl 5».

Смотрите также

использованная литература

дальнейшее чтение

внешние ссылки