96

私は、あるプログラミング言語から別のプログラミング言語にコードを翻訳することを目的としたサイドプロジェクトに着手しています。私が始めている言語はPHPとPythonです(PythonからPHPへの方が簡単に始められるはずです)が、理想的には他の言語を(比較的)簡単に追加できるでしょう。計画は次のとおりです。

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

  • また、IOCと依存性注入も検討しています。これらは、翻訳プロセスを容易にし、エラーが発生しにくくなる可能性があるためです。

  • Pythonのパーサーモジュールを利用します。これにより、抽象構文ツリーをいじることができます。どうやら私がPHPで得ることができる最も近いものはtoken_get_all()であり、これは始まりです。

  • それ以降、AST、シンボルテーブル、および制御フローを構築できます。

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

「これのポイントは一体何なのか」と尋ねる前に。答えは...それは興味深い学習体験になるでしょう。これをそれほど難しくしない方法について何か洞察があれば、私に知らせてください。


編集:

変換方法よりも、コードの変換(IoC、SOA?など)を容易にするために、コードにどのようなパターンを適用できるかを知りたいと思っています。

4

6 に答える 6

124

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

これをうまく行うために必要な機械の量は膨大であり(特に、一般的な方法で複数の言語に対してこれを実行できるようにしたい場合)、信頼性の低い定義を持つ言語に対して信頼性の高いパーサーが必要です(PHPはこれの完璧な例です) )。

言語から言語への翻訳者を作成したり、試したりすることを考えても問題はありませんが、実際の言語では、これが予想よりもはるかに大きな作業であることがわかると思います。DMSだけに約100人年を投資し、「信頼できる」言語定義(PHP用に苦労して構築したものを含む)にさらに6〜12か月、C++などの厄介な言語にさらに多くの投資を行っています。それは「学習体験の地獄」になるでしょう。それは私たちのためでした。(上記の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行の翻訳プログラムのコンテキストでは、翻訳、理解、および変更が困難です。それには多大な労力が必要です。百万回線レベルでは、これは実際には不可能です。より困難であり、彼らは通常、長い時間の遅れ、高いコスト、そしてしばしば完全な失敗で苦痛を感じます。)

大規模なシステムを翻訳するために撮影しなければならないのは、90年代の高いコンバージョン率です。そうしないと、翻訳アクティビティの手動部分を完了できない可能性があります。

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

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

于 2010-08-11T17:11:02.000 に答える
14

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

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

astPython 2.6以降で利用可能なモジュールは、既製のASTを使用できるため、ニーズにはるかに適しています。私は昨年この記事を書きましたが、要するに、 PythonソースコードをASTに解析するparse方法を使用します。astこのparserモジュールは、ASTではなく解析ツリーを提供します。違いに注意してください

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

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

于 2010-08-14T14:07:20.553 に答える
5

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

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と同じくらい強力な言語を紹介します。

于 2010-08-18T22:43:55.363 に答える
3

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

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

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

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

ああ、Pythonには静的型がないので、Pythonの方法に従って数値、文字列、またはオブジェクトを追加する「python_add」のようなPHP関数を記述して信頼するのが最善かもしれません。

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

于 2010-08-17T12:08:17.113 に答える
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のマーケティングのように見えても、実際にはそうではありません(ネチケットに正しくないように思われる場合は、遠慮なく教えてください)。

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

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

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

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

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

それから私はSkulptのようにJavascriptで完全に書かれたbrythonを発見しました。コンパイルの必要はなく、多くの綿毛があります...しかしJavaScriptで書かれています。

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

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

私は、JavaScriptに簡単に変換できるPythonのサブセットをまとめることを考えてPythonJSを開始しました。最初は、過去の経験から、オブジェクト指向システムを実装することすらしませんでした。JavaScriptに翻訳するために私が達成したPythonのサブセットは次のとおりです。

  • 定義と呼び出しの両方でセマンティックな完全なパラメーターを持つ関数。これは私が最も誇りに思っている部分です。
  • while / if / elif / else
  • PythonタイプはJavaScriptタイプに変換されました(どのような種類のPythonタイプもありません)
  • forはJavascript配列のみを反復できます(in配列の場合)
  • JavaScriptへの透過的なアクセス:PythonコードでArrayを記述すると、javascriptでArrayに変換されます。これは、競合他社に対する使いやすさの点で最大の成果です。
  • 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のこの部分の直接の子孫は、PythoniumVeloceモードです。完全な実装は、@ https://bitbucket.org/amirouche/pythonium/src/33898da731ee2d768ced3 ​​92f1c369afd746c25d7/pythonium/veloce/veloce.py?at= master 793SLOC+他のトランスレータとの共有コードの約100SLOCにあります。

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で記述されたアルゴリズムを使用しても、PythonVeloce互換コードに変換することは大きな努力でした。
  • getattributre:実際のgetattribute解決アルゴリズムはちょっとトリッキーですが、それでもデータ記述子をサポートしていません
  • メタクラスクラスベース:コードをどこにプラグインするかはわかっていますが、それでも...
  • 最後になりましたが、some_callable(...)は常に「call(some_callable)」に変換されます。AFAIKトランスレータは推論をまったく使用しないため、呼び出しを行うたびに、呼び出されるオブジェクトの種類を確認する必要があります。

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

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

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

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

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

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

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/compatible/builtins/? at =masterをご覧ください

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

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

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

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

アイラ・バクスターの反応について:

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

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

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

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

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

また

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

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

物事が「難しい」または「不可能」であると言うほとんどの人は理由を提供しません。C ++は解析が難しいですか?それでも、それらは(無料の)C++パーサーであることを私は知っています。悪は詳細にありますか?そんなこと知ってる。一人では不可能だと言っても役に立たない、「役に立たない」よりもさらに悪いことは落胆し、ある人は他の人を落胆させるつもりです。この質問については、 https://stackoverflow.com/questions/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変換としてより適切に視覚化できるフレームワークは、生成されたコードを改善する方法として、まだ覚えておくべきものかもしれません。例:非常に特殊な構文としてのPrologですが、Pythonで同じグラフを記述することで、Prologのような計算を行うことができます... PrologからPythonへのトランスレーターを実装する場合、PythonではなくCライブラリで統合を実装します。 Pythonistにとって非常に読みやすい「Python構文」を考え出します。結局のところ、構文は私たちが意味を与える「絵画」にすぎません(それが私がスキームを始めた理由です)。悪は言語の詳細にあり、私は構文について話していません。言語getattributeで使用される概念フック(それがなくても生きることができます)が、末尾再帰の最適化などの必要なVM機能を処理するのは難しい場合があります。最初のプログラムが末尾再帰を使用していないかどうかは関係ありません。ターゲット言語に末尾再帰がない場合でも、グリーンレット/イベントループを使用してエミュレートできます。

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

  • 大きくて具体的なアイデア
  • 小さくて一般的な共有アイデア

これから明らかになります:

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

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

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/

于 2014-04-03T22:25:27.597 に答える
0

Vala(C#のような言語)をCに変換するValaコンパイラを見てみましょう。

于 2010-08-18T09:35:22.420 に答える