web-dev-qa-db-ja.com

別のプログラミング言語への翻訳を容易にするために、コードにどのようなパターンを適用できますか?

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

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

  • また、IOCと依存性注入も調べています。これにより、変換プロセスが容易になり、エラーが発生しにくくなります。

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

  • その後、AST、シンボルテーブル、および制御フローを作成できます。

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

「これは一体何なの?」と尋ねる前に答えは...興味深い学習体験になります。これを簡単にする方法についての洞察があれば、私に知らせてください。


編集:

私は、どのようにコードに適用できるパターンを知って、コードを翻訳しやすくする(つまり、IoC、SOA?))かを知りたいと思っています。

95

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

これを行うために必要な機械の量wellは膨大です(特に、複数の言語でこれを一般的な方法で行いたい場合)。そして、信頼性の低い定義を持つ言語用の信頼性の高いパーサーが必要です(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行の翻訳されたプログラムのコンテキストでは翻訳、理解、および変更が困難です。それには多大な努力が必要です。 100万行レベルでは、これは実際には不可能です。 (驚くべきことに、自動化されたツールに不信感を持ち、数百万のラインシステムを手作業で翻訳することを主張する人々がいます;それは偶数harderであり、通常は長い時間の遅れで苦痛を感じる、高コスト、しばしば完全な故障。)

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

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

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

119
Ira Baxter

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

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

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

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

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

13
Eli Bendersky

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

1つの言語を実行する場合、それは簡単です。もっとやりたい場合は、もう少し難しくなりますが、それほど難しくありません。最も難しい部分は、チューリング完全言語は別のチューリング完全言語ができることを行うことができますが、組み込みデータ型は言語が驚異的に行うことを変更できることです。

例えば:

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

複製するC++コードのlotを取ります(まあ、いくつかのループ構造でかなり短くできますが、それでも可能です)。

それは少し余計なことだと思います。

言語文法に基づいたトークナイザー/パーサーを書いたことがありますか?それがこのプロジェクトの主要な部分であるので、もしそうでないなら、あなたはおそらくそれをする方法を学びたいでしょう。私がやることは、基本的なチューリング完全な構文を考え出すことです-Python bytecode に非常に似たものです。それから、言語文法(おそらく [〜#〜] bnf [〜#〜] )を使用し、文法に基づいて言語を中間言語にコンパイルします。その後、逆の操作を行います-create文法に基づいて、言語からターゲット言語へのパーサー。

私が見る最も明白な問題は、最初は恐らく恐ろしく非効率なコードを作成することです。特に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と同じくらい強力な言語を紹介します。

5
Wayne Werner

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

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

PHPとPythonは、多くの点で互いに同じ言語ですが、構文は異なります。困難な部分は克服されています。文法形式とデータ構造のセマンティックの違い。たとえば、Pythonにはリストと辞書がありますが、PHPにはassoc配列のみがあります。

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

ああ、Pythonには静的型がないので、方法に応じて数字、文字列、またはオブジェクトを追加する「python_add」のような関数PHP Pythonそれを行います。

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

3
Ian

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

Pythoniumマーケティングのように見えても、最初から最善の解決策まで、私が試したすべては本当にそうではありません(ネチケットにとって何かが正しくないと思われるなら遠慮なく教えてください):

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

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

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

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

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

それから私は、SkulptのようなJavascriptで完全に記述されたブライソンを発見しました。コンパイルの必要はなく、たくさんの綿毛が... JavaScriptで書かれています。

このプロジェクトの過程で最初の行が書かれて以来、私はPyPyについて、そしてPyPyのJavaScriptバックエンドでさえも知っていました。はい、見つかった場合、PyPyからJavaScriptで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タイプはありません)
  • javascript配列のみを反復処理できる(配列内の場合)
  • JavaScriptへの透過的なアクセス:Pythonコードで配列を記述すると、javascriptで配列に変換されます。これは、競合他社に対する使いやすさの点で最大の成果です。
  • Pythonソースで定義された関数をjavascript関数に渡すことができます。デフォルトの引数が考慮されます。
  • JavaScriptに変換される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 793 SLOC +約100 SLOCの共有コードにあります。他の翻訳者と。

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

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

  • Pythonの_spam.Egg_は常にgetattribute(spam, "Egg")に変換されるasm.jsまたはその他のものを使用します。
  • メソッド解決の順序:Pythonで記述されたアルゴリズムでも、Python Veloce互換コードに変換することは大きな試みでした。
  • getattributre:実際のgetattribute解決アルゴリズムはややトリッキーであり、データ記述子をまだサポートしていません
  • メタクラスクラスベース:コードを接続する場所は知っていますが、それでも...
  • 最後に、少なくともsome_callable(...)は常に「call(some_callable)」に変換されます。私の知る限り、翻訳者は推論をまったく使用していません。そのため、呼び出しを行うたびに、呼び出し対象のオブジェクトの種類を確認する必要があります。

https://bitbucket.org/amirouche/pythonium/src/33898da731ee2d768ced3​​92f1c369afd746c25d7/pythonium/compliant/runtime.py?at=master Pythonと互換性があり、Python Veloce。

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

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

  • var/global:何かをvarにできるようにするには、varにではなく、何に必要かを知らなければなりません。特定のブロックで作成された変数を追跡するブロックを生成し、生成された機能ブロックの上に挿入する代わりに、実際に子ノードにアクセスして関連コードを生成する前にブロックに入るときに、重要な変数の割り当てを探します。
  • yield、ジェネレータはまだ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から解放することでしたが、もっと重要なことは、快適な方法でcreateできることです。これにより、Scheme、DSL、Models、そして最終的にドメイン固有のモデル(cf. http://dsmforum.org/ )に導かれました。

Ira Baxterの対応について:

推定はまったく役に立ちません。 PythonJSとPythoniumの両方で、ほぼ6か月の自由時間を費やしました。だから、フルタイムの6か月でもっと期待できます。私たちは皆、企業の文脈で100人年が何を意味し、何を意味しないのかを知っていると思います...

誰かが何かが難しいかもっと頻繁に不可能だと言うとき、私は「不可能な問題の解決策を見つけるのに時間がかかるだけだ」と答えます。そうでなければ、この場合数学的な証明が不可能であると証明される場合を除いて、不可能はないと言いました...

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

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

そして

  • それが不可能な場合、解決策を得ることができる「劣った」問題があるかもしれません。

または

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

楽観的な考えだけではありません。 Python-> Javascriptを開始したとき、誰もが不可能だと言っていました。 PyPyは不可能です。メタクラスが難しすぎる。 etc ... 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/

2
amirouche

Valaコンパイラ を見ると、Vala(C#に似た言語)をCに変換できます。

0
ptomato