JavaScript はここ数年、最もよく使われているプログラミング言語として君臨してきました。このプログラミング言語は、ほとんどすべての最新ブラウザで動作し、Windows、Linux、および macOS オペレーティング システムと互換性があります。
大きな疑問は、JavaScript をブラウザ上またはブラウザ環境外で実行できるようにするために、内部で何が起こっているのかということです。
JavaScript ランタイム環境は、コンピューター上で JavaScript コードを実行するために必要なツール、ライブラリ、インフラストラクチャを提供するソフトウェア/プラットフォームです。ランタイム環境は、JavaScript プログラムがアクセスするグローバル オブジェクトを決定し、そのプログラムの実行方法に影響を与えます。
JavaScript ランタイム環境はどのように動作しますか?

JavaScript はインタープリタ型言語として定義されています。つまり、JavaScript エンジンによって実行される前にソース コードを 1 行ずつ解釈する JavaScript インタープリターがあることになります。ただし、最新の JavaScript には、JavaScript エンジンが実行前に JS コードをマシン コードに変換できるようにするジャストインタイム (JIT) コンパイルなどの機能があります。
JavaScript ランタイムは、ブラウザーのランタイムとサーバーサイド JavaScript ランタイムの 2 つに分類できます。
種類に関係なく、ランタイムは通常次のもので構成されます。
- コードを解釈して実行する JavaScript エンジン。ブラウザが異なれば、使用するエンジンも異なります。たとえば、Chrome の場合は V8、Safari の場合は WebKit/JavaScriptCore、Firefox の場合は SpiderMonkey です。
- Web API は、DOM、タイマー、フェッチなどの機能へのアクセスを提供します。
- コールバック キューは、Web API からのコールバックを保存する役割を果たします。
- await オペレーションと Promise を保存するジョブ キュー。
- ジョブ キューとコールバックをチェックし、キューが空のときにそれらをエンジンにプッシュするというタスクを実行するイベント ループ。
JavaScript ランタイム環境は、このような場合に役立ちます。
- ブラウザ外で JavaScript コードを実行できるようにします。 ランタイム環境は、コンピューター上で JavaScript コードを実行するために必要な組み込みオブジェクトとライブラリへのアクセスを提供します。
- サーバーとの対話を軽減: JavaScript ランタイムを使用すると、ユーザー入力をサーバーに送信する前に検証できます。このアプローチにより、サーバー上のトラフィックが減少し、サーバーの負荷が軽減されます。
- 帯域幅の節約: ランタイムは JavaScript コードをホストする場所を考慮しません。つまり、コードは常にクライアント上で実行されます。
これらは、現在試せる最高の JavaScript ランタイム環境です。
バン
Bun は、開発者が TypeScript および JavaScript プロジェクトを構築、テスト、実行、バンドルできるプラットフォームです。このオールインワンのランタイムとツールキットには、Node.js と互換性のあるテスト ランナー、バンドラー、パッケージ マネージャーが含まれています。 Bun は Windows、Linux、macOS 上で動作します。

主な特徴:
- ドロップイン Node.js の互換性: Bun を使用すると、すべてのノード モジュールを package.json 上で構成できます。
- 高速: Bun は Zig を使用して JavaScript コア エンジンを拡張します。
- TypeScript のサポート: Bun を使用すると、追加の構成を行わずに、.tsx および .ts 拡張子を持つすべてのファイルを実行できます。
- 監視モード: –watch フラグをコードに追加すると、インポートされたファイルが変更されたときに Bun が自動的にプロセスを再起動します。
Bun は、開発者の生産性を倍増させ、複雑さを軽減し、パフォーマンスを向上させながら、ほとんどのサーバーサイド JavaScript を実行できるように設計されています。 Bun を使用すると、WebSocket、ReadableStream、FormData、Response、Request などのすべての標準 API を使用できます。
デノ
Deno は「次世代 JavaScript ランタイム」として紹介されています。このツールは V8 JavaScript エンジンに基づいて構築されており、npm および Node.js と下位互換性があります。 Deno は、追加の構成やビルド手順を行わずに、JSX や TypeScript などの JavaScript 拡張機能をサポートするように設計されています。

このソフトウェアには、テスト ランナー、バグの回避に役立つコード リンター、コードを読みやすく表示しやすくするコード フォーマッタなど、いくつかの組み込みツールが含まれています。このプラットフォームはクラウド用に構築されているため、Deno Deploy またはニーズに合ったその他のクラウド サービスを使用してアプリをデプロイできます。
主な特徴:
- デフォルトで安全: このツールは、機密性の高いランタイム API へのアクセスを制限するように設計されています。この機能により、Deno は JavaScript インフラストラクチャを悪意のあるコードから保護できます。
- 一貫したコード: Deno には標準 API があり、ブラウザとバックエンドの間で流れるコードの一貫性が保証されます。
- ハイパフォーマンス ネットワーキング: Deno は、すぐに使用できる HTTP2、Websocket、および HTTPS サポートを提供します。
Deno は、Microsoft Azure、Cloudflare、AWS Lambda ディストリビューション、Google Cloud Run などのクラウド サービスと互換性があります。
Node.js
Node.js は、クロスプラットフォームのオープンソース JavaScript ランタイム環境です。このツールは、V8 JavaScript エンジン上に構築されているため、パフォーマンスが向上するように設計されています。

一般的な Node.js アプリは、単一プロセスで実行するように設計されているため、リクエストごとに新しいスレッドを作成しません。その標準ライブラリには、JavaScript コードのブロックを防ぐ非同期 I/O プリミティブのセットが含まれています。
主な特徴:
- ノンブロッキングかつ非同期
- クロスプラットフォーム
- イベント駆動型およびシングルスレッド
- ノード パッケージ マネージャー (NPM) が付属
Node.js は、単一サーバー内で複数の同時接続を処理するように設計されています。ツールがデータベースへのアクセスなどの I/O 操作を実行する場合、ツールはスレッドをブロックして CPU サイクルを無駄にするのではなく、応答が返されると操作を再開します。
ブルーボート
Blueboat はサーバーレス JavaScript ランタイムです。このプラットフォームは標準の Web API と互換性があり、リクエスト、レスポンス、URL、フェッチなどの機能が組み込まれています。 Blueboat は分散ネイティブ システムとして、ローカル リソースをクラウドの同等のリソースに置き換える、摩擦のないスケーラビリティに重点を置いています。

主な特徴:
- Google V8 エンジンと Rust を使用しているため高速です
- エンコード、解析、変換機能を備えているため、データと外部 API を処理できるように設計されています。
- 安全で効率的なマルチテナンシー
- 強力な分散システムのプリミティブ
Blueboat は、ほとんどの JavaScript/TypeScript バンドラーで動作します。したがって、JavaScript プロジェクトをビルドするときに、Webpack、Bun、さらには esbuild を使用できます。 Blueboat プロジェクトは、シングルテナント状態またはマルチテナント状態としてデプロイできます。
Napa.js
Napa.js は 、マルチスレッド JavaScript ランタイムです。このプラットフォームは V8 JavaScript 上に構築されており、元々は Bing での反復性の高いサービスの開発をサポートするために設計されました。ただし、このランタイムは進化し、Node.js を適切に補完するものになりました。

主な特徴:
- マルチスレッドランタイム
- Node.jsおよびNPMとの互換性
- Node.js モジュールとしてパッケージ化されていますが、システムに埋め込むこともできます
Napa.js は、複数の V8 アイソレートで JavaScript を実行し、それらの間で通信できるため、CPU バウンドのタスクで完全に機能します。このツールは Node.js モジュールとして提供されます。ただし、Node.js の依存関係として使用したくない場合は、ホスト プロセスに埋め込むことができます。
チャクラコア
ChakraCore は 、開発者が C 互換プロジェクトに JavaScript を追加できるようにする C API を備えた JS エンジンです。このエンジンは、Windows、Linux、macOS 上で完全に動作します。プラットフォームには、いくつかの JSON ベースの診断 API があります。これらの API はプラットフォーム アゴニスティックであり、さまざまな実装間で相互運用可能にすることができます。

主な特徴:
- 多層アーキテクチャ
- マルチプラットフォーム
- C APIが付属しています
このエンジンは多層アーキテクチャに基づいています。このアーキテクチャには、高度に最適化されたコードを生成する並列 JIT コンパイラー、高速セットアップを支援するインタープリター、およびアプリケーションでの高い UI 応答性を可能にする同時バックグラウンド GC が含まれています。
ワズムエッジ
WasmEdge は 、エッジ、クラウドネイティブ、分散型アプリケーション向けの拡張可能な軽量 WebAssembly ランタイムです。このランタイムは、組み込み機能、サーバーレス アプリ、IoT デバイス、スマート コントラクト、およびマイクロサービスを強化します。

このプラットフォームは、WebAssembly バイト コード プログラム用に明確に定義された実行サンドボックスを提供します。このソフトウェアは、プロセス、環境変数、ソケット、ファイル システムなどのオペレーティング システム リソースを保護および分離します。
主な特徴:
- クロスプラットフォームのサポート
- JavaScript、Rust、Go、C で動作します
- ホストアプリケーションへの組み込みが簡単
- クラウドネイティブの管理とオーケストレーション
WasmEdge は標準 API および ES6 モジュールで使用できます。このランタイムは、Node.js および NPM モジュールとも互換性があります。 WasmEdge を使用すると、開発者は Rust に JavaScript API を実装できます。
Tsノード
Ts-node は、 Node.js および TypeScript 実行エンジンの REPL です。このツールを使用すると、開発者はコンパイル フェーズを経ずに Node.js 上で TypeScript を実行できます。 Ts-node はノードのバージョンをチェックし、それに一致するデフォルトを自動的に提供します。

主な特徴:
- オプションの型チェック
- CLI ツール、テストランナー、デバッガーと統合
- サードパーティのトランスパイラの使用を許可します
- tsconfig.json の自動解析
- 単一の式をユーザー入力として受け取り、実行後に結果をコンソールに返す読み取り評価印刷ループ (REPL)。
Ts-node は、さまざまなオプションをサポートするように設計されています。これらのオプションは、プログラムで、環境変数として、tsconfig.json を通じて、または CLI フラグとして指定できます。 tsconfig.json メソッドが最も推奨されます。
ジェリースクリプト
JerryScript は 、マイクロコントローラーなどの制約のあるデバイス上で実行される軽量の JS エンジンです。エンジンには 64 KB の RAM しか搭載されておらず、ROM は 200 KB に制限されています。 JerryScript は、デバイス上でのコンパイルと実行をサポートしています。このエンジンは、JavaScript から周辺機器へのアクセスも提供します。
主な特徴:
- メモリ消費量を抑えるために最適化
- ECMAScript 5.1 標準準拠
- スナップショットのサポートを通じて JavaScript コードをバイトコードにコンパイルします
- 移植性を最大限に高めるために C99 で書かれています
このエンジンには、特定の機能をオン/オフするために使用できるさまざまな構成オプションが用意されています。オプションの構成値を変更するには、CMake 定義を追加するか、tools/build.py スクリプトの引数を使用するか、特定の C プリプロセッサ定義を提示します。
結論
これで、次の JavaScript プロジェクトで使用できるさまざまな JavaScript ランタイム環境が完成しました。 Node.js は最もよく使用される JavaScript ランタイムですが、プロジェクトの性質や好みに応じて、残りのランタイムも引き続き使用できます。
Node.js データ検証ライブラリに関する記事をご覧ください。