Perl: почему отдельный компилятор "perl" и интерфейс "perlcc"? - PullRequest
2 голосов
/ 01 сентября 2010

Я пытаюсь сделать исполняемый файл из моего Perl-кода, и затем я понял, что такой опции нет в компиляторе perl.После небольшого поиска я нашел perlcc, который является внешним интерфейсом для компилятора perl и выполняет работу (создает двоичный файл).

Почему perl имеет отдельныйкомпилятор и интерфейс? Как, например, gcc для C / C ++ сам по себе является полным инструментом. Это так, как есть, или за этим есть веские причины?

Ответы [ 6 ]

7 голосов
/ 02 сентября 2010

Этот ответ был написан давно и не отражает текущее состояние. Я бы предпочел удалить этот ответ, но не могу, поскольку он принят. См. Ответ Рейни .


Для людей не свойственно компилировать Perl-программы в двоичный файл. Множество людей хотели бы это сделать, но это не совсем так. Что вы пытаетесь достичь? Может быть другой способ сделать то, что вы хотите сделать.

Программа Perl действительно выполняется в два этапа: время компиляции и время выполнения. Это тоже динамический язык, так что вы не можете сказать все, что вам нужно для компиляции в конце фазы компиляции, а во время фазы компиляции вам, возможно, придется запустить некоторый код.

В этом смысле Perl больше похож на Java или Ruby, чем на C. Когда вы запускаете Perl-программу, интерпретатор perl загружает весь исходный код и компилирует его в абстрактное синтаксическое дерево . Это тот байт-код, который perl выполняет (или интерпретирует ) во время выполнения. Это то же самое, что Java, Ruby и Python.

Одна из неприятностей Perl заключается в том, что у него нет хорошего способа сохранить результат этой компиляции, как в других языках. Это означает, что вы заканчиваете компиляцией исходного кода каждый раз. Есть несколько способов обойти это с помощью pperl и инструментами, специфичными для предметной области, такими как mod_perl или fastcgi.

Там есть несколько нечетких битов с BEGIN блоками, eval и т. Д., Но в основном это работает. Больше подробностей в perlmod .

Этой дизайнерской бородавки не было бы, если бы мы начали все сначала со всего, что мы знаем сейчас, и действительно, в Perl 6 ее нет. :)

5 голосов
/ 03 марта 2011

Я уверен, что вы имеете в виду пакет B :: C с perlcc, который шел с perl до 5.8.9.С тех пор я взял на себя разработку компилятора perl, который не улучшался с 1997 года, и исправил большинство оставшихся ошибок.

Почему в perl есть отдельный компилятор и внешний интерфейс?

Прежде всего (для остальных): perl является единственным официальным интерфейсом для perl, интерпретатором.

perlcc является интерфейсом для компиляторов B::C, B::Bytecode (-B)и B::CC (-O), часть компоновщика C также находится в cc_harness.

Никто на самом деле не хочет связываться с различными опциями для бэкэндов.Использовать perlcc намного проще.Например, gcc как драйвер для всех бэкэндов и промежуточных шагов.Для всех промежуточных шагов у gcc есть также разные исполняемые файлы: cc1, cc1plus, collect, as, ld

Вы хотите самостоятельно вызывать cc1?Я никогда не видел этого.

Достаточно ли это отвечает на ваш вопрос?

Кстати, в основном все ранее полученные ответы были полностью неправильными, и никто не отвечал на вопрос Лазера напрямую.

@ briandfoy: perlcc не мертвый инструмент, он постоянно развивается, а используется в производственном коде.Время запуска значительно быстрее.Вы можете отправить отдельные исполняемые файлы.90% нормального Perl работает.Вы также можете использовать .pmc (как это делает python), но это делают только огромные сайты.Я рекомендую использовать версию из CPAN.

perlcc в основном создает дамп во время CHECK и затем выполняет дамп.Таким образом, существуют семантические различия для упаковщиков perl (PAR, perl2exe, perlapp), которые создают дампы и выполняют их до начала.Смотрите perlcompile.pod из B :: C на CPAN.

@ mkb: поддержка perlcc не ослабла.p5p был просто неспособен исправить оставшиеся ошибки.Так я и сделал.См. http://search.cpan.org/dist/B-C/.

@ Chas: Конечно, perl5 компилируется до некоторого вида "байт-кода", optree.Компилятор B :: Bytecode может использоваться для выгрузки этого, а ByteLoader используется для его запуска.Там также MAD, который создает дамп в XML.И есть -u, который выводит в двоичное представление.Который может быть использован для undump до exe.Необходим простой шаг, похожий на линкер, на который у меня еще не было времени.

@ Новиков: Perl компилирует в байт-код и затем запускает егоКак и большинство языков сценариев.В Perl есть perlcc, поэтому вы компилируете его в собственные исполняемые файлы.

@ zigdon: Вы смешали это с упаковщиками, такими как perl2exe и PAR.

Может быть, у нас такой беспорядок из-за все еще неправильной записиКомпилятор Perl в FAQ.

1 голос
/ 02 сентября 2010

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

0 голосов
/ 02 сентября 2010

Потому что Perl 5 не компилируется в байт-код.Perl 6, с другой стороны, может быть скомпилирован в байт-код, который выполняется на виртуальной машине Parrot.

0 голосов
/ 02 сентября 2010

Perl - интерпретируемый язык, C / C ++ - нет.

0 голосов
/ 01 сентября 2010

Perl-программы не компилируются как программы на C, они анализируются во время выполнения. Все, что делает perlcc, это пытается объединить исполняемый файл perl и все библиотеки, необходимые вашей программе, в один двоичный файл. Во время выполнения скрипт все равно будет интерпретироваться, а не запускаться из двоичных данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...