[英]Bad results with Emscripten compiling C++ to JavaScript & Asm.js
[英]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.js和LLJS利用了Mozilla最近的速度改进(其他供应商可能很快跟随)。
Altjs.org有一个Javascript holternaltives的清单,但是还没有专注于最近的速度改进或特别好的语义,但它已成为人们用更好的工具为浏览器编码的常见地方。 特别是Emscripten有很多令人惊叹的演示 。
已考虑的可能选择:
附加限制:
“构建指令表的这个过程应该非常有趣。它不需要成为苦差事的真正危险,因为任何非常机械化的过程都可能被转移到机器本身。” - 艾伦·图灵,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.