JavaScript

Node.jsの構造や仕組みは?【普及した理由】

nodejs

Node.jsの構造・仕組み

Node.jsは、GoogleがChromeのために開発したV8エンジンを利用したJavaScriptの実行環境です。

それまでのJavaScriptの実行環境はインタプリンタで実行し、中間コードに変換しコンパイルするものでした。

しかしV8エンジンはいきなりJavaScriptを直接マシン語にコンパイルし、プログラムを実行することで、高速な実行を可能にしました。

具体的なアーキテクチャは以下のようになります。

Node.jsのアーキテクチャ

Nodeコアライブラリ(JavaScript)

Node コアライブラリは、Node.jsのbuild-inモジュールです。

ここに含まれるモジュールは、インストールすることなく使用することができます。

Node.jsバインディング(C++)

C/C++モジュールのラッパーで、require関数を通じてNode.jsにロードでき、通常のNode.jsモジュールのように使用できます。

Node.jsで実行されるJavaScriptとC/C++ライブラリ間でのインターフェースを提供するために使用されます。

V8エンジン(C++)

GoogleがChromeのために開発したJavaScriptの実行エンジンです。

非同期I/O(C言語)

マルチプラットフォームのCライブラリで、イベントループによる非同期処理を提供します。

主にNode.jsで使用するために開発されましたが、Julia、Luvit、pyuvなどの他のツールでも使用されています。

このライブラリはファイルシステムやDNS、ネットワーク、子プロセス、パイプライン、信号処理、ポーリング、ストリーミングなどに対応しています。

これらはNode.jsバインディングを通じて呼び出されます。

Node.jsが普及した理由

サーバサイド・フロントエンドでどちらも同じ言語を使える

Webサービスを作るとき、サーバサイドとフロントエンドを作成する必要があります。

サーバサイドはPHPやRubyなど様々な言語を使えますフロントエンドはJavaScriptしか使用することができません。

WebブラウザがJavaScriptにしか対応していないからです。

そのためサーバサイドでJavaScriptを使えるようになると、どちらも同じ言語を使用することができるようになります。

同じ言語が使えればフロントエンド・サーバサイドで同じ処理を使いまわすことができるようになります。

サービスで共通するビジネスロジックなどを使い回せれば、2重で同じ処理を書かれて、意図せぬ差異が生まれる恐れもなくなります。

またJavaScriptが書けるエンジニアだけ採用すれば良いのも、利点の1つと言えるでしょう。

標準APIの多くが非同期処理で行われる

Node.jsの提供する標準APIの多くは非同期処理で行われます。

そのためファイルの入出力などの実行待ちに時間を取られることがなくなり、同時に大量のアクセスをさばくことができます。

Apacheだとこれをマルチスレッドで解決しますが、アクセスするクライアントが増えるとサーバのスレッドが増えすぎてしまい、リソースが不足する問題が発生してしまいます。

いわゆるC10K問題と呼ばれるものです。

一方Node.jsはシングルスレッドなので、メモリ効率よく同時アクセスをさばくことができるのです。

一方で、awaitなどで同期処理に変換することもできるため、書き方次第ではこのメリットが握りされてしまうこともあります。

npmモジュールが豊富

JavaScriptは世界で一番使われている言語です。

その分、npmモジュールも豊富に提供されています。

公開されているnpmモジュールを組み合わせることで様々な機能を簡単に実現することができます。