互換性
このセクションでは、ECMAScriptの方言、拡張、フレームワーク、およびテスト・スイートとDuktapeの互換性について説明します。
ECMAScript E5 / E5.1
Duktapeの主な互換性目標は、ECMAScript E5/E5.1互換であることです。しかし、ES5の機能セマンティクスは、より新しい仕様バージョンで互換性のない変更が行われた場合、ES2015(またはそれ以降)に更新されます。現在の互換性レベルはかなり高いはずです。
ECMAScript 2015 (E6)
DuktapeはECMAScript 2015(E6)の機能を一部実装していますが、一般的にE6との互換性はまだありません。
ECMAScript 2016(E7)
DuktapeはECMAScript 2016(E7)からいくつかの機能を実装していますが、一般的にE7との互換性はまだありません。
ECMAScript E3
E5/E5.1仕様で要求される以外に、ECMAScript E3との互換性を維持するための努力はしていません。
CoffeeScript
CoffeeScriptは、Duktapeと互換性があるはずのJavaScriptにコンパイルされます。既知の互換性の問題はありません。
いくつかのCoffeeScriptのサンプルが配布物に含まれています。単に examples/coffee/ で make を実行するだけです。例えば、hello.coffee:
print 'Hello world!'
print 'version: ' + Duktape.version
コンパイルすると
(function() {
print('Hello world!');
print('version: ' + Duktape.version);
}).call(this);
Coco
CoffeeScriptと同じく、CocoはJavascriptにコンパイルします。既知の問題はありません。
LiveScript
CoffeeScript と同様に、LiveScript は Javascript にコンパイルされます。既知の問題はありません。
TypeScript
TypeScript は Javascript にコンパイルされます。Microsoft TypeScript コンパイラ(ES5/CommonJS モード)を使って TypeScript をコンパイルし、Duktape を使って結果の Javascript を実行しても、既知の問題はありません。また、DuktapeでTypeScriptコンパイラーを実行することも可能です。
Underscore.js
Underscore.jsは、プレーンなECMAScriptに多くの便利なユーティリティを提供します。Duktapeは、Underscoreのほぼ全てのテストケースをパスします。現在の互換性ステータスについてはunderscore-status.rstを参照してください。
Test262
test262はE5.1互換性をテストするためのテスト・スイートですが、標準のE5.1以外のテストも含まれています。Duktape は test262 のほぼ全てのケースに合格しています。現在の互換性ステータスは test262-status.rst を参照してください。
Asm.js
asm.js は「コンパイラのための低レベルで効率的なターゲット言語として使用できる、JavaScript の厳密なサブセット」です。JavaScriptのサブセットとして、asm.jsの型注釈を使った関数は、Duktapeと完全に互換性があるはずです。しかし、Duktapeはasm.jsを特にサポートしておらず、asm.jsのコードを最適化することはありません。実際、asm.jsのコードは不要なバイトコードを生成し、通常のECMAScriptのコードよりも実行速度が遅くなります。asm.jsによって指定された "use asm "指示は、Duktapeでは無視されます。
Emscripten
Emscriptenは、C/C++をJavascriptにコンパイルします。Duktapeは現在(Duktape 1.5.0時点)Emscriptenと互換性があり、Emscriptenのfastcompが使用できるES2015 TypedArrayをサポートしています。
Duktapeコンパイラが仮想レジスタを使い果たすため、大規模なプログラムは失敗する可能性があります。また、Duktapeはインタプリタ型エンジンであるため、性能はやや制限されます。現在の互換性の状況は emscripten-status.rst を見てください。
Duktape自体はEmscriptenでコンパイルされているので、例えばWebページの中でDuktapeを実行することも可能です(Dukweb REPLを参照)。
Lua.js
lua.jsは、LuaのコードをJavascriptに変換します。生成されたJavascriptを実行する上で既知の問題はありませんが、Duktapeがlua.jsが期待するconsole.logを提供しないことが挙げられます。これは簡単に改善できます。例えば、以下のように前置きをします。
console = { log: function() { print(Array.prototype.join.call(arguments, ' ')); } };
JS-Interpreter
JS-Interpreterは、JavascriptをJavascriptの中で解釈します。JS-InterpreterはDuktapeと一緒に動作しますが、DuktapeはJS-Interpreterが期待するウィンドウを提供しません。これは、プリペンドすることで修正可能です。
window = {};