【发布时间】:2013-12-21 06:22:54
【问题描述】:
我目前正在开展一个项目,该项目涉及在 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 walkers,但它会减慢它的速度。但是我真的不太确定如何手动破译它。我非常感谢任何算法或建议,或者如果可能的话,可以使用本机语言实现。
【问题讨论】:
-
您可能想将此问题移至cs.stackexchange.com
-
T中的ast代表tree。它已经是一棵可以遍历的树,例如 Simple example of how to useast.NodeVisitor? 或另一个简单的例子:Extracting “extra” docstrings from Python code? -
我的意思是我从 Python 编译器模块中将它作为文本字符串获取,并希望将其解析为内存中的树,最好使用本地语言。我尝试了 python AST walker,但对于非常大的代码来说它有点慢。我需要的是一个简单的系统来解析这个并给我节点名称和值。
-
让 Python 生成它的 AST 并将其转储为字符串表示并不慢?然后您可能应该首先尝试自己进行遍历(可能使用 C 代码,但 Python 更容易原型化并且可能会成功)而不是使用访问者界面。顺便说一句:也许您应该首先解决困难和创新的部分,即创建一个更快的 VM + JIT 编译器。由于这与您如何将 Python 源代码准确地转换为 VM 指令无关,因此稍后/同时优化该部分会很容易。
标签: python parsing compiler-construction abstract-syntax-tree vm-implementation