C アドオンの Node.js

Linda Hamilton
リリース: 2024-12-04 19:59:15
オリジナル
515 人が閲覧しました

C   Addons no Node.js

C アドオンとは何ですか?

これらは、JavaScript 環境で C コードを直接拡張し、Node.js コードのパフォーマンスと機能を向上させる方法です。言い換えれば、C アドオンは Node.js 用に作成するモジュールであり、これを使用すると、C 関数とライブラリを作成し、JavaScript コードで使用できるようになります。

これらは基本的に JavaScript と C の間のブリッジです。つまり、Node.js は柔軟性と、何よりもそのシンプルさを失うことなく、より重いコードを実行できます。

Node.js で C アドオンを使用する理由

  • パフォーマンス: C はコンパイル言語であり、インタプリタ型言語である JavaScript と比較すると、一般に優れたパフォーマンスを示します。さらに、メモリの割り当てと割り当て解除をより制御して使用できるようになります。
  • ライブラリとレガシー コード: 多くのレガシー システムとライブラリは C で開発されました。アドオンを使用すると、これらのライブラリを環境に効率的に統合できるため、既存のコード ベースの再利用が容易になり、書き換えの労力が軽減されます。 JavaScript では直接動作しないさまざまなライブラリにアクセスできることに加えて
  • システム レベル: JavaScript ではアクセスできない特定のシステム レベルの機能は、アドオンの助けを借りて使用でき、必要なときにいつでも特定の機能を使用できます。

C アドオンはどのように機能しますか?

  • コンパイル: アドオンは使用する前にコンパイルする必要があります。これを行うには、リポジトリでnode-gypを構成する必要があります。このツールは、C コードを Node.js で実行できる「ネイティブ」モジュールにコンパイルします。
  • バインディング: JavaScript と C の間に「ブリッジ」を作成するには、N-API、NAN パッケージを使用するか、V8、libuv、および代替 Node.js ライブラリを通じて直接使用できます。
  • 機能のロード: コードがコンパイルされ、2 つの世界の間に「ブリッジ」が存在すると、作成された関数は require() を通じて呼び出すことができ、JavaScript からアクセスできるようになります。

実践例

まず、コード用のディレクトリを作成しましょう

 mkdir addon
 cd addon
ログイン後にコピー
ログイン後にコピー

次に、package.json を作成して初期化し、ライブラリ node-gyp をダウンロードしましょう (依存関係が OS に正しくインストールされていることを確認してください)

npm init -y
npm i node-gyp
ログイン後にコピー
ログイン後にコピー

package.json 内で、アドオンのビルド スクリプトを作成します。

 mkdir addon
 cd addon
ログイン後にコピー
ログイン後にコピー

次に、C でアドオンを作成し、バインディングを構成します。

npm init -y
npm i node-gyp
ログイン後にコピー
ログイン後にコピー
 "scripts": {
    "build": "node-gyp configure build"
  }
ログイン後にコピー

準備完了。これら 2 つのファイルが作成されたら、ビルド スクリプト (npm run build) を実行し、プロセス全体がアドオンを利用できるようになるまで待ちます。次に、新しいファイルを作成し、ターミナルでコマンド node Index.js
を実行します。

// array_sum.cpp
#include <node.h>
namespace demo
{

  using v8::Array;
  using v8::Context;
  using v8::Exception;
  using v8::FunctionCallbackInfo;
  using v8::Isolate;
  using v8::Local;
  using v8::Number;
  using v8::Object;
  using v8::Value;

  void SumArray(const FunctionCallbackInfo<Value> &args)
  {
    Isolate *isolate = args.GetIsolate();
    Local<Context> context = isolate->GetCurrentContext();

    Local<Array> array = Local<Array>::Cast(args[0]);
    uint32_t length = array->Length();
    double sum = 0;

    for (uint32_t i = 0; i < length; ++i)
    {
      Local<Value> element = array->Get(context, i).ToLocalChecked();
      if (element->IsNumber())
      {
        sum += element->NumberValue(context).FromJust();
      }
    }

    args.GetReturnValue().Set(Number::New(isolate, sum));
  }

  void Initialize(Local<Object> exports)
  {
    NODE_SET_METHOD(exports, "sum", SumArray);
  }

  NODE_MODULE(NODE_GYP_MODULE_NAME, Initialize)
}

ログイン後にコピー

最終的な考慮事項

重要な操作のパフォーマンスを最適化することや、ネイティブ コードと統合することが目的の場合、アドオンは強力なリソースです。これらは C の知識を必要とし、プロジェクトの複雑性を高めますが、純粋な JavaScript では理想的なソリューションが提供できない状況では完璧なソリューションとなる可能性があります。 N-API などのツールのおかげで、アドオン開発はよりアクセスしやすく安定しており、プロジェクトで JavaScript の実用性と C の効率性を組み合わせることができます。

リポジトリ リンク: cpp-addon-nodejs
参考文献: Node.js

以上がC アドオンの Node.jsの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート