11

Perl のソース コードを C のソース コードに変換するツールはありますか? どのプラットフォームでも構いません。

4

6 に答える 6

28

これに対する標準的な答えは、MJD の「Why Not Translate Perl to C?」です。.

于 2009-07-11T23:21:45.570 に答える
17

Perl を C に「変換」するperlccがあります。

これは実際には Perl から C へのコンパイラではありません。その出力は、Perl インタープリターとプログラムの解析済みバイトコードの単なるバンドルです。

于 2009-07-11T22:26:40.267 に答える
9

答えはほとんど「いいえ」になります。Perl は非常に動的な言語です。C は、静的サイズのデータ​​型の言語です。Perl から C への翻訳は、ほとんど「このサブルーチン呼び出しを実行して、Perl の動作をシミュレートする」ことを繰り返します。そして、そのようなトランスレータを構築してもほとんど意味がありません。Perl よりもはるかに高速に Perl を実行する可能性は低いからです。

于 2009-07-11T22:21:17.580 に答える
2

HTML とデータベース クエリに基づいて PDF を作成するかなり大きなプログラムを Perl で作成しました。このプログラムは事実上ブラウザーのように動作します。ソースコードの総量は1MBを超えています。プログラムは、HTML を評価し、SQL クエリを作成してデータを取得し、ディスク上の画像を検索するか、HTTP サーバーから画像をダウンロードし、ドキュメント構造を構築し、すべてのレイアウト計算を行い、最後に PDF を生成します。

さまざまな方法で操作を高速化する方法を見つけなければなりませんでした。それに基づいて、Perl は非常に高速であり、Perl で迅速かつ正常に完了した多くのタスクは、C や C++ でさえ長い時間がかかると述べています。

Perl を遅くしたりメモリを消費したりする方法は 2 つあります: 多数の複雑なデータ構造 - それらは大量のメモリを必要とします - と大量の計算です。はい、Perl の計算は確かに非常に遅いです。のような簡単な用語

$a = $b * $c

Perl ではかなり時間がかかりますが、コンパイルされた言語では非常に高速です。ここでのオペランドは、浮動小数点変数ではなく、整数でさえあるかもしれません - それは遅いです。これが、言語シュートアウト コンテスト [http://shootout.alioth.debian.org/](The Computer Language Benchmarks Game) で Perl のスコアがかなり悪い理由だと思います。

非常に大きなプログラム (多くの Perl コアと追加の CPAN モジュールも使用) が、解釈されているにもかかわらず、すぐに開始できることがわかりました。

テキストサイズとレイアウト座標の計算までは、非常にうまく機能します。それは非常に時間がかかります。これを述べた後、数百万の算術計算を行うだけの小さな Perl テスト プログラムを作成しましたが、非常に遅いことがわかりました。

その上、私はオブジェクト指向のアプローチを使用して、すべてのレイアウト要素をモデル化しています。各オブジェクトはハッシュで表されます。これは、オブジェクトごとに少なくとも約 10k バイトです。印刷するデータが大量にある場合、そのプログラムで数 100MByte のメモリが消費されることは珍しくありません。

そのため、レイアウトを計算する部分を C に移動する正当な理由がまだあります。構造体を使用して固定キーを持つハッシュを使用し、C の整数演算を使用して Perl の処理が遅くなります。

しかし、他のすべては迅速に実行およびテストされ、非常に高速に実行されるため、変更する理由はありません。また、Perl コードは、C コードよりも作成およびテストするのにはるかに便利だと思います。また、多くの CPAN モジュールは、自分で解決する必要のないソリューションを提供します。それらの多くは十分にテストされ、文書化されています。

この非常に長い議論の後、私は次のように結論付けています。サーバーまたはコマンド ライン プログラムである場合は、Perl を検討してください。しかし、このプログラムが巨大なデータ構造や多くの演算を構築する必要がある場合は、より高速なものを検討してください。C で書かれたモジュールを持つ Perl プログラムの場合もあります。

于 2012-12-13T18:47:17.277 に答える
2

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 主義を C++ 主義に置き換えることで機能します。C++ が選択されたのは、Perl のような高級言語でありながら、C と同じベアメタルの精神を共有しているためです。

単純な LCG 疑似乱数ジェネレーターLCG.plの場合、出力perl2c++.plはクリーンで簡潔な C++ コードであり、元の Perl よりも数十倍速く実行され、Perl ライブラリに依存しません。「Perl で X を実行する方法」に対するすべての標準的な回答を検索し、「C++ で X を実行する方法」に置き換えるように拡張できます。次に、多くの単純だが実際の Perl スクリプトを正常に変換し、人間が重要な Perl ソフトウェアをエレガントな C++ コードに変換するのを支援する可能性があります。これは、そもそも C++ で書かれるべきだった数値計算ソフトウェアを Perl で書いていることに気付いた場合に最も役立ちます。

Perl が適しているが、もう少し速くしたいソフトウェアの場合は、JavaScript (および最終的には Perl 6) で使用される JIT アプローチの方が有望です。

于 2015-04-24T14:31:03.867 に答える
-1

コンバーターはプログラマーと呼ばれ、変換プロセスはプログラミングと呼ばれます。真剣に、perl 固有の言語は非常に広大で強力であるため、コンバーターを作成しようとする人は誰でも生涯にわたる仕事を見下すでしょう。さらに、パフォーマンス向上の効果は一桁ではないかもしれません。

于 2012-05-20T07:26:03.523 に答える