【问题标题】:Converting JavaScript into Python bytecode将 JavaScript 转换为 Python 字节码
【发布时间】:2012-05-11 00:23:34
【问题描述】:

我正在尝试在纯 Python 环境 (Google AppEngine) 中执行简单的 JavaScript 代码。

我尝试过 PYJON,但它似乎还不够成熟,无法真正使用(它不处理例如前向引用函数或 do-while 并且它挂在数组使用上)。

一个想法是使用 pynarcissus 将 JavaScript 转换为语法树,然后将此树转换为可以编译为 Python 字节码的 Python AST。

以前有人做过吗? 这个想法有什么问题吗?

【问题讨论】:

  • 为什么是 Python 字节码而不是 Python 源代码?您需要以编程方式翻译 JS 吗?
  • 如果您尝试在 GAE 上运行 Javascript,似乎转换为 Java 会更好——您可以通过 Rhino 在 JS 和 JVM 上运行。
  • 我认为 AST 是最接近解析的 JavaScript 的。最后,我将需要字节码来执行。但 Python 源代码也可以通过编程方式转换为字节码。
  • 为什么不把 JavaScript 翻译成 Python?
  • 你的大脑将 JS 翻译成 Python。

标签: javascript python google-app-engine


【解决方案1】:

我使用 ply 做了类似的事情,用于 VBScript 和我一直在研究的一种新语言,但我没有构建 AST 然后转换为 Python AST,而是构建 Python AST直接,使用它的节点类,偶尔子类化和覆盖一些不太适合的。

由于您可以依赖 pynarcissus 为 Javascript 构建 AST,转换 AST 可能更容易,但我认为值得检查使用它的解析器构建 Python AST 是否不是更好的方法。

据我所知,这种方法没有固有的问题,只要语言可以在句法上简化为通用方言。这是一项艰苦的工作,但可以做到。我这样做是因为我没有可用的解析器,并且编写一个仅仅构建 AST 是没有意义的。对于 VBScript,我只处理录制的宏,因此代码非常稳定,主要是单行代码。

【讨论】:

  • 我不想修改相当复杂的解析器(所以我可以让它与原始的同步)。
  • 存在固有的问题:Python 和 Javascript 不是简单的同一种语言,不同的语法。
  • 这不是一个固有的问题。这是一个问题,有一个解决方案,即在两个 AST 中找到一个公共子集。我们谈论的是 AST,因此它们来自的代码和语法并不重要,只要它们可以简化为相同的子集即可。您关于它们是不同语言的论点并没有指出这种方法存在固有问题,因为 Python 和 VBScript 也不是同一种语言,我做到了。实际上,我在解析 VBScript 中模棱两可的“=”时遇到的问题比创建有效的 Python AST 时遇到的问题更多。
  • 似乎以前没有人做过(对于 JavaScript)(至少我没有发现),挑战是将 JavaScript AST 转换为 Python AST 并创建运行时环境(范围、原型、JavaScript类)。好处是可移植(纯 Python)和可维护的解决方案(存在解析器和字节码生成)
【解决方案2】:

据我所知,在 Python 上没有完整且健壮的 Javascript 解释器实现。您最好的选择可能是使用 Java 中的 Rhino 解释器部署应用程序的替代版本,并将其作为 Web 服务与您的应用程序的主版本一起调用。

【讨论】:

    猜你喜欢
    • 2014-06-25
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    相关资源
    最近更新 更多