あらすじ
こちらでMikanOSのフォークTNTOSで使ったJavaScriptエンジンを紹介しましたが、
その色々試した結果、Duktapeの方が、機能が多く、簡単に導入でき、
TNTOSでも使えたためこちらを紹介します。
Duktapeとは
埋め込みやすいJavaScriptエンジンで、C言語で出来てます。
elkと比較したメリット
1. ES5準拠
ES5.1に準拠していて、さらにES6以降の一部も実装されています。
elkではまっさらで何も無かったのが、DuktapeではDate
も! Array
も! Number
も! 標準ライブラリがあります!!!!!!!!
そして文字列の長さもバイト数ではなくUnicodeコードポイント数です!!!
(これ強すぎる...)
(というかelkが弱すぎる...)
3. 型情報がある
DuktapeにはDuktape
というグローバル変数があったりしますが、
それに関する型がもちろん用意されています!!!!!
elkはまっさらでtsconfigにnoLib: true
とかlib: []
と書いてもエラーになって大変だったのでありがたい!!!!!(それは標準ライブラリの問題じゃん)
4. モジュールシステムが使える
モジュールシステムといってもCommonJSであり、モジュールローダーの実装等が必要ですが、CommonJSモジュールシステムが使えます!!!!
これでNodeJSライクAPIを実装できるね!
5. MITライセンス
見慣れたMITライセンスで、扱いやすいです。
一方elkはAGPLなのでソースコード公開したりライセンスを同じにする必要があって大変です。
elkと比較したデメリット
デメリットもあります。
1. メモリの融通が利きづらい
Duktapeはmalloc等でメモリを管理していて、組み込み環境では扱いづらいかもしれません。
そして、64KBのRAMで動作すると言っており、elkと比較すると大きいです。
一方elkはmallocを使わず、用意したバッファのみ使う構造で、
しかも100バイトのRAMで動作します。
Does not use malloc. Operates with a given memory buffer only
と主張しているぐらいです。
2. 使う標準ライブラリが多め
Duktapeはelkよりも使う標準ライブラリが多いです。
そのため、一部の環境ではDuktapeはコンパイルできないかもしれません。
QuickJSも同じように、TNTOSの環境では
標準ライブラリが不足していてコンパイルできませんでした。
3. 値を作るときにスタックを使う必要がある
DuktapeはLuaと同じように、スタックを使って値を作る必要があります。
これがまあまあ大変で、TNTSuperManも過去にLua開発でスタック地獄に苦しめられていました。
一方elkは、変数ベースのAPIで、スタックに苦しめられることは無く、直感的に理解できます。
elkとの共通点
1. 導入が楽
tar.xzをダウンロードすれば、src-noline
ディレクトリの中に
C言語ソースファイル一つとヘッダーだけの状態であるので、
elkのように楽々導入できます
2. 標準ライブラリが少ない状態でも使える
QuickJSはfenv.h
のライブラリが無くて使えませんでしたが、
elkと同じく、Duktapeはそのようなライブラリが不要で使えました。
しかし一部環境では使えないこともあるのでご了承ください。
終わりに
これは選択肢の一つで、他の手段も沢山あります。
制限が厳しい所ではelkが良かったり、
標準ライブラリが豊富な所ではQuickJSが良かったり、
Apple製品以外使えない生粋のApple信者にはJavaScriptCoreが良かったりします。
そもそも、JavaScriptにこだわらず、Luaにするのもいいかもしれません。
そのため、この記事は大量にある
言語プロセッサの中の一つとして捉えてもらえばなと。
最後までお読みいただきありがとうございました。