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