nodejs作为javascript在后端运行的环境,源码由js与C完成。本质上,nodejs是借助于谷歌V8引擎来运行javascript代码。使用了C的libuv库来处理网络,访问文件系统等操作。
nodejs的作用
1、提供一种接口,仅仅书写javascript的代码,就可以让他们正确执行,不用书写C++代码。
2、丰富的api。http、fs、path、crypto …modules
nodejs源码
nodejs源码:
https://github.com/nodejs/node
lib:nodejs库函数
src:库函数的C++实现。
pbkdf2中js代码
pbkdf2函数的实现:node/lib/internal/crypto/pbkdf2.js
1 2 3 4 5 6 7 8 9 10 11 12
|
function pbkdf2(password, salt, iterations, keylen, digest, callback) { ...
handleError(keybuf, password, salt, iterations, digest, wrap); }
调用了:
const rc = _pbkdf2(keybuf, password, salt, iterations, digest, wrap);
_pbkdf2绑定了C++函数的实现。 const { pbkdf2: _pbkdf2 } = internalBinding('crypto');
|
internalBinding链接javascript代码与C++代码。
pbkdf2中c++代码
crypto库源代码实现:node/src/node_crypto.cc
1 2 3 4 5 6 7 8 9 10 11 12 13
|
绑定 env->SetMethod(target, "pbkdf2", PBKDF2); inline void PBKDF2(const FunctionCallbackInfo<Value>& args) { ... job->iteration_count = args[3].As<Uint32>()->Value(); Utf8Value digest_name(args.GetIsolate(), args[4]); job->digest = EVP_get_digestbyname(*digest_name); if (job->digest == nullptr) return rv.Set(-1); if (args[5]->IsObject()) return PBKDF2Job::Run(std::move(job), args[5]); env->PrintSyncTrace(); job->DoThreadPoolWork(); rv.Set(job->ToResult()); }
|
v8
node/src/node_crypto.cc中我们还会看到很多的v8,将javascript类型转换为c++类型
1 2 3 4 5 6
|
using v8::Array; using v8::Boolean; using v8::ConstructorBehavior; using v8::Context; using v8::DontDelete; ...
|
libuv
node/src/node_crypto.cc中我们还会看到很多的libuv,处理并发操作。
1 2 3
|
... static uv_once_t init_once = UV_ONCE_INIT; uv_once(&init_once, InitCryptoOnce);
|