为虚拟机翻译Python

为虚拟机翻译Python,python,parsing,compiler-construction,abstract-syntax-tree,vm-implementation,Python,Parsing,Compiler Construction,Abstract Syntax Tree,Vm Implementation,我目前正在从事一个项目,该项目涉及一个新的更快的Linux上Python执行环境/VM。python源代码被解析为中间AST,并进行分析,目标VM的代码被JIT生成和缓存。由于所提议的机器的JIT特性,速度是必不可少的,我尽可能地用本地语言编写它。目前,它完全用C语言实现,只与编译器模块有一个python接口。目前,我能够使用Python编译器模块构建AST并将其保存在内存中 例如,代码: class Test: def testFunc(arg1): print 'Ar

我目前正在从事一个项目,该项目涉及一个新的更快的Linux上Python执行环境/VM。python源代码被解析为中间AST,并进行分析,目标VM的代码被JIT生成和缓存。由于所提议的机器的JIT特性,速度是必不可少的,我尽可能地用本地语言编写它。目前,它完全用C语言实现,只与编译器模块有一个python接口。目前,我能够使用Python编译器模块构建AST并将其保存在内存中

例如,代码:

class Test:
    def testFunc(arg1):
        print 'Arg is ' + arg1
生成AST

Module(None, Stmt([Class('Test', [], None, Stmt([Function(None, 'testFunc', ['arg1'], [], 0, None, Stmt([Printnl([Add((Const('Arg is '), Name('arg1')))], None)]))]), None)]))

我想知道的是一种有效的方法,可以将这个AST解析成一个可操作的数据结构,比如一棵树,它可以被遍历并发出目标代码。我不知道是使用Bison或Lemon之类的解析器生成器,还是手动标记并解析它。由于AST是在广泛的错误检查之后获得的,因此没有进一步的错误检查,因此我认为解析器生成器是多余的。Python本身提供了AST步行器,但它降低了速度。但我真的不太确定如何手动破译它。我非常感谢任何算法或建议,或者如果可能的话,一个本地语言实现。

Python已经有了一个快速解析器(请参阅Python源代码中的)。通过调用创建解析器,并通过调用向其发送令牌。它构建了
节点
对象的树(请参见):

typedef结构节点{
短n_型;
char*n_str;
国际n_lineno;
国际n_col_offset;
国际儿童;
结构节点*n子节点;
}节点;

因此,如果模块速度太慢,请使用C接口直接处理解析树。

您可能希望将此问题移至
ast
中的
T
中,ast代表
树。它已经是一个可以遍历的树,例如,或者另一个简单的例子:我的意思是,我从Python编译器模块获得了一个文本字符串,并希望将其解析为内存中的一个树,最好是使用本机语言。我尝试了python AST walker,但对于真正庞大的代码来说,它有点慢。我需要的是一个简单的系统,它可以解析并给出节点名和值。让Python生成AST并将其转储到字符串表示中并不慢?然后,您可能应该首先尝试自己进行遍历(可能使用C代码,但Python将更容易进行原型化,并且可能会做到这一点),而不是使用visitor接口。顺便说一句:也许您应该首先解决困难和创新的部分,即创建更快的VM+JIT编译器。因为这与您将Python源代码转换为VM指令的方式无关,所以稍后/同时优化该部分就很容易了。多亏了你,整个程序都是用C语言编写的,没有Python依赖项!谢谢