Как конвертировать Perl в C?
есть ли инструмент, который преобразует исходный код в Perl в исходный код в C? Любая платформа в порядке.
6 ответов
здесь perlcc который "переводит" Perl на С.
на самом деле это не компилятор Perl для C; его вывод-это просто пакет интерпретатора Perl и проанализированный байт-код вашей программы.
ответ будет в значительной степени"нет". Perl-чрезвычайно динамичный язык. C-это язык для типов данных статического размера. Любой перевод Perl на C, вероятно, будет в значительной степени "выполнять этот вызов подпрограммы для имитации того, что делает Perl" неоднократно. И в создании такого переводчика мало смысла, так как он вряд ли выполнит Perl намного быстрее, чем Perl.
Я написал довольно большую программу на Perl, которая создает PDF на основе HTML и запросов к базе данных, которые фактически действуют как браузер. Общий объем исходного кода превышает 1 МБ. Программы оценивают HTML, создают SQL-запросы и извлекают данные, ищут изображения на диске или загружают их с HTTP-серверов, строят структуру документа, выполняют все вычисления макета и, наконец, создают PDF.
мне пришлось выяснить, как ускорить операцию несколькими способами. Исходя из этого, я утверждаю, что Perl довольно быстр, и многие задачи, выполненные быстро и успешно в Perl, занимают много времени в C и даже c++.
есть 2 способа сделать Perl медленным или потребляющим память: большое количество сложных структур данных-им нужно много памяти-и большое количество вычислений. Да, расчет действительно очень медленный в Perl. Простой термин, как
$a = $b * $c
довольно много времени в Perl, но очень быстро в любом компилируемом языке. Этот операнды здесь могут быть даже целыми числами, а не переменными с плавающей запятой-это медленно. Я думаю, это причина, почему Perl забивает довольно плохо в конкурсе языковых перестрелок [http://shootout.alioth.debian.org/] (компьютерный язык бенчмарки игра).
Я нашел свою довольно большую программу -она также использует много Perl core и дополнительных модулей CPAN - для быстрого запуска, несмотря на то, что она интепретирована.
он работает очень хорошо... пока дело не доходит до расчета размеров текста и макета координирует. Это очень много времени. Заявив об этом, я написал небольшие тестовые программы Perl, просто делая миллионы арифметических вычислений, и обнаружил, что они очень медленные.
кроме того, я использую и объектно-ориентированный подход к моделированию каждого элемента макета. Каждый объект представлен хэшем-это, по крайней мере, около 10kBytes на объект. Если есть большой объем данных для печати, потребление памяти в несколько 100 Мбайт не является необычным для этой программы.
Итак, у меня все еще есть веская причина переместить часть, вычисляющую макет в C, используя структуры, где у меня теперь есть хэши с фиксированными ключами и целочисленная арифметика C, где теперь Perl выполняет медленную работу.
но все остальное было сделано и проверено быстро и работает так быстро, что я не вижу причин для изменения. Я также считаю, что Perl-код гораздо удобнее писать и тестировать, чем C-код. И многие модули CPAN предоставляют решения, которые вам не нужно разрабатывать самостоятельно. Многие из они хорошо проверены и задокументированы.
после этого довольно длинного дикуссии я заключаю: если это будет сервер или программа командной строки, рассмотрим Perl. Но если эта программа должна создавать огромные структуры данных или много арифметики, рассмотрите что-то быстрее. Иногда это может быть программа Perl с модулем, написанным на C.
есть переводчики Perl на C, но ни один из них не идеален. В идеале вам нужен переводчик, который является правильным и элегантным. Увы, вы не можете иметь оба, простой код Perl не эквивалентен простому коду C, поэтому вам либо нужно иметь перевод, который не является 100% правильным, либо так же сложен, как сам Perl. Это заставило некоторых поверить, что вы не должны пытаться перевести Perl. Точнее было бы сказать, что нужно четко понимать, чего вы хотите добиться от перевода, а не ожидать чудеса.
100% правильно легко: если ваш скрипт Perl myperl.pl тогда программа C void main(){system("perl myperl.pl")}
будет делать именно то, что myperl.pl будет сделано; хотя это довольно бессмысленно. The perlcc
компилятор немного более сложный, но все же, похоже, не дает большой пользы. Я не заметил perlcc
быть быстрее, чем простой Perl. Кроме того, хотя код Perl может быть заведомо трудным для чтения, я предпочитаю print "Hello World\n"
до 700 линии длинного чудовища, что perlcc
переводит его в. Я не видел, чтобы эти программы производили что-либо, что прошло бы проверку кода, а также написанный элегантный код C. OTOH, если вам нужен компилятор, потому что вы не хотите распространять исходный код не запутанным способом, то perlcc
может творить чудеса.
стабильным версиям может достичь скорости ИБП, но очень ограничен в том, что он может перевести.
для примера тривиального" элегантного, но не правильного " переводчика см. прототип perl2c++.pl. Это работает путем замены (нескольких) стандартных Perl-измов на C++-измы. 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) более перспективен.
преобразователь называется программист, и процесс преобразования Программирование. Серьезно, язык perl настолько обширен и силен, что любой, кто попытается написать конвертер, будет смотреть свысока на пожизненную задачу. Кроме того, эффект улучшения производительности может быть не на порядок больше, так зачем беспокоиться?