N久之前的一个坑——用 Node.js 来重构 NBUT 的 Online Judge,包括评测端也得重构一遍。(至于什么时候完成大家就不要关心了,(/‵Д′)/~ ╧╧
总之我们现在要做的其实简而言之就是——用C/C++来实现 Node.js 的模块。
准备工作
工欲善其事,必先~~耍流氓~~利其器。
node-gyp
首先你需要一个 node-gyp 模块。
在任意角落,执行:
代码如下:
$ npm install node-gyp -g
在进行一系列的 blahblah 之后,你就安装好了。
Python
然后你需要有个 python 环境。
自己去官网搞一个来。
注意: 根据 node-gyp 的GitHub显示,请务必保证你的 python 版本介于 2.5.0 和 3.0.0 之间。
编译环境
嘛嘛,我就偷懒点不细写了,还请自己移步到 node-gyp 去看编译器的需求。并且倒腾好。
入门
我就拿官网的入门 Hello World说事儿了。
Hello World
请准备一个 C++ 文件,比如就叫 ~~sb.cc~~ hello.cc。
然后我们一步步来,先往里面搞出头文件和定义好命名空间:
代码如下:
#include <node.h>
#include <v8.h>
using namespace v8;
主要函数
接下去我们写一个函数,其返回值是 Handle<Value>。
代码如下:
Handle<Value> Hello(const Arguments& args)
{
//... 嗷嗷待写
}
然后我来粗粗解析一下这些东西:
Handle<Value>
做人要有节操,我事先申明我是从这里(@fool)参考的。
V8 里使用 Handle 类型来托管 JavaScript 对象,与 C++ 的 std::sharedpointer 类似,Handle 类型间的赋值均是直接传递对象引用,但不同的是,V8 使用自己的 GC 来管理对象生命周期,而不是智能指针常用的引用计数。
JavaScript 类型在 C++ 中均有对应的自定义类型,如 String 、 Integer 、 Object 、 Date 、 Array 等,严格遵守在 JavaScript 中的继承关系。 C++ 中使用这些类型时,必须使用 Handle 托管,以使用 GC 来管理它们的生命周期,而不使用原生栈和堆。
而这个所谓的 Value ,从 V8 引擎的头文件 v8.h 中的各种继承关系中可以看出来,其实就是 JavaScript 中各种对象的基类。
在了解了这件事之后,我们大致能明白上面那段函数的申明的意思就是说,我们写一个 Hello 函数,其返回的是一个不定类型的值。
注意: 我们只能返回特定的类型,即在 Handle 托管下的 String 啊 Integer 啊等等等等。
Arguments
这个就是传入这个函数的参数了。我们都知道在 Node.js 中,参数个数是乱来的。而这些参数传进去到 C++ 中的时候,就转变成了这个 Arguments 类型的对象了。
新闻热点
疑难解答
图片精选