web-dev-qa-db-ja.com

PerlからPythonへの変換」用のプログラムツールはありますか?

私の新しい仕事では、Perlよりも多くの人がPythonを使用しています。私は自分で作成した非常に便利なAPIを持っており、Pythonで同僚が利用できるようにしたいと考えています。

PerlコードをPythonコードにコンパイルするコンパイラは、そのようなタスクに本当に役立つだろうと思いました。Perl(または少なくとも私が作成したPerlのサブセット)を解析するものを書き込もうとする前に私のAPIの定義に使用しました)、私はコンサルタント会社から bridgekeeper に出くわしました。

このAPIを翻訳するためにコンサルタントを雇うことは、ほぼ間違いなくお金の価値がありませんが、それは本当に興味深いツールです。

Perl5コードを解析(または解析しよう!)してPythonにコンパイルするコンパイラを知っている人はいますか?そのようなことがない場合、オブジェクト指向のPerlコードを解析してPythonに変換する単純なコンパイラーをどのように書き始める必要がありますか?出発点として使用できるANTLRまたはYACCの文法はありますか?

編集:私は Perl.y を見つけました。これは、自分のコンパイラーをロールする場合の開始点になる可能性があります。

22
James Thompson

ジェームズ、

いくつかの理由から、Pythonでモジュールを書き直すことをお勧めします。

  1. Perlの解析は非常に困難です。これがあなたにとって重要で望ましい演習でない限り、あなたは自分自身が有用な仕事よりも翻訳に多くの時間を費やしていることに気付くでしょう多く
  2. 書き直すことで、Pythonを練習する絶好のチャンスがあります。学習は行うことによって最もよく行われ、本当に必要なタスクを実行することは大きな恩恵です。
  3. 最後に、PythonとPerlの哲学はまったく異なります。より多くのPythonicAPIを取得するには、Pythonで書き直すのが最善です。
34
Eli Bendersky

コードを書き直すべきだと思います。解析作業の結果の品質は、Perlコーディングスタイルによって異なります。以下の引用は、理論的な側面を非常によく要約していると思います。ウィキペディアから: ウィキペディアのPerl

コンパイル段階で実行される実行時コードによって解析が影響を受ける可能性があるため、Perlにはチューリング完全な文法があります。[25]したがって、Perlは、Lex/Yaccレクサー/パーサーの直接の組み合わせでは解析できません。代わりに、インタープリターは独自のレクサーを実装します。このレクサーは、変更されたGNUバイソンパーサーと連携して、言語のあいまいさを解決します。

「PerlだけがPerlを解析できる」とよく言われます。つまり、Perlインタープリター(Perl)だけがPerl言語(Perl)を解析できますが、これでも一般的には当てはまりません。 Perlインタープリターはコンパイル段階でチューリングマシンをシミュレートできるため、すべての場合に解析を完了するには、停止問題を決定する必要があります。停止問題が決定不可能であるというのは長年の結果であり、したがって、Perlでさえ常にPerlを解析できるわけではありません。 Perlは、独自のコンパイル段階でユーザーに完全なプログラミング能力へのアクセスを許可するという珍しい選択をします。理論的な純度という点ではコストは高いですが、実際的な不便はめったにないようです。

ソースコードアナライザーや自動インデンターなど、Perlの解析を行う他のプログラムは、あいまいな構文構造だけでなく、一般的な場合のPerl解析の決定不能性にも対処する必要があります。 AdamKennedyのPPIプロジェクトは、Perlを実行可能コードとして解析するのではなく(Perl自体でさえ常に実行できるわけではない)、Perlコードをドキュメントとして解析する(ドキュメントとしての整合性を維持する)ことに焦点を当てていました。 「Perlの解析は「停止の問題」に苦しんでいる」と最初に推測したケネディ[26]、そしてこれは後に証明されました。[27]

19
weismat

5.10以降、実験的な その他の属性装飾 を有効にしてPerlをコンパイルし、Perl_XMLDUMP環境変数をファイル名に設定して解析ツリーのXMLダンプを取得できます(コメントを含む-言語翻訳者にとって非常に役立ちます) 。ドキュメントが言うように、これは進行中の作業ですが。

7
ysth

私はそれを試したことがなく、メンテナンスされていないようですが、多分 PyPerl はオプションですか?

このAPIの大きさはどれくらいですか?それが本当にこれほど便利なら、Pythonで書き直してみませんか。自動コンバーターの作成は、APIの再作成よりもおそらく時間がかかります。

そして、それを自動的に書き直すことができたとしても、結果のコードはおそらくあまりPythonicではないでしょう。

Weismatとelibenによる回答を必ずチェックしてください

6
jitter

Pythonに変換したり、Pythonで書き直したりするのは楽しいかもしれませんが、どちらも最初の選択肢にはしません。次に、フォークされたコードベースで立ち往生するでしょう。行った変更はすべて複製する必要があります。

Perlの外部からアクセスできるAPIのある種のラッパーを作成します。 1つの可能性はRESTfulインターフェースです。もう1つは、ネットワークの問題に対処したくない場合は、APIにアクセスするコマンドラインツールのセットを作成することです(情報をJSONとして渡す可能性があります)。次に、httplib2またはサブプロセスを使用してラッパーAPIにアクセスする簡単なpythonライブラリを作成できます(ラッパーの実装方法によって異なります)。

インターフェイスが変更されるたびにPython APIを更新する必要がありますが、現在はインターフェイスの変更専用です。

4
jcdyer

[〜#〜] ppi [〜#〜] を使用してパーサーを作成し、それを中間形式にダンプして、そこから機械的にPythonを作成してみてください。難しい、しかし、実行可能です。便利ですか?えーと...

または、コードを Perl 6 に移植し、 Pynie まで待機して、PythonからPerl6への直接呼び出しを許可する準備が整います。同じランタイム!結局のところそれほど遠くはありませんが、残念です Ponie は死んでいます。

4
wazoox

https://perthon.sourceforge.net おそらく機能するでしょうか?まだアルファ版ですが、多くの可能性があります。