2009-06-30 71 views
15

私の新しい仕事では、Perlより多くの人々がPythonを使用しています。私は自分自身で書いた非常に有用なAPIを持っています。私はPythonで同僚に利用したいと思います。PerlからPythonへの変換のためのプログラム的なツールはありますか?

私は、PerlコードをPythonコードにコンパイルしたコンパイラがこのようなタスクに本当に便利だと考えました。 Perlを解析したもの(あるいは私がAPIの定義に使ったPerlのサブセット)を書く前に、私はbridgekeeperに相談しました。

私はこのAPIを翻訳するコンサルタントを務める価値はほとんどありませんが、それは本当に興味深いツールです。

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

編集:私はperl.yを見つけました。これは、私自身のコンパイラを起動する場合の出発点になるかもしれません。

答えて

28

ジェームズ、

私はあなただけのいくつかの理由で、Pythonでモジュールを書き換えることをお勧めします:

  1. 解析PerlがDARNですハード。これがあなたにとって重要で望ましい運動でない限り、多くの場合、有用な作業よりも翻訳に多くの時間がかかります
  2. これを書き直すことで、Pythonを練習する機会が得られます。あなたが本当にやる必要のある仕事を持っていることは大きな恩恵です。
  3. 最後に、PythonとPerlは全く異なる考え方を持っています。よりPythonのAPIを入手するには、Pythonで書き直すだけです。
+1

PERLは、Pythonに簡単に翻訳されない構造の完全なものです。 PERLでは、コードの背後にある意図を人間が理解し理解する必要があります。 –

+6

s/PERL/Perl/g(私が疑っているよりも辛い場合を除き) – ijw

+0

@ijw: "s/PERL/Perl/g"はどういう意味ですか? –

6

私はそれを試したことがないし、維持されていないようですが、おそらくPyPerlはオプションですか?

このAPIのサイズはどれくらいですか?それが本当に便利なのであれば、なぜPythonで書き直さないのですか?自動コンバーターの作成には、APIの書き換えに時間がかかるかもしれません。

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

weismatで答えをチェックアウトしてくださいとeliben

+0

またはインライン:: Python –

16

コードを書き直す必要があります。解析作業の結果の品質は、Perlコーディングスタイルに依存します。 私は以下の引用が理論的側面を非常にうまくまとめていると思います。ウィキペディアから :解析がコンパイルフェーズ中に実行されるランタイム・コードによって影響を受けることができるのでPerl in Wikipedia

Perlはチューリング完全な文法を有している[25]。そのため、Perlは、Lex/Yaccのレクサー/パーサーの組み合わせでは解析できません。代わりに、インタプリタは独自のレクサーを実装しています。このレクサーは、言語のあいまいさを解決するために修正されたGNUバイソンパーサと連携しています。

"PerlだけがPerlを解析できます"と言われることはよくあります。つまり、Perlインタプリタ(perl)だけがPerl言語(Perl)を解析できるということですが、一般的にそうではありません。 Perlインタプリタはコンパイル段階でチューリングマシンをシミュレートすることができるため、あらゆる場合に解析を完了するためにHalting Problemを決定する必要があります。 Halting Problemは決めることができず、したがってPerlでもPerlを常に解析することはできないという長年の成果です。 Perlは、独自のコンパイル段階で、完全なプログラミング能力にアクセスできるようにするという珍しい選択をしています。理論純度の面でのコストは高いが、実用上の不便はほとんどないようだ。

ソースコードアナライザや自動インデントなど、Perlを解析する他のプログラムでは、あいまいな構文構造だけでなく、一般的な場合のPerl解析の決定不能性も争わなければなりません。 Adam KennedyのPPIプロジェクトは、Perlコードを(実行可能なコードとしてもPerl自身でも常に行うことはできない)Perlを解析するのではなく、文書としての完全性を保ったまま文書として解析することに重点を置いていました。ケネディー氏は最初にそれを推測しました。「Perlのパースは「停止問題」に苦しんでいます。」[26]、これは後に証明されました。 5.10以降

7

、あなたは有効な実験Misc Attribute DecorationでPerlをコンパイルし、(コメントを含む - 言語の翻訳者のための非常に有用)解析ツリーのXMLダンプを取得するために、ファイル名にPERL_XMLDUMP環境変数を設定することができます。ドクターの言うとおり、これは進行中の作業です。

4

これをPythonに変換したり書き換えたりするのは楽しいかもしれませんが、私はそれらのどちらかを最初に選択しません。それでは、フォークされたコードベースに悩まされます。あなたが行った変更はすべて複製する必要があります。

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

インターフェイスが変更されたときでもPython APIを更新する必要がありますが、これはインターフェイスの変更のみです。

+0

または、私はPythonに切り替えることができます。それはそれほど悪くないでしょう! –

3

PPIというパーサを作成し、それを中間形式にダンプし、そこからmypanically Pythonを書き込むことができます。しかし、やっている。有用? Er ....

Perl 6にコードを移植して、Pynieを待って、Pythonから同じランタイム内でPerl6への直接呼び出しを可能にするのに十分な準備ができました!結局、それほど遠くないわけではありません。あまりにも悪いPonieの死んだ。

関連する問題