😸

【初級】JavaScriptランタイムについて

2023/11/04に公開

JavaScriptランタイム

今回自分が参画するプロジェクトで話題のBunが使用されるということで、Bunが何者なのかについて調べてみたけど、そもそもJavaScriptランタイムについて知らないといけないと思い、調べてまとめました。

Bunとは何か?

そもそもbunって何ですかということ。肉まんのアイコンを見たことはありましたが、いまいち何なのかよくわかりません。ということで、Bunの公式ページに行ってみましょう。するとこんなことが書いてありました。

Bun は高速な JavaScriptランタイム: JavaScript および TypeScript プロジェクトの開発、テスト、実行、バンドルをすべて Bun で行います。Bun は、速度を重視して設計されたオールインワンの JavaScript ランタイムおよびツールキットで、バンドラー、テスト ランナー、Node.js 互換のパッケージ マネージャーを備えています。

Bun — A fast all-in-one JavaScript runtime

つまり、Bunとは「JavaScriptランタイム」ということみたいです。しかもなにやら、高速らしいです。ってことは他にもこの「JavaScriptランタイム」というものが存在していて、それよりもすごいのが出たよってことだと推測できます。

JavaScripランタイム

では「JavaScriptランタイム」ってなんでしょうか。知らない言葉が次々に出てきますね。。

調べたところ、JavaScriptランタイムとは、「JavaScriptの実行環境」のことらしいです。んーこれでもよくわからないですが、おそらくJavaScriptが動くために必要なものということでしょうね

じゃあ実際に、JavaScriptランタイムとはどのようなものを指すのかみてみましょう。下記にその一部を転記しておきます。(ChatGTPより)

  1. ブラウザ上のJavaScriptエンジン:
    • V8(Google Chrome、Node.js): Googleが開発した高性能なJavaScriptエンジンで、ChromeブラウザやNode.jsで使用されています。
    • SpiderMonkey(Firefox): Mozillaが開発したJavaScriptエンジンで、Firefoxブラウザで利用されています。
    • JavaScriptCore(Safari): Appleが開発したJavaScriptエンジンで、Safariブラウザで使用されています。
  2. サーバーサイドでのJavaScriptランタイム:
    • Node.js: サーバーサイドやコマンドラインでJavaScriptコードを実行するためのランタイム環境。V8エンジンをベースにしています。
    • Deno: Node.jsの生みの親であるRyan Dahlによって開発され、Node.jsの一部の設計上の問題を解決するために作られたJavaScriptランタイムです。セキュリティの向上やモジュールの取り込みなどが特徴です。
  3. デスクトップアプリケーション向けのランタイム:
    • Electron: デスクトップアプリケーションを構築するためのJavaScriptランタイムで、Node.jsとChromium(V8エンジンを内蔵したブラウザエンジン)を使用しています。
  4. モバイルアプリケーション向けのランタイム:
    • React Native: モバイルアプリケーションを構築するためのJavaScriptランタイム。JavaScriptを使用してネイティブアプリケーションを開発できます。

いろいろな種類があることがわかりますが、今回は1と2に絞ってみていきたいと思います。

ブラウザ上のJavaScriptエンジン

私たちがよく使う、Chrome、Safari、FireFoxの中にはJavaScriptエンジンというものが組み込まれているみたいです。JavaScriptエンジンは私たちが書いたコードをブラウザが実行できるようにうまいこと仕事をしてくれて、動的なページの作成を助けてくれています。

☟JavaScriptエンジンについて詳しく知りたい場合は下記記事を参照してください。

JavaScriptエンジンでの処理を理解する

つまり、このJavaScriptエンジンが組み込まれているブラウザは、JavaScriptを動かすことのできる実行環境(JavaScriptランタイム)ということになります。

サーバーサイドでのJavaScriptランタイム

次に、サーバサイドでのJavaScriptランタイムについてみていきたいと思います。ここがみなさん(自分も含めて)を混乱させている元凶です。

なぜ混乱するかというと、みなさんの中には「JavaScriptはクライアントサイドのプログラミング言語だ」ということが脳裏にあることと、「Node.jsというものがサーバサイドのプログラミング言語だと勘違いしていること」この二つだと思います。これは、2つ目の「Node.jsというものがサーバサイドのプログラミング言語だと勘違いしていること」を説明することで解消されると思います。

AIは下記のように言っています。

  • Node.js: サーバーサイドやコマンドラインでJavaScriptコードを実行するためのランタイム環境。V8エンジンをベースにしています。
  • Deno: Node.jsの生みの親であるRyan Dahlによって開発され、Node.jsの一部の設計上の問題を解決するために作られたJavaScriptランタイムです。セキュリティの向上やモジュールの取り込みなどが特徴です。

このように、Node.jsというのは、V8エンジンというJavaScriptエンジンを兼ね備えた、JavaScriptの実行環境ということなのです。サーバサイドでJavaScriptを動かす環境は、このNode.js以外にもDenoや今回の主役でもあるBunなどがあります。

ちなみにBunのJavaScriptエンジンはSafariで使用されている、JavaScriptCoreを採用しているみたいです。

つまり、JavaScriptは基本的にクライアントサイドで動く言語だが、Node.jsやBunなどのサーバサイドでJavaScriptを実行できる環境を用意してあげれば、サーバサイドでも実行が可能になるよということです。なので、Node.jsがプログラミング言語のような扱いになっていますが、実際にはただのJavaScriptが実行されているだけということになります。

最近流行りのNext.jsというJavaScriptのフレームワークは、サーバコンポーネントという仕組みを提供していて、クライアントサイドで実行しなくてもいい処理(データフェッチなど)はサーバサイド上で実行してしまいクライアント側での処理を軽くするなどの仕組みを採用しています。この時にはNode.js上でJavaScriptを実行しています。

JavaScripランタイムの役割

  1. コードの解釈と実行: JavaScriptコードは通常、ソースコードとして提供されます。ランタイムはこのソースコードを読み込み、解釈して実行します。解釈のプロセスでは、ソースコードをトークンに分割し、それを実際の命令に変換します。
  2. メモリ管理: JavaScriptランタイムは、メモリの管理を行います。これには、変数、オブジェクト、関数などのデータ構造のメモリ確保と解放が含まれます。ガベージコレクションが使用され、不要なオブジェクトや変数が解放され、メモリリークが防がれます。
  3. コンパイレーション: 一部のJavaScriptエンジンは、コードを実行する前に中間表現や機械語に変換することがあります。これにより、実行速度が向上し、最適化が可能になります。
  4. エラーハンドリング: ランタイムはJavaScriptコードの実行中に発生するエラーを検知し、適切なエラーメッセージを生成します。これにはスタックトレースや例外の処理が含まれます。
  5. APIの提供: ランタイムは、JavaScriptがホスト環境にアクセスするためのAPIを提供します。ブラウザ上ではDOM APIやWeb API、Node.jsではファイルシステムやネットワークなどのAPIがこれに該当します。
  6. 非同期処理の管理: JavaScriptはシングルスレッドであるため、非同期処理が重要です。ランタイムは非同期イベントの管理を行い、イベントループやコールバックを通じて非同期処理を実現します。これにより、ユーザーインタラクションやネットワークリクエストなどの非同期イベントに対応できます。

このようにJavaScriptランタイムが行なっている役割は多岐に渡ります。Node.jsやDeno、Bunそれぞれに違いがありますが、Bunはその中でも高速に処理を行なってくれているということです。さまざまな処理速度が他のランタイムに比べて高速であるため、現在注目が集まっています。

まとめ

ということで、今回はJavaScriptランタイムについてみてきました。かなりざっくりとした内容ではあるので、JavaScriptエンジンや、その仕組みについては別記事の参照をしていただくといいかと思います。

Discussion