好奇心から、ファイルをターゲットとするコンパイラはたくさんあり.pyc
ますか?
少しグーグルした後、私が見つけることができるのは次の2つだけです。
それで…もっとありますか?
(ちなみに、私はSchemeからpycへのコンパイラを書きたいので、これについて考えました)
(補足として、Scheme から pyc へのコンパイラが役立つとは思いませんが、Scheme と Python の両方の内部構造を学ぶための素晴らしい言い訳になるでしょう)
好奇心から、ファイルをターゲットとするコンパイラはたくさんあり.pyc
ますか?
少しグーグルした後、私が見つけることができるのは次の2つだけです。
それで…もっとありますか?
(ちなみに、私はSchemeからpycへのコンパイラを書きたいので、これについて考えました)
(補足として、Scheme から pyc へのコンパイラが役立つとは思いませんが、Scheme と Python の両方の内部構造を学ぶための素晴らしい言い訳になるでしょう)
「Scheme から pyc へのコンパイラを書きたい」。
脳が痛い!なぜそれをしたいのですか?Python バイト コードは、Python 言語のニーズを満たすように特別に設計された中間言語であり、Python のニーズに合わせて調整された Python 仮想マシンで実行するように設計されています。最近の Python 開発の最も重要な分野のいくつかは、 Jython (JVM)、IronPython (.NET)、PyPy、Unladen Swallowプロジェクト (CPython をLLVMに移行)など、他の「仮想マシン」に Python を移行することです。に基づく表現)。別の非常に異なる言語 (Scheme) の構文とセマンティクスを別の高水準言語の中間表現に押し込もうとすることは、(問題が何であれ) 間違ったレベルで問題を攻撃しているようです。したがって、一般的に、多くの .pyc コンパイラが存在するようには見えず、それには十分な理由があります。
私は数年前に、"Noodle" と呼ばれる Lisp に似た言語を受け入れ、Python バイトコードを生成するコンパイラを書きました。特に役立つことはありませんでしたが、Common Lisp をよりよく理解し (その機能のいくつかをコピーしました)、Python をよりよく理解するための非常に良い学習経験でした。
Python を生成して Python コンパイラに渡すのではなく、Python バイトコードを直接ターゲットにする方が便利な 2 つの特定のケースを考えることができます。
nonlocal
キーワードの前) では、バイトコード ハッカーに頼らずにクローズド オーバー変数の値を変更することはできません。代わりに値を変更できるため、たとえばリストを参照するクロージャーを作成し、その最初の要素を内部スコープから変更するのが一般的です。それは本当に迷惑になる可能性があります。ただし、制限は構文の一部であり、Python VM ではありません。私の言語には明示的な変数宣言があったため、変更可能なクローズオーバー値を持つ「通常の」クロージャーを正常に提供できました。ええ、それはおそらく価値があるよりもはるかに多くの作業ですが、私はそれを楽しんでいました、そしてあなたもそうかもしれません.
CPython に集中することをお勧めします。
http://www.network-theory.co.uk/docs/pytut/CompiledPythonfiles.html
Scheme から .pyc へのトランスレータではなく、Scheme から Python へのトランスレータを作成し、CPython に .pyc への変換を処理させることをお勧めします。(この方法には先例があります。最初の C++ コンパイラはCfrontで、C++ を C に変換し、残りはシステムの C コンパイラに任せました。)
私がSchemeについて知っている限りでは、SchemeをPythonに翻訳するのはそれほど難しくありません。
1 つの警告: Python 仮想マシンは、Scheme 自体ほど高速ではない可能性があります。たとえば、Python は自動的に末尾再帰を反復に変換しません。また、Python のスタックは比較的浅いため、実際には、トランスレーターの末尾再帰を反復に変える必要があります。
おまけとして、Unladen Swallow が Python を高速化すると、Scheme から Python へのトランスレータが恩恵を受け、その時点で実用的になることさえあります!
これがあなたにとって楽しいプロジェクトのように思えたら、私はそれを試してみてください. すべてのプロジェクトがすぐに実用化される必要はありません。
PS もう少し実用的なプロジェクトが必要な場合は、AWK から Python へのトランスレータを作成することをお勧めします。そうすれば、従来の AWK スクリプトを使用している人は、簡単に Python に移行できます!
ご参考までに、単純な LISP から Python へのおもちゃのコンパイラを作成しました。実際には、これは LISP から pyc へのコンパイラです。
見てください: sinC - 最も小さな LISP コンパイラ
おそらくパーティーには少し遅れていますが、まだ興味がある場合は、clojure-py プロジェクト (https://github.com/halgari/clojure-py) が clojure の重要なサブセットを Python バイトコードにコンパイルできるようになりました。いくらかの助けはいつでも大歓迎です。
バイトコードをターゲットにすること自体はそれほど難しいことではありませんが、1 つのことを除いて、プラットフォーム間で安定していません (たとえば、MAKE_FUNCTION は Python 3 ではスタックから 2 つの要素をポップしますが、Python 2 では 1 つしかポップしません)。スポット(afaict)-したがって、おそらくいくつかの抽象化レイヤーが必要です。