12

Pythonインタープリターをハックして、小さなDSLを作成してみたいと思います。この理論的なコード(LINQ式ツリーと同様)のようなことを実行できるモジュールはありますか?

expression_tree = Function(
    Print(
        String('Hello world!')
    )
 )
compile_to_bytecode(expression_tree)

それとも、Pythonソースコードを生成する方が簡単でしょうか?これは、C、SWIG、またはCythonを使用することで簡単にできますか?

4

6 に答える 6

12

別の回答が示唆しているように、ツリーを介して作業しast、ツリーをバイトコードにコンパイルするのがおそらく最も簡単です。ソースを生成し、それらをコンパイルすることは、ほぼ同じくらい良いことです。

ただし、下位レベルのアプローチを調べるには、このページのリンクを確認してください。バイトプレイは特に便利です(現在、2.6または3. *では機能せず、2.4または2.5のみですが、トラッカーで現在説明されているように、2.6に修正するのは簡単だと思います)。私はPhilEbyの同様の機能を備えたBytecodeAssemblerを使用していませんが、作者の評判を考えると、チェックする価値があると確信しています。

于 2009-09-27T00:35:35.437 に答える
5

Python 2.Xでは、通常、compilerモジュールとそのastサブモジュールを使用してこれにアプローチします(ただし、このモジュールはバージョン2.6以降非推奨になっていることに注意してください)。Python 3.Xでは、を使用しastます。

どちらも、ソース/ASTから「ステートメントまたはcompile()で実行できるコードオブジェクト」に移行する関数を提供します。execeval()

于 2009-09-26T20:07:24.780 に答える
2

Pythonコードを生成して実行する方が簡単です。これを行うと、デバッガーが表示する実際のソースがあるため、より簡単にデバッグすることもできます。Pythonマガジンの7月号に掲載されているMalteBorchsの記事も参照してください。ここでは、特にこれについて説明しています。

于 2009-09-26T21:11:44.930 に答える
1

# codingFernando Meyerは最近、ディレクティブを使用してPythonの独自の拡張機能を指定する方法を説明するブログ投稿を作成しました。例(実際のフォーマット定義はpyspec.pytokenizer.pyにあります):

# coding: pyspec

class Bow:
    def shot(self):
        print "got shot"

    def score(self):
        return 5

describe Bowling:
    it "should score 0 for gutter game":
        bowling = Bow()
        bowling.shot()
        assert that bowling.score.should_be(5)
于 2009-09-26T20:25:00.300 に答える
1

Python3用に更新-非常に興味深いアセンブラーもありzachariahreed/byteasmます。

実際、Py3で私のために働いているのは1人だけです。それは非常に素晴らしくてきれいなAPIを持っています:

>>> import byteasm, dis
>>> b = byteasm.FunctionBuilder()
>>> b.add_positional_arg('x')
>>> b.emit_load_const('Hello!')
>>> b.emit_load_fast('x')
>>> b.emit_build_tuple(2)
>>> b.emit_return_value()
>>> f = b.make('f')
>>> f
<function f at 0xb7012a4c>
>>> dis.dis(f)
  1           0 LOAD_CONST               0 ('Hello!')
              3 LOAD_FAST                0 (x)
              6 BUILD_TUPLE              2
              9 RETURN_VALUE
>>> f(108)
('Hello!', 108)
于 2016-07-21T16:23:55.667 に答える
0

ここにある逆アセンブラモジュールをチェックしてください:

http://docs.python.org/library/dis.html

于 2009-09-26T20:02:45.067 に答える