【问题标题】:Translating Python for a Virtual Machine为虚拟机翻译 Python
【发布时间】: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 use ast.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


【解决方案1】:

Python 已经有一个快速解析器(请参阅 Python 源代码中的 Parser/parser.c)。您通过调用PyParser_New 创建解析器并通过调用PyParser_AddToken 向其发送令牌。它构建了一个node 对象树(参见Parser/node.h):

typedef struct _node {
    short        n_type;
    char         *n_str;
    int          n_lineno;
    int          n_col_offset;
    int          n_nchildren;
    struct _node *n_child;
} node;

所以如果ast模块太慢,使用C接口直接处理解析树。

【讨论】:

  • 正是如此。多亏了你,整个事情都在 C 中,没有 Python 依赖!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-24
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
相关资源
最近更新 更多