Как я могу конвертировать Perl в C? - PullRequest
10 голосов
/ 12 июля 2009

Существует ли инструмент, который преобразует исходный код в Perl в исходный код на C? Любая платформа в порядке.

Ответы [ 6 ]

27 голосов
/ 12 июля 2009

Канонический ответ на этот вопрос MJD "Почему бы не перевести Perl на C?"

16 голосов
/ 12 июля 2009

Существует perlcc , который "переводит" Perl в C.

На самом деле это не компилятор Perl to C; его вывод - это просто набор интерпретатора Perl и проанализированный байт-код вашей программы.

9 голосов
/ 12 июля 2009

Ответ будет в значительной степени "Нет". Perl - чрезвычайно динамичный язык. C - это язык для типов данных статического размера. Любой перевод Perl в C, скорее всего, будет в значительной степени «выполнять этот вызов подпрограммы, чтобы имитировать то, что делает Perl» неоднократно. И нет никакого смысла в создании такого переводчика, поскольку он вряд ли выполнит Perl намного быстрее, чем Perl.

2 голосов
/ 13 декабря 2012

Я написал довольно большую программу на Perl, которая создает PDF на основе HTML и запросов к базе данных, которая фактически работает как браузер. Общий объем исходного кода составляет более 1 МБ. Программа оценивает HTML, создает запросы SQL и извлекает данные, ищет изображения на диске или загружает их с серверов HTTP, создает структуру документа, выполняет все расчеты макета и, наконец, создает PDF.

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

Существует два способа сделать Perl медленным или потребляющим память: большое количество сложных структур данных - им нужно много памяти - и большое количество вычислений. Да, в Perl вычисления действительно очень медленные. Простой термин, как

$a = $b * $c

довольно много времени в Perl, но очень быстро на любом компилируемом языке. Операнды здесь могут даже быть целыми числами, а не переменными с плавающей точкой - это медленно. Я полагаю, что именно по этой причине Perl набрал довольно плохие результаты в конкурсе языковых перестрелок [http://shootout.alioth.debian.org/](The Computer Benchmarks Game).

Я обнаружил, что моя довольно большая программа - она ​​использует много ядра Perl и дополнительные CPAN-модули - чтобы быстро запускаться, несмотря на то, что она не совсем понятна.

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

Кроме того, я использую и объектно-ориентированный подход для моделирования каждого элемента макета. Каждый объект представлен хешем - по крайней мере, около 10 КБ на объект. Если для печати требуется большой объем данных, потребление памяти в несколько сотен мегабайт не является чем-то необычным для этой программы.

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

Но все остальное было сделано и протестировано быстро и работает так быстро, что я не вижу причин для изменений. Я также нахожу Perl-код гораздо более удобным для написания и тестирования, чем C-код. Многие модули CPAN предоставляют решения, которые вам не нужно разрабатывать самостоятельно. Многие из них хорошо проверены и задокументированы.

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

1 голос
/ 24 апреля 2015

Есть переводчики с Perl на C, но никто не идеален. В идеале вы хотели бы, чтобы переводчик был и правильным, и элегантным. Увы, у вас не может быть и того и другого, простой код на Perl не эквивалентен простому коду на C, поэтому вы должны иметь перевод, который не на 100% правильный или такой же сложный, как и сам Perl. Это привело некоторых к мысли, что вам не следует пытаться переводить Perl. Точнее было бы сказать, что вам нужно четко понимать, чего вы хотите добиться от перевода, а не ожидать чудес.

100% Исправить несложно: если ваш Perl-скрипт - myperl.pl, то программа на C void main(){system("perl myperl.pl")} будет делать то же, что и myperl.pl; это довольно бессмысленно, хотя. Компилятор perlcc немного сложнее, но, похоже, не дает больших преимуществ. Я не заметил, что perlcc быстрее, чем обычный Perl. Кроме того, хотя Perl-код может быть общеизвестно сложным для чтения, я предпочитаю print "Hello World\n" чудовищности длиной в 700 строк, в которую perlcc переводит его. Я не видел, чтобы эти программы создавали что-либо, что могло бы пройти проверку кода, а также писать элегантный C-код. OTOH, если вам нужен компилятор, потому что вы не хотите распространять свой исходный код беспрепятственно, тогда perlcc может творить чудеса.

RPerl может достигать ускорения, но очень ограничен в том, что он может перевести.

Пример тривиального «элегантного, но не правильного» переводчика см. В прототипе perl2c ++. Pl . Это работает путем замены (нескольких) стандартных Perl-isms на C ++ - isms. C ++ был выбран, потому что это язык высокого уровня, такой как Perl, но он все еще использует тот же дух голого металла C.

В случае простого генератора псевдослучайных чисел LCG LCG.pl вывод perl2c++.pl является чистым и лаконичным кодом C ++, который работает в десятки раз быстрее, чем исходный Perl и не зависит от любых библиотек Perl. Его можно расширить, чтобы найти все стандартные ответы на «Как сделать X на Perl» и заменить его на «Как сделать X в C ++». Тогда он может успешно перевести много простых, но реальных сценариев Perl и помочь человеку перевести нетривиальное программное обеспечение Perl в элегантный код C ++. Это было бы наиболее полезно, если вы пишете числовое программное обеспечение на Perl, которое должно было быть написано в первую очередь на C ++.

Для программного обеспечения, для которого хорошо подходит Perl, но вы просто хотите пойти немного быстрее, подход JIT, используемый JavaScript (и, в конечном счете, Perl 6), более перспективен.

0 голосов
/ 20 мая 2012

Преобразователь называется программист , а процесс преобразования программирование . Серьезно, собственно язык Perl настолько обширен и мощен, что любой, кто пытается написать конвертер, будет смотреть свысока на всю жизнь. Кроме того, эффект в улучшении производительности может быть не на порядок, так зачем беспокоиться?

...