7

Pythonicセマンティクスで記述されたコードをネイティブで高速なJavascriptコードに自動的にコンパイル/変換しようとしています。

Javaなどのような素晴らしいデバッグサポートを備えた、これを行うことができるツールは何ですか?

誰かがこれをしましたか?

なんで?

複雑なメイン ループ、タイムライン、物理シミュレーション、および複雑な相互作用を含む視覚化コードを作成しようとしています。IE: これは実際の CPU バウンドの問題です。

Javascript を使用して記述し、そのブラウザー環境でテストすることは、適切な IDE で実行されている Java、.NET、または Python よりもデバッグが困難です。しかし、複雑なクライアント側コードを使用して実際の大規模な Web 開発を行うには、Javascript に直接記述しない場合でも、少なくとも Javascript にコンパイルする必要があります。

背景: 最近の進歩

Emscripten を使用すると、C/C++ を Javascript にコンパイルできます。これは、ArrayBuffer の型付き配列のサポートと新しいブラウザー JS エンジンにより、ブラウザーで効率的に実行できます。ASM.jsLLJSは Mozilla の最近の速度向上を利用するためです (他のベンダーはおそらくすぐに従う)。

Altjs.orgには Javascript の代替案の長いリストがありますが、最近の速度の向上や優れたセマンティクスにはまだ焦点を当てていませんが、人々がより優れたツールを使用してブラウザー用にコーディングするのが一般的になりつつあります. 特に Emscripten には素晴らしいデモがたくさんあります。

すでに考慮されている可能なオプション:

  • Shedskin - 現在、Shedskin を動作させようと試みましたが、C++/C のスキルが限られています (Emscripten は、使用する Boehm にインスパイアされたガベージ コレクター用の C API のみを公開しており、Shedskin にはオブジェクト用の C++ ガベージ コレクション クラスが必要ですが、これは存在しません)。まだ)。
  • Unladen Swallow / RPython から LLVM へ - Ubuntu ではまだ正しくセットアップできていません
  • Java を起動してから LLVM を起動します (私の Ubuntu システムではまだセットアップできませんでした)。

追加の制約:

  • これを Ubuntu システムで使用する必要があります。
  • コンパイルされた Javascript は、おそらく 1 MB 未満である必要があります
  • クロス コンパイルされたネイティブ言語でのデバッグも可能であり、既存のデバッグ ツールを利用できます。

「指示表を作成するこのプロセスは非常に魅力的です。非常に機械的なプロセスは機械自体に引き継がれる可能性があるため、面倒な作業になるという実際の危険はありません。」-- アラン M. チューリング、1946 年

4

2 に答える 2

2

効率的な低レベルの JavaScript にコンパイルされる高レベルの動的言語が必要ですか? そのようなことはない。動的言語が高速であれば、そもそも asm.js は必要ありません。

効率的な JavaScript にコンパイルされるコードを書きたい場合は、下位レベルの言語を習得する必要があります。Emscripten が高速である理由は、通常の JavaScript よりも優れたコンパイラの最適化を可能にする低水準言語 (C/C++) からコンパイルされるためです。それが、asm.js と LLVM が高速になる理由でもあります。それらは、動的な型、ガベージ コレクション (これは具体的にはメモリに ArrayBuffer を使用できるようにするものです) およびその他の高レベルの機能を持たないことから速度を得ます。

要点は。Pythonic セマンティクスを持つ言語をネイティブで高速な Javascript コードにコンパイルするためのツールはありません。また、セマンティクスの意味によっては、Python 自体が遅い言語であるため、そのようなことが発生する可能性は低いです。

高速な JavaScript を生成するための現時点での最適なオプションは、Emscripten です。LLJS や高速な JavaScript を手動で作成することも検討できます (Chrome にはこのためのデバッグ ツールがあります)。

また、質問のタイトルを考えると、構文について非常に心配しています。あなたはすべきではありません。仕事に適した言語を選択する場合、構文は最も重要でない要素の 1 つです。

于 2013-03-25T09:36:45.817 に答える
1

あなた自身がシェドスキンについて言及したので、あなたの経験の一部を共有できると思います(そして、入力が制限されたpython文法であることを除いて、あなたの意見ではシェドスキンが欠けているものを正確に説明してください)。また、Cython/Pyrex は受け入れられないと考えることもできます (文法上の制約が多すぎるため)。

shedskin がアルファ段階にある場合は、動的 python の LLVM へのコンパイラと、ctypes がリンクできるように LLVM で公開されたバイトコードをリンクできる llvm-py を含むNumbaプロジェクトのようなものを探しているかもしれません。共有ライブラリを作成し、LLVM IR コンパイラを構築します。

これは、numpy の JIT として Numba を使用する方法が示されているブログからの抜粋です (同等の 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 では、 https ://github.com/kripken/emscripten/wiki/Interacting-with-code で説明されているように、python -> llvm -> JS コードを公開して呼び出すことができます。

于 2013-07-22T21:35:03.797 に答える