COLUMN
2023年02月24日
Node.jsだけではない。JavaScriptエンジンまとめ
カテゴリー:システム開発, テクノロジー
タグ:システム開発, プログラミング
JavaScriptはブラウザで実行できるプログラミング言語としてはじまりましたが、今ではサーバーサイドやFaaS(Function as a Service)など様々な環境で実行されます。
そして、その実行エンジンも多種多様です。この記事では各種JavaScript実行エンジンを紹介します。
SpiderMonkey
SpiderMonkeyは元々NetspaceのJavaScriptエンジンとして開発されました。Wikipediaによれば、世界初のJavaScriptエンジンとのことです。
現在はFirefoxのJavaScriptエンジンとして開発されています。昔、SpiderMonkeyをNode.jsのようにするspidernodeというプロジェクトもありました。
Home | SpiderMonkey JavaScript/WebAssembly Engine
V8
V8はGoogle Chromeに搭載されているJavaScriptエンジンです。高速さと多機能さが売りです。Web標準にはなっていない機能も先進的に取り入れており、外部デバイスとの連携も実現します。
V8をベースにしたサービスやソフトウェアも多様に存在します。後述するNode.jsをはじめ、ElectronなどもV8エンジンを利用しています。
Node.js
Node.jsはV8エンジンをブラウザ以外でも利用すべくスタートしたプロジェクトです。ブラウザ向けのJavaScriptと互換性は高いですが、一部実装されていないAPIもあります。逆にファイルシステムなど、ブラウザ向けには必要ないAPIも用意されています。
Node.jsの魅力はコミュニティによる圧倒的なライブラリの豊富さでしょう。サーバーサイドからIoTまで幅広い環境で実行できます。
Deno
Node.jsの開発者がNode.jsでの課題を解決するために作っているのがDenoです。名称もNodeのアナグラムになっています。
ルートで使えるasync/await、package.jsonを用いないパッケージ管理、自動的に index.js をインポートしない仕組みなどが特徴的です。最近、npmパッケージもインポートできるようになりましたが、API互換性がない部分も多いです。
Deno — A modern runtime for JavaScript and TypeScript
Bun
2022年になって登場した最新のJavaScript実行エンジンです。Node.jsやDenoを上回る高速さを売りにしています。ただし、まだAPIが不足していたり、特定分野における処理速度が高速と言った課題もあります。
Bunがnpmパッケージをサポートするというのを見て、Denoもサポートを開始しました。お互いをかなり意識しているようです。
Bun — fast all-in-one JavaScript runtime
JS VM on Wasmtime
WasmtimeはJavaScriptではなくWebAssemblyの実行エンジンとして開発されています。ですが、FastlyではこのWasmtime(正しくはその前進であるLucet)上で動作するJavaScriptエンジンを開発しており、エッジでのJavaScript実行に利用しています。
ブラウザで使えるJavaScriptと高い互換性を維持し、WebAssemblyというサンドボックス環境で実行できるのが魅力です。
JavaScriptCore
JavaScriptCoreはSafariで使われているJavaScriptエンジンです。つまりmacOSのSafariやiOSで実行されるJavaScriptエンジンになります。このJavaScriptCoreでCordovaアプリやReact Nativeアプリが実行されます。
Chromeとの互換性は高いですが、一部の機能(Bluetoothなど)についてはセキュリティを理由に実装されていません。
まとめ
例えばCloudflare WorkersはV8エンジン(ただしブラウザ互換のAPI)で実行されているなど、各社の利用しているJavaScriptエンジンは異なります。採用するエンジンによって、多少のAPI差異があるので利用する際には注意が必要です。
特に最近ではサーバーサイドのJavaScriptエンジンが活発化しているので、Node.js以外のエンジンにも注目、触れてみることをお勧めします。