簡體   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