Perl — это интерпретируемый динамический язык программирования высокого уровня общего назначения . Хотя Perl официально не является аббревиатурой, [9] используются различные обратные названия , в том числе «Язык практического извлечения и отчетности». [10]
Perl был разработан Ларри Уоллом в 1987 году [11] как язык сценариев общего назначения для Unix , упрощающий обработку отчетов. [12] [11] [13] С тех пор он претерпел множество изменений и доработок. Первоначально Perl не писался с заглавной буквы, и к моменту выпуска Perl 4 имя было изменено на заглавную. [13] Последней версией является Perl 5, впервые выпущенная в 1994 году. С 2000 по октябрь 2019 года в разработке находилась шестая версия Perl, прежде чем название последней было официально изменено на Raku . [14] [15] Оба языка продолжают разрабатываться независимо разными командами разработчиков, которые щедро заимствуют идеи друг у друга.
Perl заимствует функции из других языков программирования, включая C , sh , AWK и sed . [1] Он предоставляет средства обработки текста без произвольных ограничений длины данных, присущих многим современным инструментам командной строки Unix . [16] Perl — очень выразительный язык программирования: исходный код для данного алгоритма может быть коротким и легко сжимаемым. [17] [18]
Perl приобрел широкую популярность в середине 1990-х годов как язык сценариев CGI , отчасти благодаря своим мощным возможностям регулярного выражения и анализа строк . [19] [20] [21] [22] Помимо CGI, Perl 5 используется для системного администрирования , сетевого программирования , финансов, биоинформатики и других приложений, например для графических интерфейсов . Его прозвали «бензопилой скриптовых языков швейцарской армии» из-за его гибкости и мощности. [23] В 1998 году его также называли « клейкой лентой , которая скрепляет Интернет », имея в виду как его повсеместное использование в качестве связующего языка , так и его воспринимаемую неэлегантность. [24]
Первоначально Perl назывался «Жемчуг». Уолл хотел дать языку короткое название с положительным подтекстом. Это также христианская отсылка к притче о жемчужине из Евангелия от Матфея. [11] [25] Однако Уолл обнаружил существующий язык программирования PEARL до официального выпуска Perl, изменил написание имени и исключил букву «а» из названия. [26] [11]
Название иногда расширяется за счет бэкронима : « Practical Extraction and Report Language» [27] и собственного «Pathologically Eclectic Rubbish Lister» Уолла , который находится на странице руководства по Perl. [28]
Книга Programming Perl , изданная O'Reilly Media , имеет на обложке изображение верблюда и обычно называется «Верблюжьей книгой». [29] Это изображение стало неофициальным символом Perl, а также общей хакерской эмблемой, появляющейся на футболках и других предметах одежды. [ нужна цитата ] О'Рейли владеет изображением как товарным знаком , но лицензирует его для некоммерческого использования, требуя только подтверждения и ссылки на www.perl.com. Вопрос о лицензировании коммерческого использования решается в каждом конкретном случае. [30] О'Рейли также предоставляет логотипы «Programming Republic of Perl» для некоммерческих сайтов и кнопки «Powered by Perl» для всех сайтов, использующих Perl. [30]
Фонд Perl владеет альтернативным символом — луком, лицензию на который он предоставляет своим дочерним компаниям Perl Mongers , PerlMonks , Perl.org и другим. [31] Символ представляет собой визуальную игру слов на жемчужном луке . [32]
Себастьян Ридель, создатель Mojolicious , создал логотип с изображением динозавра-хищника , который доступен по лицензии CC-SA, версия 4.0. [33] Аналог хищника взят из серии выступлений Мэтта С. Траута, начавшихся в 2010 году. [34]
Ларри Уолл начал работать над Perl в 1987 году, когда работал программистом в Unisys ; [16] он выпустил версию 1.0 18 декабря 1987 года. [1]
[11] Ранний язык Perl , на котором основывался Уолл, заключался в использовании существующих языков, которые помогали манипулировать текстом. [11]
Perl 2, выпущенный в июне 1988 года, [35] [36] отличался улучшенным движком регулярных выражений. В Perl 3, выпущенном в октябре 1989 года, [35] добавлена поддержка потоков двоичных данных . [37]
Первоначально единственной документацией по Perl была одна длинная справочная страница . В 1991 году была опубликована книга «Программирование Perl» , известная многим программистам Perl как «Верблюжья книга» из-за ее обложки, которая стала фактическим справочником по языку. [38] В то же время номер версии Perl был увеличен до 4, но не для того, чтобы обозначить серьезное изменение в языке, а для того, чтобы определить версию, которая была хорошо документирована в книге. [39] Perl 4 был выпущен в марте 1991 года. [35]
Perl 4 прошел через серию выпусков сопровождения , кульминацией которых стал Perl 4.036 в 1993 году, после чего Уолл отказался от Perl 4, чтобы начать работу над Perl 5. Первоначальная разработка Perl 5 продолжалась и в 1994 году. В мае 1994 года был создан список рассылки perl5-porters , чтобы координировать работу по портированию Perl 5 на разные платформы. Он остается основным форумом для разработки, обслуживания и портирования Perl 5. [40]
Perl 5.000 был выпущен 17 октября 1994 года. [41] Это была почти полная переработка интерпретатора , в которую было добавлено множество новых функций, включая объекты , ссылки , лексические (мои) переменные и модули . Важно отметить, что модули предоставляли механизм расширения языка без изменения интерпретатора. Это позволило базовому интерпретатору стабилизироваться, в то же время позволяя обычным программистам Perl добавлять новые возможности языка. С тех пор Perl 5 находится в активной разработке.
Perl 5.001 был выпущен 13 марта 1995 года. Perl 5.002 был выпущен 29 февраля 1996 года с новой функцией прототипов. Это позволило авторам модулей создавать подпрограммы , которые вели себя как встроенные функции Perl . Perl 5.003 был выпущен 25 июня 1996 года как версия безопасности. [42]
Одно из самых важных событий в истории Perl 5 произошло за пределами собственно языка и стало следствием поддержки его модулей. 26 октября 1995 года была создана Комплексная сеть архивов Perl (CPAN) как хранилище языка Perl и модулей Perl ; по состоянию на декабрь 2022 года [обновлять]он содержит более 211 850 модулей в 43 865 дистрибутивах, написанных более чем 14 324 авторами, и зеркально отображается по всему миру в более чем 245 местах. [43]
Perl 5.004 был выпущен 15 мая 1997 года и включал, среди прочего, пакет UNIVERSAL, предоставлявший Perl базовый объект, из которого автоматически производились все классы , и возможность запрашивать версии модулей. Еще одним важным событием стало включение модуля CGI.pm , [44] который способствовал популярности Perl как языка сценариев CGI . [45]
В Perl 5.004 добавлена поддержка Microsoft Windows , Plan 9 , QNX и AmigaOS . [44]
Perl 5.005 был выпущен 22 июля 1998 года. Этот выпуск включал в себя несколько усовершенствований механизма регулярных выражений , новые перехваты в серверной части через B::*
модули, qr//
оператор кавычки регулярного выражения, большой выбор других новых основных модулей и добавленную поддержку еще нескольких операционных системы, включая BeOS . [46]
Perl 5.6 был выпущен 22 марта 2000 года. Основные изменения включали поддержку 64-битности , строковое представление Unicode , поддержку файлов размером более 2 ГиБ и ключевое слово «our». [48] [49] При разработке Perl 5.6 было принято решение переключить схему управления версиями на более похожую на другие проекты с открытым исходным кодом; после 5.005_63 следующей версией стала 5.5.640, при этом планируется, что версии для разработки будут иметь нечетные номера, а стабильные версии - четные. [50]
В 2000 году Уолл призвал сообщество предложить предложения по новой версии Perl. В результате этого процесса был создан 361 документ RFC (запрос на комментарии), которые должны были использоваться при разработке Perl 6. В 2001 году [51] началась работа над «Апокалипсисами» для Perl 6, серией документов, призванных обобщить изменения. запросы и представить дизайн следующего поколения Perl. Они были представлены как сборник RFC, а не как формальный документ. На тот момент Perl 6 существовал только как описание языка. [ нужна цитата ]
Perl 5.8 был впервые выпущен 18 июля 2002 года, и с тех пор последующие версии 5.X выпускались примерно ежегодно. В Perl 5.8 улучшена поддержка Unicode, добавлена новая реализация ввода-вывода, добавлена новая реализация потоков, улучшена числовая точность и добавлено несколько новых модулей. [52] По состоянию на 2013 год эта версия по-прежнему оставалась самой популярной версией Perl и использовалась Red Hat 5, Suse 10, Solaris 10, HP-UX 11.31 и AIX 5.
В 2004 году началась работа над «Синопсисами» — документами, которые первоначально суммировали Апокалипсисы, но стали спецификацией языка Perl 6. В феврале 2005 года Одри Танг начала работу над Pugs , интерпретатором Perl 6, написанным на Haskell . [53] Это была первая совместная попытка сделать Perl 6 реальностью. Эти усилия застопорились в 2006 году. [54]
PONIE — это аббревиатура от Perl On New Internal Engine. Проект PONIE существовал с 2003 по 2006 год и должен был стать мостом между Perl 5 и Perl 6. Это была попытка переписать интерпретатор Perl 5 для работы на Parrot , виртуальной машине Perl 6. Целью было обеспечить будущее миллионов строк кода Perl 5 в тысячах компаний по всему миру. [55] Проект PONIE завершился в 2006 году и больше не развивается активно. Некоторые улучшения, внесенные в интерпретатор Perl 5 как часть PONIE, были включены в этот проект. [56]
18 декабря 2007 г., в день 20-летия Perl 1.0, был выпущен Perl 5.10.0. Perl 5.10.0 включал в себя заметные новые функции, приближающие его к Perl 6. К ним относятся оператор переключения (называемый «given»/«when»), обновления регулярных выражений и оператор интеллектуального сопоставления (~~). [57] [58] Примерно в это же время началась серьезная разработка другой реализации 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. [59]
14 мая 2011 г. был выпущен Perl 5.14 со встроенной поддержкой JSON . [60]
20 мая 2012 г. был выпущен Perl 5.16. Примечательные новые функции включают возможность указать конкретную версию Perl, которую нужно эмулировать, что позволяет пользователям обновлять свою версию Perl, но при этом запускать старые сценарии, которые обычно были бы несовместимы. [61] [ не удалось проверить ] Perl 5.16 также обновляет ядро для поддержки Unicode 6.1. [61]
18 мая 2013 г. был выпущен Perl 5.18. Примечательные новые функции включают новые перехватчики dtrace, лексические подпрограммы, дополнительные подпрограммы CORE::, пересмотр хеша по соображениям безопасности, поддержку Unicode 6.2. [62]
27 мая 2014 г. был выпущен Perl 5.20. В число заметных новых функций входят сигнатуры подпрограмм, синтаксис хэш-срезов/новых срезов, постфиксное разыменование (экспериментальное), Unicode 6.3 и функция rand(), использующая согласованный генератор случайных чисел. [63]
Некоторые наблюдатели считают, что выпуск Perl 5.10 положил начало движению Modern Perl. [64] В частности, эта фраза описывает стиль разработки, который включает использование CPAN, использует преимущества последних разработок в языке и строго относится к созданию высококачественного кода. [65] Хотя книга «Современный Perl» [66] может быть наиболее заметным знаменосцем этой идеи, другие группы, такие как Enlightened Perl Organization [67], подхватили это дело.
В конце 2012 и 2013 годов стартовало несколько проектов альтернативных реализаций Perl 5: Perl5 в Perl6 от команды Rakudo Perl, [68] moe от Стивена Литтла и его друзей, [69] p2 [70] от команды Perl11 под руководством Рейни Урбана, gperl от goccy, [71] и rperl — проект Kickstarter, возглавляемый Уиллом Брасвеллом и связанный с проектом Perll11. [72]
На конференции Perl 2000 года Джон Орвант выступил за крупную инициативу в области нового языка. [74] Это привело к решению начать работу над редизайном языка, который будет называться Perl 6. Предложения по новым функциям языка были запрошены от сообщества Perl в целом, которое представило более 300 RFC . [75]
Следующие несколько лет Уолл провел, перерабатывая RFC и синтезируя их в последовательную структуру для Perl 6. Он представил свой проект Perl 6 в серии документов, названных «апокалипсисами», пронумерованных в соответствии с главами в книге «Программирование на Perl ». По состоянию на январь 2011 года [обновлять]разрабатываемая спецификация Perl 6 была инкапсулирована в проектные документы под названием Synopses, пронумерованные в соответствии с Апокалипсисами. [76]
В диссертационной работе Брэдли М. Куна под руководством Уолла рассматривалось возможное использование виртуальной машины Java в качестве среды выполнения Perl. [77] Диссертация Куна показала, что этот подход проблематичен. В 2001 году было решено, что Perl 6 будет работать на межъязыковой виртуальной машине под названием Parrot . Это будет означать, что другие языки, ориентированные на Parrot, получат собственный доступ к CPAN , что позволит осуществлять некоторый уровень межъязыковой разработки. [ нужна цитата ]
В 2005 году Одри Танг создала проект Pugs — реализацию Perl 6 на Haskell . Он служил и продолжает выступать в качестве тестовой платформы для языка Perl 6 (отдельно от разработки фактической реализации), позволяя разработчикам языка исследовать его. Проект Pugs породил активное межъязыковое сообщество Perl/Haskell, сосредоточенное вокруг IRC-канала Libera Chat #raku. Многие влияния функционального программирования были учтены командой разработчиков Perl 6. [78]
В 2012 году разработка Perl 6 была сосредоточена в основном на двух компиляторах: [79]
В 2013 году была анонсирована MoarVM («Метамодель во время выполнения»), виртуальная машина на основе языка C, разработанная в первую очередь для Rakudo. [81]
В октябре 2019 года Perl 6 был переименован в Raku. [82]
По состоянию на 2017 год [обновлять]только реализация Rakudo и MoarVM находятся в активной разработке, поддерживаются и другие виртуальные машины, такие как виртуальная машина Java и JavaScript . [83]
В июне 2020 года Perl 7 был объявлен преемником Perl 5. [84] Первоначально Perl 7 должен был быть основан на Perl 5.32, выпуск которого ожидался в первой половине 2021 года, а кандидаты будут выпущены раньше. [85]
Этот план был пересмотрен в мае 2021 года без указания сроков выпуска или версии Perl 5 для использования в качестве базовой версии. [86] Когда выйдет Perl 7, Perl 5 перейдет на долгосрочную поддержку. Однако поддерживаемые версии Perl 5 по-прежнему будут получать важные исправления безопасности и ошибок. [87]
Perl 7 был анонсирован 24 июня 2020 года на «The Perl Conference in the Cloud» как преемник Perl 5. [85] [84] На основе Perl 5.32 планировалось, что Perl 7 будет обратно совместим с современным кодом Perl 5; Код Perl 5 без шаблонного заголовка (прагмы) требует добавления use compat::perl5;
, чтобы оставаться совместимым, но современный код может отказаться от части шаблонного заголовка.
Однако план перехода на Perl 7 вызвал дальнейшее обсуждение, и руководящий комитет Perl отменил его, чтобы избежать проблем с обратной совместимостью для сценариев, которые не были написаны для прагм и модулей, которые станут стандартными в Perl 7. Perl 7 будет выйдет только тогда, когда разработчики добавят достаточно функций, чтобы гарантировать основное обновление выпуска. [88]
По словам Уолла, у Perl есть два лозунга. Первый — «Есть несколько способов сделать это», широко известный как TMTOWTDI (произносится как Тим Тоади ). Как утверждают сторонники этого девиза, эта философия позволяет легко писать краткие заявления. [89] [90] [91]
Второй лозунг: «Легкие вещи должны быть легкими, а сложные — возможными». [16]
Разработку Perl можно рассматривать как ответ на три основные тенденции в компьютерной индустрии: снижение стоимости аппаратного обеспечения, рост затрат на рабочую силу и усовершенствование технологии компиляторов . Многие ранние компьютерные языки, такие как Фортран и Си, были направлены на эффективное использование дорогостоящего компьютерного оборудования. Напротив, Perl был разработан для того, чтобы программисты могли писать программы быстрее и проще. [92]
Perl имеет множество функций, которые облегчают задачу программиста за счет увеличения требований к процессору и памяти. К ним относятся автоматическое управление памятью; динамическая типизация ; строки, списки и хеши; обычные выражения; самоанализ ; и eval()
функция. Perl следует теории «отсутствия встроенных ограничений» [29] — идее, похожей на правило «Ноль-один-бесконечность» . [ нужна цитата ]
Уолл получил лингвистическое образование, и дизайн Perl во многом основан на лингвистических принципах. Примеры включают кодирование Хаффмана (общие конструкции должны быть короткими), хорошее взвешивание концов (важная информация должна идти на первом месте) и большую коллекцию языковых примитивов . Perl предпочитает языковые конструкции, которые являются краткими и естественными для написания людьми, даже если они усложняют интерпретатор Perl. [93]
Синтаксис Perl отражает идею о том, что «различные вещи должны выглядеть по-разному». [94] Например, скаляры, массивы и хеши имеют разные ведущие символы. Индексы массивов и хэш-ключи используют разные виды фигурных скобок. Строки и регулярные выражения имеют разные стандартные разделители. Этот подход можно противопоставить такому языку, как Lisp , где для всех целей используется один и тот же базовый синтаксис, состоящий из простых и универсальных символических выражений . [ нужна цитата ]
Существует широкий практический подход как к языку Perl, так и к сообществу и культуре, которые его окружают. Предисловие к книге «Программирование на Perl» начинается со слов: «Perl — это язык для выполнения вашей работы». [16] Одним из последствий этого является то, что Perl не является аккуратным языком. Он включает в себя множество функций, допускает исключения из своих правил и использует эвристику для разрешения синтаксической неоднозначности. Из-за снисходительности компилятора иногда бывает трудно найти ошибки. В документации по функциям Perl о вариативном поведении встроенных функций в списочном и скалярном контекстах говорится: «В общем, они делают то, что вы хотите, если только вам не нужна согласованность». [95]
Общая структура Perl во многом заимствована из C. Perl является процедурным по своей природе, с переменными , выражениями , операторами присваивания , блоками, разделенными фигурными скобками , управляющими структурами и подпрограммами . [96]
Perl также использует возможности программирования оболочки. Все переменные отмечены ведущими знаками , которые позволяют интерполировать переменные непосредственно в строки . Однако, в отличие от оболочки, Perl использует знаки при каждом доступе к переменным, и в отличие от большинства других языков программирования, использующих знаки, знак обозначает не тип переменной, а тип выражения. Так, например, хотя массив обозначается знаком «@» (например, @arrayname
), отдельный член массива обозначается скалярным знаком «$» (например, $arrayname[3]
). Perl также имеет множество встроенных функций, которые предоставляют инструменты, часто используемые в программировании оболочки (хотя многие из этих инструментов реализованы программами, внешними по отношению к оболочке), такие как сортировка и вызов средств операционной системы . [ нужна цитата ]
Perl берет хеши («ассоциативные массивы») из AWK и регулярные выражения из sed . Это упрощает многие задачи синтаксического анализа, обработки текста и управления данными. В Лиспе общим является неявный возврат последнего значения в блоке, а все операторы также являются выражениями, которые сами по себе могут использоваться в более крупных выражениях. [ нужна цитата ]
В Perl 5 добавлены функции, поддерживающие сложные структуры данных , первоклассные функции (то есть замыкания как значения) и модель объектно-ориентированного программирования. К ним относятся ссылки , пакеты, диспетчеризация методов на основе классов и переменные с лексической областью , а также директивы компилятора (например, strict
pragma ). Основной дополнительной функцией, представленной в Perl 5, была возможность упаковывать код в виде повторно используемых модулей. Позже Уолл заявил, что «вся цель системы модулей Perl 5 заключалась в том, чтобы стимулировать рост культуры Perl, а не ядра Perl». [97]
Все версии Perl осуществляют автоматический ввод данных и автоматическое управление памятью . Интерпретатор знает тип и требования к хранению каждого объекта данных в программе; он выделяет и освобождает для них память по мере необходимости, используя подсчет ссылок (поэтому он не может освободить циклические структуры данных без ручного вмешательства). Преобразования допустимых типов — например, преобразования числа в строку — выполняются автоматически во время выполнения ; Незаконные преобразования типов являются фатальными ошибками. [ нужна цитата ]
Критики называли Perl «линейным шумом» и языком, предназначенным только для записи. Самое раннее такое упоминание было в первом издании книги « Изучение Perl» , учебника по Perl 4, написанного Рэндалом Л. Шварцем , [98] в первой главе которой он утверждает: «Да, иногда Perl выглядит для пользователя как линейный шум». для непосвященного, но для опытного Perl-программиста это выглядит как шум контрольной суммы с жизненной миссией». [99] Он также заявил, что обвинения в том, что Perl является языком, предназначенным только для записи, можно избежать, если программировать с «должной осторожностью». [99] В обзорном документе Perl perlintro говорится, что имена встроенных «магических» скалярных переменных «выглядят как знаки препинания или строковый шум». [100] Тем не менее, английский модуль предоставляет как длинные, так и краткие варианты английского языка. В документе perlstyle указано, что строковый шум в регулярных выражениях можно уменьшить с помощью /x
модификатора для добавления пробелов. [101]
Согласно FAQ по Perl 6 , Perl 6 был разработан для устранения «обычных подозреваемых», вызывающих претензии критиков Perl 5 о «строчном шуме», включая удаление «большинства переменных пунктуации» и очистку синтаксиса регулярных выражений. . [102] В FAQ по Perl 6 также говорится, что то, что иногда называют линейным шумом Perl, является «действительным синтаксисом языка», точно так же, как герундий и предлоги являются частью английского языка . [102] В сообщении в блоге за декабрь 2012 года, несмотря на утверждение, что «Rakudo Perl 6 потерпел неудачу и будет продолжать давать сбои, если не получит некоторого контроля со стороны взрослых», chromatic заявил, что дизайн Perl 6 также имеет «четко определенную грамматику». как «улучшенная система типов, унифицированная объектная система с интеллектуальной метамоделью, метаоператорами и более четкой системой контекста, которая обеспечивает такие тонкости, как всепроникающая лень». [103] Он также заявил, что «Perl 6 обладает связностью и последовательностью, которых нет в Perl 5». [103]
В старых версиях Perl программу Hello World можно было бы написать так:
напечатайте «Привет, мир!\n» ;
Вот более сложная программа на Perl, которая отсчитывает секунды от заданного начального значения:
#!/usr/bin/perl use strict ; использовать предупреждения ; мой ( $оставшийся , $итого ); $remaining = $total = сдвиг ( @ARGV ); STDOUT -> автосброс ( 1 );while ( $remaining ) { printf ( "Осталось %s/%s \r" , $remaining -- , $total ); спать 1 ; } напечатайте "\n" ;
Интерпретатор Perl также можно использовать для одноразовых сценариев в командной строке. Следующий пример (вызываемый из sh-совместимой оболочки, такой как Bash ) преобразует строку «Bob» во всех файлах, оканчивающихся на .txt в текущем каталоге, в «Robert»:
$ perl -i.bak -lp -e 's/Bob/Robert/g' *.txt
Для версий Perl до Perl 5 не существует письменной спецификации или стандарта языка Perl, и не планируется создавать такую спецификацию для текущей версии Perl. Была только одна реализация интерпретатора, и язык развивался вместе с ней. Этот интерпретатор вместе со своими функциональными тестами фактически является спецификацией языка. Perl 6, однако, начался со спецификации [104] , и несколько проектов [105] нацелены на реализацию части или всей спецификации. [ нужна цитата ]
Perl реализован как основной интерпретатор, написанный на C, вместе с большой коллекцией модулей, написанных на Perl и C. По состоянию на 2010 год [обновлять]интерпретатор представляет собой 150 000 строк кода C и компилируется в исполняемый файл размером 1 МБ на типичных машинных архитектурах. Альтернативно интерпретатор можно скомпилировать в библиотеку ссылок и встроить в другие программы. В дистрибутив входит около 500 модулей, содержащих 200 000 строк Perl и еще 350 000 строк кода C (большая часть кода C в модулях состоит из таблиц кодировки символов ). [ нужна цитата ]
Интерпретатор имеет объектно-ориентированную архитектуру. Все элементы языка Perl — скаляры, массивы, хеши, ссылки на коды, дескрипторы файлов — представлены в интерпретаторе структурами C. Операции над этими структурами определяются большой коллекцией макросов , определений типов и функций; они составляют Perl C API . API Perl может сбить с толку непосвященных, но его точки входа следуют последовательной схеме именования , которая обеспечивает руководство для тех, кто его использует. [ нужна цитата ]
Жизнь интерпретатора Perl в общих чертах делится на этап компиляции и этап выполнения. [106] В Perl фазы — это основные этапы жизненного цикла интерпретатора. Каждый переводчик проходит каждый этап только один раз, и эти этапы следуют в фиксированной последовательности. [ нужна цитата ]
Большая часть того, что происходит на этапе компиляции Perl, — это компиляция, а большая часть того, что происходит на этапе выполнения Perl, — это выполнение, но есть существенные исключения. Perl активно использует свою способность выполнять код Perl на этапе компиляции. Perl также задержит компиляцию на этапе выполнения. Термины, обозначающие тип обработки, которая фактически происходит в любой момент, — это время компиляции и время выполнения . Perl находится во время компиляции в большинстве моментов фазы компиляции, но время компиляции также может быть введено во время фазы выполнения. Время компиляции кода в строковом аргументе, передаваемом во eval
встроенную функцию, происходит на этапе выполнения. Perl часто находится в режиме выполнения на этапе компиляции и проводит большую часть этапа выполнения во время выполнения. Код в BEGIN
блоках выполняется во время выполнения, но на этапе компиляции.
Во время компиляции интерпретатор анализирует код Perl в синтаксическое дерево . Во время выполнения он выполняет программу, обходя дерево . Текст анализируется только один раз, а синтаксическое дерево подвергается оптимизации перед выполнением, поэтому выполнение является относительно эффективным. Оптимизация синтаксического дерева во время компиляции включает в себя свертывание констант и распространение контекста, но также выполняется оптимизация «глазка» . [107]
Perl имеет полную по Тьюрингу грамматику , поскольку на синтаксический анализ может влиять код времени выполнения, выполняемый на этапе компиляции. [108] Следовательно, Perl невозможно проанализировать с помощью прямой комбинации лексера / парсера Lex / Yacc . Вместо этого интерпретатор реализует свой собственный лексер, который координирует свои действия с модифицированным парсером GNU bison для разрешения неоднозначностей в языке. [ нужна цитата ]
Часто говорят, что «Только Perl может анализировать Perl», [109] имея в виду, что только интерпретатор Perl ( perl
) может анализировать язык Perl ( Perl ), но даже это, в общем, не так. Поскольку интерпретатор Perl может моделировать машину Тьюринга на этапе компиляции, ему необходимо будет решить проблему остановки , чтобы завершить синтаксический анализ в каждом случае. Давний результат состоит в том, что проблема остановки неразрешима, и поэтому даже Perl не всегда может его проанализировать. Perl делает необычный выбор, предоставляя пользователю доступ ко всем возможностям программирования на собственной стадии компиляции. Стоимость с точки зрения теоретической чистоты высока, но практические неудобства кажутся редкими. [110]
Другим программам, которые берутся за анализ Perl, таким как анализаторы исходного кода и автоиндентеры , приходится сталкиваться не только с неоднозначными синтаксическими конструкциями , но и с неразрешимостью синтаксического анализа Perl в общем случае. Проект PPI Адама Кеннеди был сосредоточен на анализе кода Perl как документа (с сохранением его целостности как документа), а не на анализе Perl как исполняемого кода (что не всегда может сделать даже сам Perl). Именно Кеннеди первым предположил, что «анализ Perl страдает от «проблемы остановки»» [111] , что позже было доказано. [112]
Perl распространяется с более чем 250 000 функциональными тестами для основного языка Perl и более 250 000 функциональными тестами для основных модулей. Они выполняются как часть обычного процесса сборки и активно проверяют интерпретатор и его основные модули. Разработчики Perl полагаются на функциональные тесты, чтобы гарантировать, что изменения в интерпретаторе не приведут к ошибкам в программном обеспечении ; кроме того, пользователи Perl, которые видят, что интерпретатор проходит функциональные тесты в их системе, могут иметь высокую степень уверенности в том, что он работает правильно. [ нужна цитата ]
Perl имеет двойную лицензию : Artistic License 1.0 [5] [6] и GNU General Public License . [7] Дистрибутивы доступны для большинства операционных систем . Он особенно распространен в Unix и Unix-подобных системах, но был перенесен на большинство современных (и многие устаревшие) платформы. Имея только шесть зарегистрированных исключений , Perl может быть скомпилирован из исходного кода на всех POSIX- совместимых или иным образом совместимых с Unix платформах. [113]
Из-за необычных изменений, необходимых для классической среды Mac OS , отдельный порт под названием MacPerl был выпущен отдельно. [114]
Комплексная сеть архивов Perl содержит полный список поддерживаемых платформ со ссылками на дистрибутивы, доступные на каждой. [115] CPAN также является источником общедоступных модулей Perl, которые не являются частью основного дистрибутива Perl. [ нужна цитата ]
ActivePerl — это дистрибутив с закрытым исходным кодом от ActiveState , который имеет регулярные выпуски, отслеживающие основные выпуски Perl. [116] Ранее в состав дистрибутива входил менеджер пакетов Perl (PPM), [117] популярный инструмент для установки, удаления, обновления и управления использованием распространенных модулей Perl; однако поддержка этого инструмента была прекращена начиная с версии ActivePerl 5.28. [118] Включен также PerlScript , механизм Windows Script Host (WSH), реализующий язык Perl. Visual Perl — это инструмент ActiveState, который добавляет Perl в пакет разработки Visual Studio .NET. Конвертер VBScript -to-Perl, а также компилятор Perl для Windows и конвертеры awk и sed в Perl также были произведены этой компанией и включены в компакт-диск ActiveState для Windows , который включает в себя все их дистрибутивы, а также Komodo . IDE и все, кроме первого варианта Unix/Linux/Posix в 2002 году и впоследствии. [119]
В игре Computer Language Benchmarks сравнивается производительность реализаций типичных задач программирования на нескольких языках программирования. [120] Представленные реализации Perl обычно работают в верхней части спектра использования памяти и дают различные результаты по скорости. Производительность Perl в тестах типична для интерпретируемых языков. [121]
Большие программы Perl запускаются медленнее, чем аналогичные программы на компилируемых языках, поскольку Perl приходится компилировать исходный код при каждом запуске. В своем выступлении на конференции YAPC::Europe 2005 и в последующей статье «Своевременное начало» Жан-Луи Лерой обнаружил, что его программы на Perl выполнялись гораздо дольше, чем ожидалось, потому что интерпретатор Perl тратил значительное время на поиск модулей в своих слишком больших включить путь. [122] В отличие от Java, Python и Ruby, Perl имеет только экспериментальную поддержку предварительной компиляции. [123] Таким образом, программы на Perl платят этот штраф при каждом выполнении. Фаза выполнения типичных программ достаточно продолжительна, поэтому амортизированное время запуска не является существенным, но тесты, измеряющие очень короткое время выполнения, вероятно, будут искажены из-за этих накладных расходов. [124]
Для улучшения этой ситуации был введен ряд инструментов. Первым таким инструментом был mod_perl от Apache , который стремился устранить одну из наиболее распространенных причин быстрого запуска небольших программ Perl: веб- разработку CGI . ActivePerl через Microsoft ISAPI обеспечивает аналогичные улучшения производительности. [125]
После компиляции кода Perl на этапе выполнения возникают дополнительные издержки, которых обычно нет в программах, написанных на компилируемых языках, таких как C или C++. Примеры таких накладных расходов включают интерпретацию байт-кода , управление памятью с подсчетом ссылок и динамическую проверку типов. [126]
Наиболее важные процедуры могут быть написаны на других языках (например, C ), которые можно подключить к Perl через простые модули Inline или более сложный, но гибкий механизм XS . [127]
Perl имеет множество разнообразных приложений, что усугубляется наличием множества стандартных и сторонних модулей.
Perl в основном использовался для написания сценариев CGI : крупные проекты, написанные на Perl, включают cPanel , Slash , Bugzilla , RT , TWiki и Movable Type ; Веб-сайты с высоким трафиком, широко использующие Perl, включают Priceline.com , Craigslist , [128] IMDb , [129] LiveJournal , DuckDuckGo , [130] [131] Slashdot и Ticketmaster . Это также дополнительный компонент популярного стека технологий LAMP для веб-разработки вместо PHP или Python . Perl широко используется в качестве языка системного программирования в дистрибутиве Debian Linux . [132]
Perl часто используется в качестве связующего языка , связывающего вместе системы и интерфейсы, которые не были специально разработаны для взаимодействия, а также для « обработки данных », [133] то есть преобразования или обработки больших объемов данных для таких задач, как создание отчетов. На самом деле эти сильные стороны тесно связаны между собой. Такое сочетание делает Perl популярным универсальным языком для системных администраторов , особенно потому, что короткие программы, часто называемые « однострочными программами », можно вводить и запускать в одной командной строке . [ нужна цитата ]
Код Perl можно сделать переносимым в Windows и Unix; такой код часто используется поставщиками программного обеспечения (как COTS , так и заказного) для упрощения упаковки и обслуживания сценариев сборки и развертывания программного обеспечения. [ нужна цитата ]
Perl/Tk и wxPerl обычно используются для добавления графических пользовательских интерфейсов к сценариям Perl.
Возможности Perl по обработке текста можно использовать для генерации запросов SQL ; массивы, хэши и автоматическое управление памятью упрощают сбор и обработку возвращаемых данных. Например, в интерфейсе прикладного программирования (API) Perl DBI Тима Банса аргументами API могут быть тексты SQL-запросов; таким образом, можно программировать на нескольких языках одновременно (например, для создания веб-страницы с использованием HTML , JavaScript и SQL в здесь документе ). Использование интерполяции переменных Perl для программной настройки каждого SQL-запроса, а также спецификация Perl-массивов или хэшей в качестве структур для программного хранения результирующих наборов данных из каждого SQL-запроса позволяет создать механизм высокого уровня для обработки больших объемов данных. для постобработки подпрограммой Perl. [134]
В ранних версиях Perl интерфейсы баз данных создавались путем повторного связывания интерпретатора с библиотекой базы данных на стороне клиента . Это было настолько сложно, что это было сделано только для нескольких наиболее важных и наиболее широко используемых баз данных, и это ограничивало получающийся исполняемый файл использованием только одного интерфейса базы данных одновременно. [135]perl
В Perl 5 интерфейсы базы данных реализованы модулями Perl DBI. Модуль DBI (интерфейс базы данных) представляет собой единый, независимый от базы данных интерфейс для приложений Perl, а модули DBD (драйвер базы данных) обрабатывают детали доступа примерно к 50 различным базам данных; для большинства баз данных ANSI SQL существуют драйверы DBD . [136]
DBI обеспечивает кэширование дескрипторов и запросов к базе данных, что может значительно повысить производительность в долгоживущих средах выполнения, таких как mod_perl , [137] помогая системам с большим объемом данных предотвращать скачки нагрузки, как в случае с эффектом Slashdot . [138]
В современных приложениях Perl, особенно написанных с использованием веб-фреймворков , таких как Catalyst , модуль DBI часто используется косвенно через объектно-реляционные преобразователи , такие как DBIx::Class , Class::DBI [139] или Rose::DB::Object [ 140] , которые генерируют SQL-запросы и обрабатывают данные прозрачно для автора приложения. [141]
Культура и сообщество Perl развивались вместе с самим языком. Usenet был первым общедоступным местом, где был представлен Perl, но в ходе его развития сообщество Perl формировалось под влиянием роста расширения интернет-сервисов, включая появление Всемирной паутины. Сообщество, окружающее Perl, фактически было темой первого доклада Уолла «Состояние луковицы». [142]
State of the Onion — это название ежегодных основных докладов Уолла о прогрессе Perl и его сообщества. Они характеризуются его характерным юмором, в котором используются отсылки к культуре Перла, более широкой хакерской культуре, языковому происхождению Уолла, иногда к его семейной жизни, а иногда даже к его христианскому происхождению. [143] Каждый доклад сначала проводится на различных конференциях по Perl, а затем также публикуется в Интернете.
В электронной почте, Usenet и сообщениях на досках объявлений распространенной тенденцией являются программы « Просто еще один хакер Perl » (JAPH), созданные Рэндалом Л. Шварцем , одним из первых профессиональных инструкторов Perl. [144] На языке Perl-культуры программисты Perl известны как Perl-хакеры, и отсюда возникла практика написания коротких программ для вывода на печать фразы «Просто еще один Perl-хакер». В духе оригинальной концепции эти программы умеренно запутаны и достаточно коротки, чтобы поместиться в подпись электронного письма или сообщения Usenet. «Канонический» JAPH, разработанный Шварцем, включает запятую в конце, хотя ее часто опускают. [145]
«Гольф» Perl — это развлечение, заключающееся в сокращении количества символов («нажатий клавиш»), используемых в программе Perl, до минимума, во многом аналогично тому, как игроки в гольф стремятся сделать как можно меньше ударов за раунд. Первое использование этой фразы [146] подчеркивало разницу между пешеходным кодом, предназначенным для обучения новичков, и краткими хаками, которые, вероятно, развлекут опытных программистов Perl, примером последнего являются JAPH , которые уже использовались в сигнатурах в сообщениях Usenet и других местах. Подобные трюки были безымянным развлечением на языке APL в предыдущие десятилетия. Использование Perl для написания программы, выполняющей шифрование RSA , вызвало широкий практический интерес к этому занятию. [147] В последующие годы термин « кодовый гольф » стал применяться к этому времяпрепровождению и на других языках. [148] Апокалипсис Perl Golf состоялся на Perl Conference 4.0 в Монтерее, Калифорния, в июле 2000 года.
Как и в случае с C, соревнования по запутанному коду были широко известным развлечением в конце 1990-х годов. Конкурс запутанного Perl — это конкурс, проводившийся The Perl Journal с 1996 по 2000 год, который сделал главным достоинством синтаксическую гибкость Perl. Награды были вручены в таких категориях, как «самые мощные» — программы, которые эффективно использовали пространство — и «лучшая четырехстрочная подпись» для программ, которые умещались в четыре строки по 76 символов в стиле блока подписи Usenet . [149]
Поэзия на Perl — это практика написания стихов, которые можно скомпилировать в виде легального кода Perl, например, фрагмента, известного как Black Perl . Поэзия Perl стала возможной благодаря большому количеству английских слов, используемых в языке Perl. Новые стихи регулярно представляются сообществу PerlMonks . [150]
У всех языковых дизайнеров время от времени случаются свои особенности. Просто у меня это получается лучше, чем у большинства.
«Perl» — это семейство языков, «Perl 6» — часть семейства, но это отдельный язык, имеющий собственную команду разработчиков. Его существование не оказывает существенного влияния на дальнейшее развитие «Perl 5».
В этом документе описаны шаги, которые необходимо предпринять для переименования Perl 6 в Raku.
Самой сильной стороной Perl являются чрезвычайно мощные встроенные средства для обработки текстовых, построчно-ориентированных форматов данных по шаблонам; в этом он непревзойден.
Perl всегда был подходящим языком для любых задач, требующих ввода с сопоставлением шаблонов.
Непревзойденная способность Perl обрабатывать текст...
Perl иногда называют «практическим языком извлечения и создания отчетов», хотя среди других расширений его также называют «патологически эклектичным списком мусора». На самом деле это бэкроним, а не аббревиатура, поскольку Ларри Уолл, создатель Perl, сначала придумал название, а потом расширение. Вот почему слово «Perl» не пишется заглавными буквами. Нет смысла спорить о правильности расширения: Ларри поддерживает и то, и другое.
Планируется, что обновление Perl 7 будет, но не сразу после выпуска 5.34.0.
... Мы не думаем, что сможем выпустить [Perl 7] за 12 месяцев.
... мы, похоже, не отказываемся абсолютно ни от чего. Никто никогда не был в состоянии показать практический недостаток
Perl довольно широко используется в Debian. На Perl написаны не только некоторые основные функции, но и более 700 нестабильных пакетов, в названии которых есть Perl (март 2004 г.).