Подтвердить что ты не робот

Как вставить интерпретатор Node.js в C/С++?

Я хочу использовать сценарии Node.js в своих приложениях C/С++. Некоторые люди предложили мне начать с v8, libev и libeio; но это означает переписывание Node.js с нуля.

Итак, можно ли вставить Node.js в C или С++?

4b9b3361

Ответ 1

Скорее всего, V8 написан на С++, node.js может работать на V8, но если у вас нет очень веской причины, почему вы запускаете javascript через С++, вам, вероятно, гораздо лучше, если вы найдете подходящую библиотеку С++ и реализуя необходимую функциональность непосредственно на С++. Задача интеграции языков сценариев и собственного кода обычно не является тривиальной. Например. Документация V8. Qt предлагает довольно приличную интеграцию между С++ и javascript, и все же нет тривиального перемещения объектов назад и вперед между script и кодом.

Ответ 2

Вы должны сначала рассмотреть, достаточно ли реализовать ваше приложение в качестве модуля С++ для Node, а затем приклейте основную часть как Node script.

В противном случае вы можете "повторно реализовать Node", взяв основной код в качестве примера и удаление частей, которые вам не нужны (например, HTTP-модуль), а затем размещение ваших компонентов внутрь. Наименее болезненный путь состоял бы в том, чтобы слить древовидную структуру и разрывать систему сборки, а затем добавить префиксы в сценариях сборки, чтобы указать на каталог, в котором он живет. Затем вы можете остановить определенные части от строительства. Однако система сборки Node содержит несколько частей, и это может быть довольно сложная задача.

Вы также можете попробовать переупаковать Node с загруженными по умолчанию материалами и изменить имя исполняемого файла. Однако это всего лишь более сложный способ использования первого подхода, который я описал, вы можете просто установить script в /usr/bin/, который будет выглядеть как:

  #!/usr/bin/node
  var myAppMain = require('libmyApp');
  myAppMain.withConfig(filename,
  function(err, cnf) {
     if (err) throw err; // parser or file access error
     cnf.evalMe();
  });

Вы можете использовать JSlint в качестве парсера, затем grep для опасных вызовов, а затем eval(conf_script) или просто использовать require(config.js), хотя вам нужно будет добавить exports.someMethod = function (...) {...}. Но require() гораздо безопаснее в целом, однако вы можете захотеть реализовать предварительный процессор для своей конфигурации, который заменит exports.someMethod = function (...) {...} вместо ваших функций и добавит require('OnlyCallMySafeMethods') и отклонит любые попытки require('fs') или другого lib, которые вы можете бояться позволить кому-то использовать. Такой вид безопасности - это дополнительная вещь, которую вы, возможно, пожелаете иметь, это все зависит от вас. Хотя я предполагаю, что вы можете сделать бит с подстановкой exports.someMethod = .... и добавить один require('myAppConfigLib) в верхнюю часть, чтобы пользователь просто использовал ваш API плюс все, что они могли бы поместить в их script/config!

ОБНОВЛЕНИЕ: Существует довольно полезный комментарий к строке 66 src/node.js:

  // To allow people to extend Node in different ways, this hook allows
  // one to drop a file lib/_third_party_main.js into the build
  // directory which will be executed instead of Node normal loading.

Также обратите внимание, что содержимое src/ скомпилируется в байт-код во время сборки.

Ответ 3

Вложение Node.JS теперь официально поддерживается Node.JS fork JXcore. Вложения документов доступны из этой ссылки.

Ответ 4

Вы можете использовать JXcore, он поддерживает Node.js. Но я не думаю, что это лучший вариант.

Ответ 5

Я построил что-то близкое к тому, что, как я думаю, вы ищете:

https://github.com/ZECTBynmo/tacnode

Это библиотека, которая позволяет node.js статически привязываться к С++-приложению. Он определенно не отполирован, но я использовал его для запуска простых скриптов node.

Ответ 6

Есть много веских причин для встраивания node, включая возможность использовать npm.

К сожалению, JXCore умирает. эта фигура дает некоторые альтернативы. http://www.goland.org/nodeapps/

Ответ 7

Я просто просматривал js-git, который был создан для Node.js, а также зависит от нескольких других Node. js.

Однако один и тот же разработчик написал инструмент tim-task, чтобы обернуть некоторые общие функции Node.js, самое главное require, и собрать вместе некоторые модули Node.js таким образом, чтобы он больше не зависел от Node.js. Он использовал его, чтобы сделать git-web-platform, т.е. Js- git упакован как JS файл, который можно использовать в браузерах. Полученный упакованный файл выглядит как this. Возможно, это также можно использовать с небольшими изменениями только в чистом V8.

Это может быть полезно для вас. Обратите внимание, однако, что этот подход будет ограниченным.