Skip to content

youngwind/fake-node

Repository files navigation

主题

本项目研究如何将 V8引擎 嵌入到 C++ 应用中,以此学习 Node 实现的基本原理。 在运行此项目之前,需满足以下条件:

  1. 有一定的 C++ 基础
  2. 阅读官方手册,关于如何内嵌 V8 的说明

说明

  1. 由于此项目依赖于 V8,我已经提前将 V8 编译好,存放到目录 out 中。直接执行 ./out/x64.release/d8 就可以运行 V8 的 debug 实例:d8。 如下图所示 d8
  2. 编译的 V8 版本为 4.8,所以,本例使用的 V8 也是 4.8 版本。
  3. include 文件夹是从 V8 源码中拷贝过来的头文件

运行

  1. 执行命令clang++ -stdlib=libstdc++ -std=c++11 -I. hello_world.cpp -o hello_world out/x64.release/libv8_base.a out/x64.release/libv8_libbase.a out/x64.release/libicudata.a out/x64.release/libicuuc.a out/x64.release/libicui18n.a out/x64.release/libv8_base.a out/x64.release/libv8_external_snapshot.a out/x64.release/libv8_libplatform.a,便可编译生成官方的 demo, 输入 ./hello_world 执行该 demo,即可查看到输出字符串 "youngwind"。
  2. 同理,执行命令clang++ -stdlib=libstdc++ -std=c++11 -I. main.cpp -o main out/x64.release/libv8_base.a out/x64.release/libv8_libbase.a out/x64.release/libicudata.a out/x64.release/libicuuc.a out/x64.release/libicui18n.a out/x64.release/libv8_external_snapshot.a out/x64.release/libv8_libplatform.a, 生成本项目的可执行文件,输入./main执行。

main 完成了什么功能?

main 参考自 V8 源码中的 /sample/shell.cc,最大程度地删减了非必要的代码而成。 目前 main.cpp 只完成一个功能:"全局注入 console 函数,使得 JS 具有全局 console 方法;当 JS 调用 console 方法的时候,打印其传递的参数"。 正是通过这一形式,使得 JS 具备调用 C++ 的能力,这也是 Node 得以实现的基础。 下图是 d8 与 main 的对比。 console

About

内嵌 V8 引擎到 C++ 应用中

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages