別のプログラミング言語への変換を容易にするために、コードにどのようなパターンを適用できますか?[閉まっている]


95

私は、あるプログラミング言語から別のプログラミング言語にコードを変換することを目標とするサイドプロジェクトを行うことを目指しています。私が使用している言語はPHPとPythonです(PythonからPHPを使用する方が簡単です)が、理想的には(比較的)簡単に他の言語を追加できます。計画は次のとおりです。

  • これはWeb開発を対象としています。元のコードとターゲットコードはフレームワークの上に配置されます(これも私が作成する必要があります)。これらのフレームワークはMVC設計パターンを採用し、厳密なコーディング規則に従います。これにより、翻訳が多少容易になります。

  • また、IOCと依存関係の注入についても検討しています。これにより、変換プロセスが容易になり、エラーが発生しにくくなる可能性があります。

  • 抽象構文ツリーをいじるPythonのパーサーモジュールを利用します。どうやら私がPHPを使用して取得できる最も近いものはtoken_get_all()です。

  • それからは、AST、シンボルテーブル、制御フローを構築できます。

その後、コードの出力を開始できると思います。完全な翻訳は必要ありません。生成されたコードを確認して問題を修正する必要があります。理想的には、翻訳者は問題のある翻訳にフラグを付ける必要があります。

「これは一体何のことなんだ?」と尋ねる前に 答えは...興味深い学習体験になるでしょう。この困難さを軽減する方法について何か洞察があれば、私に知らせてください。


編集:

変換の方法よりもコードを変換しやすくするためにコードに適用できるパターンの種類(IoC、SOAなど)を理解することに、より関心があります。


6
.NET CLRやPerl6のParrotなどのシステムを見たことはありますか?それらは、一連の言語を、一般的なインタープリターが実行できる中間表現にコンパイルします。中間表現から言語に戻ることができれば、翻訳者はいます。
ボレアリド

1
@Borealid AFAIK .NET CILは(比較的)にコンパイルするのが簡単ですが、そこから読みやすいコードを取得できるように頑張ってください。今オウムを見てください。
NullUserException 2010

他の言語にも同様のプロジェクトがあります。彼らの作者がどれほど豊かであるかはわかりません。そして、私は実際にフレームワークを必要とし、厳格なコーディング規約を遵守することで、自分自身をかなり抑制しています。
NullUserException 2010

2
特定の知識を追加することはできませんが、パジャマ(pyjs.org)、具体的にはtranslator.py を見ましたか?これはpythonからjavascriptコンパイラです。
ステファン2010

3
再編集:翻訳するコードを制御できる場合、最も明白なことは、翻訳するのが難しい構成を避けることです!たとえば、ポインター演算がない場合は、CをJavaに変換する方がはるかに簡単です。Pythonについては、おそらくクロージャーを避けます。あなたができる他のことは、翻訳するのがより難しい部分が常に慣用的にコード化されるような方法でソースコードを書くことで、それらを認識し、特別なケースを処理することを容易にします。
Ira Baxter

回答:


122

私は1995年以来、コンピューター科学者の強力なチームによってサポートされている、汎用プログラム操作(言語翻訳は特殊なケースですを行うためのツール(DMSソフトウェアリエンジニアリングツールキット)構築しています。DMSは、一般的な解析、AST構築、シンボルテーブル、制御およびデータフロー分析、翻訳ルールの適用、コメント付きのソーステキストの再生成などを提供します。これらはすべて、コンピューター言語の明示的な定義によってパラメーター化されます。

これを適切に実行するために必要な機構の量は膨大で(特に、一般的な方法でこれを複数の言語で実行できるようにしたい場合)、定義が信頼できない言語の信頼できるパーサーが必要です(PHPはこの良い例です) )。

言語から言語への翻訳者を構築したり、それを試みたりすることに何の問題もありませんが、実際の言語では、これは予想よりもはるかに大きな課題であると思います。私たちはDMSだけに約100人年を費やしており、C ++などの厄介な言語の場合はさらに、「信頼できる」言語定義(PHPのために苦労して作成したものを含む)ごとにさらに6〜12か月かかります。それは「学習体験の地獄」になるでしょう。それは私たちのためにありました。(上記のWebサイトのテクニカルペーパーのセクションは、その学習をすぐに始めるのに興味深いかもしれません)。

人々は、よく知っている技術の一部から始めて、ある種の一般化された機械を構築しようとすることがよくあります。(Python ASTは良い例です)。良いニュースは、仕事の一部が完了したことです。悪いニュースは、機械には何十億もの想定が組み込まれていることです。そのほとんどは、何か他のことをすることに取り組んでみようとしないと発見できません。その時点で、機械がそれが元々行っていることを実行するように配線されていることがわかり、実際に、他のことを実行しようとする試みに本当に抵抗するでしょう。(Python ASTでPHPをモデル化するのはとても楽しいことだと思います)。

私が最初にDMSを構築し始めた理由は、そのような前提条件がほとんど組み込まれていない基盤を構築するためでした。それは私たちに頭痛の種を与えるものがあります。これまでのところ、ブラックホールはありません。(過去15年間の私の仕事の最も難しい部分は、そのような仮定が忍び寄ることを防ぐことを試みることです)。

多くの人々はまた、解析できる(そしておそらくASTを取得できる)場合、複雑なことを実行していると思い込んでいます。難しい教訓の1つは、優れたプログラム分析または変換を行うには、シンボルテーブルとフロー分析が必要であることです。ASTは必要ですが、十分ではありません。これが、Aho&Ullmanのコンパイラブックが第2章で止まらない理由です(OPは、AST以外に追加の機構を構築することを計画しているという点でこの権利を持っています)。このトピックの詳細については、「解析後のライフ」を参照してください。

「完璧な翻訳はいらない」という発言は面倒です。弱い翻訳者が行うのは、コードの「簡単な」80%を変換し、20%を手作業で行うことです。変換しようとしているアプリケーションがかなり小さく、一度だけ変換するつもりなら、その20%で問題ありません。多くのアプリケーション(または、時間の経過に伴うわずかな変更を伴う同じアプリケーション)を変換する場合、これは適切ではありません。100K SLOCを変換しようとすると、20%は20,000の元のコード行であり、これは翻訳、理解、および変更が困難な別の80,000行の翻訳済みプログラムのコンテキストでは困難です。それには多大な労力が必要です。100万行レベルでは、これは実際には不可能です。より困難であり、彼らは通常、長い時間の遅れ、高いコスト、そして多くの場合、完全な失敗で苦痛に気づきます。

大規模なシステムを翻訳するために撮影する必要があるのは、90パーセントの高い変換率です。そうでない場合は、翻訳作業の手動部分を完了できない可能性があります。

もう1つの重要な考慮事項は、翻訳されるコードのサイズです。優れたツールを使用していても、機能する堅牢なトランスレータを構築するには多くのエネルギーが必要です。単純な手動変換を行う代わりにトランスレータを構築するのはセクシーでクールに見えますが、小さなコードベース(たとえば、私たちの経験では最大100K SLOC)の場合、経済学はそれを正当化しません。誰もこの答えを好きではありませんが、本当に10K SLOCのコードを翻訳する必要がある場合は、おそらく弾丸を噛んでそれを実行する方が良いでしょう。そして、はい、それは痛いです。

私のツールは非常に良いと思います(しかし、それではかなり偏っています)。そして、良い翻訳者を作ることはまだ非常に困難です。約1.5〜2人年かかり、ツールの使い方を知っています。違いは、これほど多くの機械を使用すると、失敗するよりもかなり成功するということです。


8
「苦労して構築された」PHP定義をPHPコミュニティ全体に貢献することを検討したことはありますか、それとも、自分の収入源と密接に関連してそれを実現可能にすることができませんか?
TML 2010

53
収入源に貢献したくなく、仕事をしてそれをオープンソース化するエネルギーを持っていなかった多くの人々から、私たちが行うすべてを「オープンソース」にするように求められました。非常に大きなプロジェクトにほんの一部しか貢献していない場合、および/または別の収入源がある場合は、「オープンソース」で結構です。すべての作業を自分で行い、その唯一の収入源である場合、これはそれほど魅力的ではありません。[「フリーソフトウェア」の哲学の相対的なメリットについては説明したくないので、この説明に沿ったこれ以上のコメントには参加しません]
Ira Baxter

9
あなたがここで言ったことに同意します。それが私がしたように私が質問をした理由です。私はあなたがそれがあなたの収入に非常に密接に関連していると感じているその反応から直感的であると思います、そしてそれで絶対に何も悪いことはありません-私はそれは尋ねる価値があると思いました。
TML

3
@IraBaxter他の多くの評価に適用できる、コンピューターに関連する評価に関する一般的なイディオムを言うだけです。あなたが書いたすべての中で
興味深い

1
回答にはClang関連のページへのリンクが含まれていることがよくあります。これは、誰かがWebページを作成できることを証明するだけです。私たちのほとんどは、適切に記述されたWebページが背後に深刻で実際の作業があり、読者があなたの答えを暗示しているように見せかける詐欺的な試みだけではないことを示唆していると想定しています。あなたは実際にウェブページが詐欺だと信じていますか?このページには、「関連」ソースへの参照情報が含まれています。仕事の契約がそれを必要としたのでそれは匿名化されます。どうしようもない。
Ira Baxter、

13

私の答えは、Pythonを別の言語に翻訳するために構文解析する特定のタスクに対処するものであり、Iraが彼の回答で十分に対処した高レベルの側面ではありません。

つまり、パーサーモジュールを使用しないでください。簡単な方法があります。

astそれはあなたと仕事に既製のASTを与えるので、Pythonの2.6以降で利用可能モジュールは、あなたのニーズにはるかに適しています。昨年この記事を書きましたが、簡単に言うと、のparseメソッドを使用してastPythonソースコードをASTに解析します。parserモジュールはあなたのパースツリーではなく、ASTを与えるだろう。違いに注意してください

PythonのASTは非常に詳細であるため、ASTを考えると、フロントエンドの作業はそれほど難しくありません。機能の一部のシンプルなプロトタイプをすぐに準備できると思います。ただし、主に言語のセマンティクスが異なるため、完全なソリューションを得るには時間がかかります。言語の単純なサブセット(関数、基本型など)は簡単に翻訳できますが、より複雑なレイヤーに入ると、ある言語のコアを別の言語のコアをエミュレートするための重い機械が必要になります。たとえば、Pythonのジェネレータを検討し、PHPには存在しない内包表記をリストします(私の知る限り、PHPが関与している場合は明らかに貧弱です)。

最後のヒントとして2to3、Python開発者が作成した、Python 2コードをPython 3コードに変換するツールを検討してください。フロントエンドでは、Pythonを何かに変換するために必要な要素のほとんどが含まれています。ただし、Python 2とPython 3のコアは似ているため、エミュレーション機構は必要ありません。


ウィーエル。2to3ASTからASTまでです。astモジュールの機能を超えることはサポートされていません。翻訳のすべてが行くことに注意してくださいから構文は、ホストのpythonのプロセスでサポートされているホストのpythonプロセスによってサポートされている構文。2.6はそれをサポートしていないため、関数アノテーションを追加するトランスレータはありません。
habnabit 2010

...そしてOPの質問は、フレーム化され、短期的には、Python 2.6 ASTから... astモジュールはおそらくPHPの構文をうまく表現したくないので、astからastにさえなりません。
Ira Baxter、

2
@Aaron:2to3から生成されたASTの使用例として見ることができますast
Eli Bendersky、2010

AFAIK、2to3は間違いなくPythonからPHPへの変換よりも簡単です(結局のところ、そのPythonからPythonへの変換です)。そしてそれは特にうまく機能しません。まだ2to3で押し出されていない大量のPython 2.6に注意してください。100%自動化された場合、Python 2.6は機能しなくなります。
Ira Baxter

5

翻訳者を書くことは不可能ではありません。特に、Joelのインターンが夏にそれを行ったことを考えると、

1つの言語を使用する場合は簡単です。もっとやりたければ、少し難しいですが、多すぎません。最も難しいのは、チューリング完全言語は、別のトゥーリング完全言語が実行できることを実行できる一方で、組み込みのデータ型は、言語が驚異的に行う動作を変更できることです。

例えば:

word = 'This is not a word'
print word[::-2]

複製には多くのC ++コードが必要です(もちろん、いくつかのループ構造を使用すればかなり短くできますが)。

それは少し余談だと思います。

言語文法に基づいてトークナイザー/パーサーを書いたことがありますか?それがこのプロジェクトの主要な部分であるため、まだそうしていない場合は、その方法を学びたいと思うでしょう。私がやろうとしていることは、基本的なチューリングの完全な構文を思いつくことです。Pythonのバイトコードにかなり似てい ます。次に、(おそらくBNFを使用して)言語文法を取得するレクサー/パーサーを作成し、文法に基づいて、言語を中間言語にコンパイルします。次に、逆のことを行います。自分の言語から文法に基づいてターゲット言語にパーサーを作成します。

私が目にする最も明白な問題は、最初はおそらくひどく非効率的なコードを作成することです。特に、Pythonなどのより強力な*言語ではそうなります。

しかし、この方法でこれを行うと、おそらく出力を最適化する方法を理解できるようになります。要約する:

  • 提供された文法を読む
  • プログラムを中間(ただしチューリング完全)構文にコンパイルする
  • 中間プログラムを最終言語にコンパイルする(提供された文法に基づく)
  • ...?
  • 利益!(?)

*強力なことで、これは4行かかることを意味します:

myinput = raw_input("Enter something: ")
print myinput.replace('a', 'A')
print sum(ord(c) for c in myinput)
print myinput[::-1]

そのようなことができる別の言語を4行で示してください。Pythonと同じくらい強力な言語を紹介します。


「言語文法に基づいたトークナイザー/パーサーを書いたことがありますか?」私はJavaCCを使用してそれを行いました。
NullUserException 2010

2
ジョエルのインターンは、夏の間に部分的な仕事をしました。彼のソース言語は既存の言語のサブセットであり、おそらくこのサブセットは多少調整される可能性があります。それは仕事をずっと簡単にします。同様に、NullPointerExceptionは、Pythonのより簡単な部分から始めて、おそらく手動の変換のためのより難しいものを通過することになるでしょう(質問で述べたように)。
David Thornley、2010

@NullUserException:ある程度公開されますが、基本的にJavaCCの再実装を行います。出力言語としてJavaを使用する代わりに、<ここに言語を挿入>を実行します。@David、かなりそうだ。アザミでさえ、いくつかの言語構成要素に何らかの助けが必要です。P:私はOPだったら、私はそうでない場合、私はC ++は(ステップで)文字列のスライシングを行うために取得しようと永遠に立ち往生しているはずだ、機能最初に、その後、最適化のために行くだろう
ウェイン・ヴェルナー

@WayneWernerちなみに、C#のような言語は改行をまったく必要としません。(少なくとも、1行のコメントを取り除いた後ではありません。)したがって、任意のC#プログラムを1行で記述できます。しかし、もちろん私はあなたが何をしているのか理解しています。
leviathanbadger

@ aboveyou00:そうではないと思います。プリプロセッサの条件文を許可しない場合は、正しい可能性があります。
Ira Baxter 14年

3

気にしないように言ういくつかの答えがあります。さて、それはどれほど役に立ちますか?あなたは学びたいですか?学ぶことが出来ます。これはコンパイルです。たまたま、ターゲット言語がマシンコードではなく、別の高級言語であることが起こります。これは常に行われます。

始めるのに比較的簡単な方法があります。まず、http://sourceforge.net/projects/lime-php/(PHPで作業したい場合)またはそのようなものを入手し、サンプルコードを確認します。次に、正規表現のシーケンスを使用して字句アナライザーを作成し、生成したパーサーにトークンをフィードできます。セマンティックアクションは、別の言語でコードを直接出力するか、マッサージしてトラバースして出力コードを生成できるデータ構造(オブジェクトなど)を構築できます。

PHPとPythonは、多くの点で互いに同じ言語ですが、構文が異なるため、幸運です。難しいのは、文法形式とデータ構造の意味の違いを乗り越えることです。たとえば、Pythonにはリストと辞書がありますが、PHPにはassoc配列しかありません。

「学習者」のアプローチは、言語の制限されたサブセット(印刷ステートメント、単純な数学、変数の割り当てのみなど)で問題なく機能するものを構築し、徐々に制限を取り除くことです。これは基本的に、フィールドの「大物」の連中がすべてやったことです。

おお、そしてPythonには静的型がないので、Pythonが行う方法に従って数値、文字列、またはオブジェクトを追加する「python_add」のようなPHP関数を記述してそれに依存するのが最善の場合があります。

明らかに、これを許可すると、これははるかに大きくなる可能性があります。


3
実は「気にしないで」とは言わなかった。私が言ったのは、「一般的な方法で言語を翻訳することは非常に難しいこと」です。OPが、Pythonツリーを使用してPHPを生成するという彼の元の道を進んだ場合、彼は多くのことを学び、私はすべてこの学習経験に賛成します。私もそこから始めました。彼は新しい言語を簡単に追加することができません。
Ira Baxter

@IraBaxter私はあなたの発言をサポートできません。Python-> PHPとPHP-> Javascriptを行うのは簡単です。cf. 答えの真ん中のstackoverflow.com/a/22850139/140837の最後の部分も私はあなたの「議論」を扱います
amirouche

2

パーサーの代わりにast.parseを使用することについて@EliBenderskyの観点を2番目に説明します(以前は知りませんでした)。また、彼のブログを確認することをお勧めします。ast.parseを使用してPython-> JavaScriptトランスレータ(@ https://bitbucket.org/amirouche/pythonium)を実行しました。他の実装をいくらか見直して、自分で試してPythoniumの設計を思いつきました。私も始めたhttps://github.com/PythonJS/PythonJSからPythoniumをフォークしましたこれは実際には完全な書き直しです。全体的なデザインはPyPyとhttp://www.hpl.hp.com/techreports/Compaq-DEC/WRL-89-1.pdfからインスピレーションを得ていますペーパー。

Pythoniumマーケティングのように見えても、最初から最高のソリューションまで、私が試したすべては実際にはそうではありません(ネチケットに何かが正しくないと思われる場合は、遠慮なく教えてください)。

  • プロトタイプ継承を使用して、Plain Old JavaScriptでPythonセマンティックを実装する:AFAIK JSプロトタイプオブジェクトシステムを使用してPython多重継承を実装することは不可能です。私は後で他のトリックを使ってそれをやろうとしました(cf. getattribute)。JavaScriptでPythonの多重継承が実装されていないことを知っている限り、存在する最良のものは単一の継承+ミックスインであり、ダイヤモンドの継承を処理するかどうかはわかりません。Skulptに似ていますが、Google clojureがありません。

  • 実際にSkulptコード#failを読み取る代わりに、Sculpt(コンパイラー)と同じように、Googleのclojureを試してみました。とにかく、JSプロトタイプベースのオブジェクトシステムのためにまだ不可能です。バインディングの作成は非常に困難でした。JavaScriptと多くのボイラープレートコードを記述する必要があります(https://github.com/skulpt/skulpt/issues/50私が幽霊である場合を参照)。当時、ビルドシステムにバインディングを統合する明確な方法はありませんでした。Skulptはライブラリであり、.pyファイルをhtmlに含めるだけで実行できると思います。開発者がコンパイルフェーズを実行する必要はありません。

  • pyjaco(コンパイラ)を試しましたが、バインディングの作成(PythonコードからJavascriptコードを呼び出す)は非常に難しく、毎回作成するボイラープレートコードが多すぎました。今、私はpyjacoがPythoniumに近いものだと思います。pyjacoはPython(ast.parseも)で書かれていますが、多くはJavaScriptで書かれており、プロトタイプ継承を使用しています。

私は実際にパジャマを実行することに#failを成功させることはなく、コード#failを再度読み取ろうとはしませんでした。しかし私の頭の中では、パジャマはPythonからJavaScriptへの変換ではなく、APIからAPIへの変換(またはフレームワークからフレームワークへの変換)を行っていました。JavaScriptフレームワークは、すでにページにあるデータまたはサーバーからのデータを使用します。Pythonコードは「配管」のみです。その後、私はパジャマが実際には本物のpython-> jsトランスレーターであることを発見しました。

それでも、API-> API(またはフレームワーク->フレームワーク)の変換を行うことは可能だと思います。それは、基本的にはPythoniumで行うことですが、より低いレベルで行います。おそらくパジャマはPythoniumと同じアルゴリズムを使用しています...

その後、SkulptのようなJavascriptで完全に記述されたbrythonを発見しました。コンパイルの必要はなく、綿毛もたくさんありますが、JavaScriptで記述されています。

このプロジェクトの過程で書かれた最初の行以来、PyPy、さらにはPyPyのJavaScriptバックエンドについても知っていました。うん、見つけたら、JavaScriptでPyPyから直接Pythonインタープリターを生成できます。人々は、それは災害であったと言います。どこで読めないのか。しかし、その理由は、インタープリターを実装するためにRPythonが使用する中間言語は、C(そしておそらくasm)に翻訳するように調整されたPythonのサブセットであるためだと思います。Ira Baxterは、何かをビルドするときは常に仮定を行い、おそらくそれをPyPy:Python-> C変換の場合に意図されていることで最高になるように微調整すると言います。これらの仮定は、別のコンテキストでは適切ではない可能性があり、オーバーヘッドを推測する可能性があります。

インタープリターをPythonで作成することは、(非常に)良いアイデアのように思えました。しかし、パフォーマンス上の理由からコンパイラに興味がありましたが、実際には、PythonをJavaScriptにコンパイルする方が解釈するよりも簡単です。

私は簡単にJavaScriptに変換できるPythonのサブセットをまとめるという考えでPythonJSを始めました。最初は、過去の経験から、OOシステムを実装することすらしませんでした。JavaScriptに変換するために達成したPythonのサブセットは次のとおりです。

  • 定義と呼び出しの両方で完全なパラメータセマンティックを持つ関数。これは私が最も誇りに思っている部分です。
  • while / if / elif / else
  • Pythonの型がJavaScriptの型に変換されました(いかなる種類のpythonの型もありません)
  • for JavaScript配列のみを反復できます(配列内)
  • JavaScriptへの透過的なアクセス:Pythonコードで配列を作成すると、JavaScriptで配列に変換されます。これは、競合他社に対するユーザビリティの点で最大の成果です。
  • Pythonソースで定義された関数をJavaScript関数に渡すことができます。デフォルトの引数が考慮されます。
  • それはJavaScriptに翻訳されるnewと呼ばれる特別な関数を追加しますnew例:new(Python)(1、2、spam、 "egg")は "new Python(1、2、spam、" egg ")に翻訳されます。
  • 「var」は翻訳者によって自動的に処理されます。(Brett(PythonJS寄稿者)からの非常に素晴らしい発見)。
  • グローバルキーワード
  • 閉鎖
  • ラムダ
  • 内包表記
  • インポートはrequirejsでサポートされています
  • 単一クラスの継承+ classyjsによるミックスイン

これは多くのように見えますが、実際にはPythonの本格的なセマンティクスに比べて非常に狭いです。実際には、Python構文を使用したJavaScriptです。

生成されたJSは完璧です。オーバーヘッドはなく、さらに編集してもパフォーマンスの点で改善することはできません。生成されたコードを改善できる場合は、Pythonソースファイルからも実行できます。また、コンパイラーは、http: //superherojs.com/によって作成された.jsで見つけることができるJSトリックに依存していませんでした。非常に読みやすくなっています。

PythonJSのこの部分の直接の子孫は、Pythonium Veloceモードです。完全な実装は、https://bitbucket.org/amirouche/pythonium/src/33898da731ee2d768ced3​​92f1c369afd746c25d7/pythonium/veloce/veloce.py?at = masterにあります。 //bitbucket.org/amirouche/pythonium/src/33898da731ee2d768ced3​​92f1c369afd746c25d7/pythonium/veloce/veloce.py at = master 793 SLOC +他のトランスレーターとの共有コードの約100 SLOCで。

pystones.pyの適応バージョンは、Veloceモードで翻訳できます。 https://bitbucket.org/amirouche/pythonium/src/33898da731ee2d768ced3​​92f1c369afd746c25d7/pystone/?at=master

基本的なPython-> JavaScript変換をセットアップした後、完全なPythonをJavaScriptに変換する別のパスを選択しました。ターゲット言語以外のオブジェクト指向クラスベースのコードをglibで実行する方法はJSなので、配列、マップのようなオブジェクト、その他の多くのトリックにアクセスでき、その部分はすべてPythonで記述されています。IIRC Pythoniumトランスレータで記述されたJavaScriptコードはありません。単一の継承を取得することは難しくありません。ここでは、PythoniumをPythonに完全に準拠させるための難しい部分があります。

  • spam.eggPythonでは常に翻訳されgetattribute(spam, "egg")ますが、特にこれをプロファイリングしませんでしたが、多くの時間を失うため、asm.jsなどで改善できるかどうかはわかりません。
  • メソッド解決順序:Pythonで記述されたアルゴリズムを使用していても、それをPython Veloce互換コードに変換するのは大変な作業でした。
  • getattributre:実際のgetattribute解決アルゴリズムは少しトリッキーであり、それでもデータ記述子をサポートしていません
  • メタクラスクラスベース:コードをどこに接続するか知っていますが、それでも...
  • 最後の注意点:some_callable(...)は常に "call(some_callable)"に変換されます。AFAIKトランスレータは推論をまったく使用しないため、呼び出しを行うたびに、どのような種類のオブジェクトが呼び出されるかを確認する必要があります。

この部分は、https: //bitbucket.org/amirouche/pythonium/src/33898da731ee2d768ced3​​92f1c369afd746c25d7/pythonium/compatible/runtime.py at = masterで考慮されますと互換性のあるPythonで記述。

実際の準拠トランスレータhttps://bitbucket.org/amirouche/pythonium/src/33898da731ee2d768ced3​​92f1c369afd746c25d7/pythonium/plied/compliant.py?at=masterは、JavaScriptコードを直接生成せず、最も重要なことに、ast-> ast変換を行いません。私はast-> astを試しましたが、ast.NodeTransformerを使用してもcstよりも優れているとうまく機能しない場合でも、astを実行する必要はありません。さらに重要なのは、ast-> astを実行する必要がないことです。

私の場合、少なくともpython astからpython astを実行すると、関連するコードを生成する前にブロックのコンテンツを検査することがあるため、パフォーマンスが向上する可能性があります。たとえば、次のようになります。

  • var / global:何かをvarできるようにするには、varではなく、何をする必要があるかを知っている必要があります。特定のブロックで作成された変数を追跡するブロックを生成し、生成された関数ブロックの上に挿入する代わりに、関連するコードを生成するために子ノードを実際に訪問する前にブロックに入るときに、変数の割り当てを探します。
  • 収量、ジェネレーターにはまだJSの特別な構文があるので、「var my_generator = function」を記述したい場合、どのPython関数がジェネレーターであるかを知る必要があります。

そのため、翻訳の各フェーズで各ノードに一度アクセスすることはありません。

全体的なプロセスは次のように説明できます。

Python source code -> Python ast -> Python source code compatible with Veloce mode -> Python ast -> JavaScript source code

PythonビルトインはPythonコード(!)で記述されています。IIRCには、ブートストラップタイプに関連するいくつかの制限がありますが、準拠モードでPythoniumを変換できるすべてのものにアクセスできます。見て https://bitbucket.org/amirouche/pythonium/src/33898da731ee2d768ced3​​92f1c369afd746c25d7/pythonium/compliant/builtins/?at=master

pythonium準拠から生成されたJSコードの読み取りは理解できますが、ソースマップは非常に役立ちます。

この経験に照らして私があなたに与えることができる貴重なアドバイスは、親切で古いおならです:

  • 文献と既存のプロジェクトの両方で、クローズドソースまたは無料の両方で主題を広範囲にレビューします。既存のさまざまなプロジェクトをレビューしたとき、もっと時間と動機を与えるべきでした。
  • 質問をする!C / Javascriptのセマンティックの不一致によるオーバーヘッドのため、PyPyバックエンドが役に立たないことを事前に知っていた場合。私はおそらく6か月前、おそらく3年前にPythoniumのアイデアを持っていたでしょう。
  • あなたが何をしたいかを知っている、目標を持っています。このプロジェクトでは、私はさまざまな目的を持っていました。少しJavaScriptを練習し、Pythonの詳細を学び、ブラウザーで実行されるPythonコードを作成できるようにする(詳細は以下を参照)。
  • 失敗は経験です
  • 小さなステップはステップです
  • 小さく始める
  • 大きな夢
  • デモをする
  • 繰り返す

Python Veloceモードのみで、とても嬉しいです!しかし、その過程で、私が本当に探しているのは、私や他の人たちをJavascriptから解放することでしたが、さらに重要なことに、快適な方法で作成することができました。これにより、Scheme、DSL、モデル、そして最終的にはドメイン固有のモデル(http://dsmforum.org/を参照))。

Ira Baxterの対応について:

見積もりはまったく役に立ちません。私は、PythonJSとPythoniumの両方に多かれ少なかれ6か月の自由時間を費やしました。だからフルタイムの6ヶ月からもっと期待できます。私たちは皆、企業のコンテキストで100人年が何を意味し、何を意味しないのかを知っていると思います...

誰かが何かが難しい、またはより頻繁に不可能であると言うとき、私は「不可能である問題の解決策を見つけるのに時間がかかるだけだ」と答えます。

それが不可能であることが証明されていない場合、想像力の余地があります:

  • それが不可能であることを証明する証拠を見つける

そして

  • それが不可能な場合は、「劣った」問題があり、解決策がある可能性があります。

または

  • それが不可能ではない場合、解決策を見つける

それは楽観的な考え方だけではありません。私がPython-> Javascriptを始めたとき、誰もがそれは不可能だと言っていました。PyPyは不可能です。メタクラスが難しい。etc ... PyPyをScheme-> C論文(25年前)にもたらした唯一の革命は、自動JIT生成(RPythonインタープリターで書かれたベースのヒントだと思います)だと思います。

物事が「難しい」または「不可能」であると言うほとんどの人は理由を提供しません。C ++は解析が難しいですか?私は知っていますが、それでも(無料の)C ++パーサーです。悪は詳細にありますか?そんなこと知ってる。単独では不可能だと言っても役に立たない、「役に立たなかった」よりもさらに悪いことです。私は/programming/22621164/how-to-automatically-generate-a-parser-code-to-code-translator-from-a-corpusを介してこの質問について聞いた。

完璧何でしょう、あなたのために?それが次の目標を定義する方法であり、おそらく全体的な目標に到達します。

変換の方法よりもコードを変換しやすくするためにコードに適用できるパターンの種類(IoC、SOAなど)を理解することに、より関心があります。

少なくとも完璧な方法ではなく、ある言語から別の言語に翻訳できないパターンはありません。言語から言語への翻訳が可能であるため、これを最初に目指した方がよいでしょう。http://en.wikipedia.org/wiki/Graph_isomorphism_problemによると、2つのコンピューター言語間の翻訳はツリーまたはDAG同型であると私は考えています。どちらも完全に機能していることをすでに知っていても、...

フレームワーク-> APIとして視覚化したフレームワーク-> API変換は、生成されたコードを改善する方法として覚えておく必要があるかもしれません。例:プロローグは非常に具体的な構文ですが、Pythonで同じグラフを記述することでプロローグのような計算を行うことができます...プロローグからPythonへのトランスレータを実装する場合、Pythonでは統合を実装せず、Cライブラリで実装します。 Pythonistにとって非常に読みやすい「Python構文」を作成します。結局のところ、構文は私たちが意味を与える "ペイント"にすぎません(そのため、私はスキームを開始しました)。悪は言語の詳細にあり、私は構文について話していません。言語で使用される概念 getattributeでフック(あなたはそれなしで生きることができます)が、末尾再帰最適化のような必要なVM機能は対処するのが難しい場合があります。初期プログラムが末尾再帰を使用していないかどうかは関係ありません。ターゲット言語に末尾再帰がない場合でも、greenlet /イベントループを使用してエミュレートできます。

ターゲット言語とソース言語については、以下を探します。

  • 大きく具体的なアイデア
  • 小さな共通のアイデア

これから出てきます:

  • 翻訳しやすいもの
  • 翻訳が難しいもの

また、何が高速コードと低速コードに変換されるかを知ることもできます。

stdlibやライブラリの問題もありますが、明確な答えはありません。それはあなたの目標によって異なります。

慣用的なコードまたは読み取り可能な生成コードにも解決策があります...

PHPのようなプラットフォームを対象とすることは、低速またはクリティカルパスのC実装を提供できるため、ブラウザを対象とするよりもはるかに簡単です。

あなたの最初のプロジェクトがPythonをPHPに変換することを考えると、少なくとも私が知っているPHP3サブセットでは、veloce.pyのカスタマイズが最善の策です。PHPにveloce.pyを実装できる場合は、おそらく準拠モードを実行できるでしょう...また、PHPをPHPのサブセットに変換できれば、php_veloce.pyで生成できます。これは、PHPをveloce.pyが消費できるPythonのサブセット。これは、PHPをJavascriptに変換できることを意味します。ただ言って...

これらのライブラリを確認することもできます。

また、このブログ投稿(およびコメント)に興味があるかもしれません:https : //www.rfk.id.au/blog/entry/pypy-js-poc-jit/


1対1のコンピューター言語からコンピューター言語への翻訳について私にとってスリルが残る唯一のものは、stackoverflow.com
questions / 22621164 /…

私はデータ型について他の答えを2番目に述べます。Pythoniumでは、asm.jsなしで準拠モードで正しい整数型と浮動小数点型をサポートすることさえ計画していませんでした。
amirouche

OK、100K SLOCのPythonパッケージを渡して、それを「トランスレーター」で実行すると、動作するプログラムが得られますか?それを修正するために、翻訳後の手作業はどれくらいかかりますか?ここであなたが言ったのは、「ASTを構築するPythonの既存の優れたパーサーがあれば、6か月で部分的なトランスレーターを構築できる」というものでした。誰も驚かない。6か月は、ほとんどの人の基準では「ある種の簡単」ではありません(別のコメントから引用)。残りの問題を解決するには、さらに努力が必要です。私の答えは、基本的に「これを行うのは簡単ではない」、「一般的な方法で行うのは難しい」と述べた。
Ira Baxter

... OPの当初の要望に対する最後のポイント:「理想的には(比較的)簡単に他の言語を追加できる」
Ira Baxter

特にあなたが何をしているのかを知っているとき、それは簡単で、それに続くことは難しくはありません、それは物事を成し遂げることの問題です。あなたが質問に固有の何かをどこで扱っているのかわかりません。あなたはあなたの会社がそれをすることを4または5段落で言っています、そしてそれは難しいです。しかし、そうでなければ、あなたは主題についてFUDを広めている一方で、あなたはstackoverflow.com/questions/22621164/…にいるような話題から外れています。フルタイムの6か月で、私は完全な翻訳者を書いたでしょう。
amirouche 2014

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.