Вопрос по c, node.js – Можно ли написать расширение node.js в C (не C ++)?
Быстрый поиск в Google дает по крайней мере один учебник для написанияC ++ "Hello World" для node.js, но неясно, возможно ли написать такое расширение, используя только C. Если это возможно, с какими проблемами / ограничениями я столкнусь?
node-ffi: Интерфейс внешней функции Node.js
аддон для загрузки и вызова динамических библиотек с использованием чистого JavaScript. Его можно использовать для создания привязок к собственным библиотекам без написания кода на C
https://github.com/node-ffi/node-ffi
SWIG: Упрощенный генератор оболочек и интерфейсов
(он создает оболочки для многих языков, что решает много проблем одновременно)
http://www.swig.org/
emscripten
Компилирует C и C ++ в высокооптимизируемый JavaScript, который работает даже в сети с почти естественной скоростью, без плагинов.
http://kripken.github.io/emscripten-site/
если хотите, но вам понадобится хотя бы небольшой кусочек кода C ++, чтобы склеить ваш код C с Node.
Как вы уже видели в своем HelloWorld, расширения полагаются наv8.h
а такжеnode.h
заголовки, которые имеют все классы, которые ожидает Node. Без них вы не сможете должным образом создать объект JS для экспорта обратно в Node.
Тем не менее, вы можете довольно легко просто написать небольшой набор функций C ++, которые просто вызывают функции C, и обернуть некоторую структуру C.
используя extern & quot; C & quot; синтаксис
Пример:
#define BUILDING_NODE_EXTENSION
#include <node.h>
extern "C" void f(int i, char c, float x);
using namespace v8;
если у вас есть несколько функций C, то они могут быть сгруппированы через фигурные скобки:
extern "C" {
void f(int i, char c, float x);
int g(char* s, char const* s2);
double sqrtOfSumOfSquares(double a, double b);
}
затем вызовите функцию из функции C ++:
Handle<Value> MyFunction(const Arguments& args) {
HandleScope scope;
f(7, 'x', 3.14); // <---
return scope.Close(String::New("Hello"));
}
Handle<Value> CreateFunction(const Arguments& args) {
HandleScope scope;
Local<FunctionTemplate> tpl = FunctionTemplate::New(MyFunction);
Local<Function> fn = tpl->GetFunction();
fn->SetName(String::NewSymbol("theFunction")); // omit this to make it anonymous
return scope.Close(fn);
}
void Init(Handle<Object> target) {
target->Set(String::NewSymbol("createFunction"),
FunctionTemplate::New(CreateFunction)->GetFunction());
}
NODE_MODULE(addon, Init)
Примечание. Использование примера кода изNodejs Addons
https://github.com/wesolows/v8plus
v8+: Node addon C++ to C boundary
This layer offers a way to write at least simple Node addons in C without all the horrible C++ goop you'd otherwise be expected to use. That goop still exists, but you don't have to write it. More importantly, you can write your module in a sane programming environment, avoiding the confusing and error-prone C++ semantics.