繁体   English   中英

用于编译Python / Boo / Ruby语法的工具,用于C / C ++ / LLVM / Javascript(使用JS ArrayBuffer提高速度)

[英]Tools for compiling Python / Boo / Ruby like syntax to C / C++ / LLVM / Javascript (using JS ArrayBuffer for speed)

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

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

有没有人这样做过?

为什么?

我正在尝试用复杂的主循环,时间轴,一些物理模拟和一些复杂的交互来编写一些可视化代码。 IE:它是一个实际的CPU绑定问题。

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

背景:最新进展

Emscripten允许将C / C ++编译为Javascript,由于ArrayBuffer的类型化阵列支持和新的浏览器JS引擎,可以在浏览器中提高效率,因为ASM.jsLLJS利用了Mozilla最近的速度改进(其他供应商可能很快跟随)。

Altjs.org有一个Javascript holternaltives的清单,但是还没有专注于最近的速度改进或特别好的语义,但它已成为人们用更好的工具为浏览器编码的常见地方。 特别是Emscripten有很多令人惊叹的演示

已考虑的可能选择:

  • Shedskin - 目前我已经尝试过让Shedskin工作,但我的C ++ / C技能有限(Emscripten只为它使用的Boehm灵感垃圾收集器公开了一个C API,Shedskin需要一个C ++垃圾收集类来处理它的对象,它不存在然而)。
  • UnLden Swallow / RPython,到LLVM - 尚未能在Ubuntu上正确设置
  • Boo到Java再到LLVM(还没能在我的Ubuntu系统上安装)

附加限制:

  • 我需要在我的Ubuntu系统上使用它。
  • 编译的Javascript应该小于1 MB
  • 仍然可以使用本地语言(也是交叉编译)进行调试,从而可以利用现有的调试工具。

“构建指令表的这个过程应该非常有趣。它不需要成为苦差事的真正危险,因为任何非常机械化的过程都可能被转移到机器本身。” - 艾伦·图灵,1946年

您想要一种高级动态语言,可以编译为高效的低级JavaScript吗? 哪有这回事。 如果动态语言很快,我们首先不需要asm.js。

如果您想编写编译为高效JavaScript的代码,您将需要学习较低级别的语言。 Emscripten快速的原因是因为它从低级语言(C / C ++)编译,允许比常规JavaScript更好的编译器优化。 这也是asm.js和LLVM可以更快的原因。 他们从没有动态类型,垃圾收集(这特别是使得可以使用ArrayBuffer用于内存)和其他高级功能得到他们的速度。

底线是。 没有工具可以将Pythonic语义编译成本机和快速Javascript代码。 根据你对语义的意思,不太可能出现这样的事情,因为Python本身就是一种缓慢的语言。

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

另外,考虑到你的问题的标题,你非常关心语法。 你不应该。 在为工作选择正确的语言时,语法是最不重要的因素之一。

既然你自己提到了脱壳 ,我会想象一下你可以分享一些你的经验(并解释你的看法究竟是什么样的,除了它的输入是一个受限制的python语法之外)。 我还可以假设Cython / Pyrex是不可接受的(由于语法限制太多)。

如果在你的alpha阶段对于脱壳太多了,那么你可能正在寻找像Numba项目这样的东西,其中包括一个动态python到LLVM的编译器以及llvm-py,它允许链接LLVM暴露的字节码,类似于ctypes允许链接共享库和构建LLVM IR编译器。

这是博客中的一个剪辑,其中显示了如何使用Numba作为JIT进行numpy(包括与等效Cython代码的性能比较):

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM