首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Python / Boo / Ruby类语法编译为C/ C++ / LLVM / Javascript的工具(使用JS ArrayBuffer实现速度)

将Python / Boo / Ruby类语法编译为C/ C++ / LLVM / Javascript的工具(使用JS ArrayBuffer实现速度)
EN

Stack Overflow用户
提问于 2013-03-23 13:55:31
回答 2查看 1.5K关注 0票数 7

我正在尝试将使用Pythonic语义编写的代码自动编译/转换为本地的、快速的Javascript代码。

有什么工具可以做到这一点,可以使用Java等工具提供良好的调试支持?

有人做过这个吗?

为什么?

我试图用复杂的主循环、时间线、一些物理模拟和一些复杂的交互来编写一些可视化代码。这是一个实际的CPU绑定问题。

使用Javascript编写并在它的浏览器环境中进行测试要比在一个体面的IDE中运行的Java、.NET或Python更难调试。但是要用复杂的客户端代码进行大规模的web开发,至少需要编译到Javascript,如果不是直接在Javascript中编写的话。

背景:的最新进展

Emscripten允许将C/C++编译成Javascript,由于ArrayBuffer的类型化数组支持和新的browser JS引擎,它可以在浏览器中以更高的效率运行,因为ASM.jshttp://jlongster.com/Compiling-LLJS-to-asm.js,-Now-Available-利用了Mozilla最近的速度改进(其他供应商可能很快也会这样)。

http://altjs.org/列出了大量的Javascript替代词,但还没有特别关注最近的速度改进或良好的语义,但它正在成为人们使用更好工具为浏览器编写代码的常见地方。特别是Emscripten有https://github.com/kripken/emscripten/wiki

已考虑的可能选项:

  • Shedskin -目前我尝试让Shedskin工作,但我的C++/C技能有限(Emscripten只为它使用的Boehm灵感垃圾收集器公开了一个C,而且Shedskin需要一个C++垃圾收集类,因为它的对象还不存在)。
  • 空载燕子/ RPython,到LLVM -还不能在Ubuntu上正确地设置
  • Boo to Java然后转到LLVM (还不能在我的Ubuntu系统上安装)

附加约束:

  • 我需要在我的Ubuntu系统上使用这个。
  • 编译后的Javascript应该小于1MB。
  • 使用本机语言(也是交叉编译的)进行调试仍然是可能的,允许利用现有的调试工具。

“构建指令表的过程应该是非常有趣的。它永远不会成为苦力的真正危险,因为任何相当机械的过程都可能被移交给机器本身。”--艾伦·M·图灵,1946年

EN

回答 2

Stack Overflow用户

发布于 2013-03-25 09:36:45

您想要一种高级别的动态语言,它可以编译成高效的低级别JavaScript?没有这回事。如果动态语言是快速的,我们一开始就不需要asm.js。

如果您想要编写编译成高效JavaScript的代码,您必须学习一种较低级别的语言。Emscripten之所以快速,是因为它使用的是一种低级语言(C/C++),它允许比常规JavaScript更好地优化编译器。这也是为什么asm.js和LLVM可以更快的原因。它们的速度来自于不具有动态类型、垃圾收集(特别是这使得可以将ArrayBuffer用于内存)和其他高级特性。

底线是。没有将具有Pythonic语义的语言编译成本地和快速Javascript代码的工具。根据语义的含义,不太可能出现这样的东西,因为Python本身是一种缓慢的语言。

现在生成快速JavaScript的最佳选择是Emscripten。您也可以考虑使用LLJS或手工编写快速JavaScript (Chrome有此调试工具)。

此外,考虑到你问题的标题,你非常关心语法。你不应该这样。在为作业选择合适的语言时,语法是最不重要的因素之一。

票数 2
EN

Stack Overflow用户

发布于 2013-07-22 21:35:03

既然您自己提到了脱落皮,我想您可以分享一些经验(并解释在您看来到底缺少了什么,除了它的输入是一个受限的python语法)。我还可以假设Cython/Pyrex是不可接受的(由于语法限制)。

如果对您来说,shedskin太过处于alpha阶段,那么您可能会寻找类似于南巴项目的东西,它包括一个将动态python编译到LLVM中的编译器,以及llvm-py,它允许链接LLVM公开的字节码,类似于ctype允许链接共享库和构建LLVM编译器。

下面是博客中的一个片段,展示了如何使用Numba作为numpy的JIT (包括。与等效Cython代码的性能比较):

代码语言:javascript
复制
import numpy as np
from numba import double
from numba.decorators import jit

@jit(arg_types=[double[:,:], double[:,:]])
def pairwise_numba(X, D):
    M = X.shape[0]
    N = X.shape[1]
    for i in range(M):
        for j in range(M):
            d = 0.0
            for k in range(N):
                tmp = X[i, k] - X[j, k]
                d += tmp * tmp
            D[i, j] = np.sqrt(d)

Emscripten应该允许您公开并调用python -> llvm -> JS代码,如下所述:https://github.com/kripken/emscripten/wiki/Interacting-with-code

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15587572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档