v8的初始化三部曲,前面花了三篇解决了第一步,由于只是生成了一个对象,第二步就是将其嵌入v8中,先看一下三个步骤。

// 生成默认Platform对象
std::unique_ptr<v8::Platform> platform = v8::platform::NewDefaultPlatform();
// 将其嵌入V8引擎内
v8::V8::InitializePlatform(platform.get());
// 初始化V8引擎
v8::V8::Initialize();

第一步可以由用户自己手动实现platform,只要按照规范来继承对应基类,一般也不会有人搞吧。

这里的嵌入,如果用代码来进行解释,实际上是叫做"命名空间"。v8引擎的体量非常巨大,所以需要有完善的规范来管理各个类。如果完整的阅读过v8源码,可以发现v8对类的逻辑管理用到了两个方法,其中一个是命名空间,另外一个则是语义化宏。

先来看看命名空间的定义(对C++熟悉就很简单了),如果只是跟我一样的前端页面仔,可以理解成模块。举一个例子,在前面一篇有一个类叫PageAllocator,在看源码发现有两个同名类,但是其中一个是挂在v8的命名空间下,另外一个则在v8::base的命名空间下,如下。

namespace v8 {
class PageAllocator {}
}
namespace v8 {
namespace base {
class PageAllocator : public ::v8::PageAllocator {}
}
}

通过对v8命名空间所有类进行观察,发现其所有的类都是一个基类,提供了声明和一些虚函数,都是需要被继承去实现的类。而对v8::base进行搜索时,发现了其命名空间下的所有方法都是实现类,可以看出,v8通过命名空间来对所有的class进行分类。

另外,其命名空间的名字也是有意义的,base命名空间下的类提供的功能都是比较底层的功能,比如说CPU、Hash、EnumSet等等。而之前那篇讲的DefaultPlatform、TaskRunner,其命名空间都挂在v8::platform的下面。此外,WorkThread虽然从继承关系上是属于Thread类型,但是作为TaskRunner的内部类,实际上命名空间还是属于platform,也就是只看命名空间就可以理解类的归属和功能。

比较典型的还有v8::debug包含垃圾回收、内存管理相关,v8::tracing包含调用栈追踪的相关等等,这里就不一一举例了。

除去命名空间,另外一个对类进行分类的就是语义化宏。这个命名是自己想的,主要是联想到了语义化标签,进行过格式化,实际上div和p在表现上并没有什么区别,实际使用上只是为了语义化。同理,v8的很多宏会对类进行修饰,也是无意义的,纯粹的语义化。

基本上所有的类都会有宏去修饰,还是拿之前的DefaultPlatform举例。

// 宏定义
#define NON_EXPORTED_BASE(code) code
#define V8_PLATFORM_EXPORT
// 类声明
class V8_PLATFORM_EXPORT DefaultPlatform : public NON_EXPORTED_BASE(Platform) {};

这里分别对实现类和基类都进行了修饰,V8_PLATFORM_EXPORT表明这个类是属于platform模块,且是一个实现类,可以输出并使用。而NON_EXPORTED_BASE则表明该类不可直接使用,需要继承实现。

宏的定义也给出来了,没有任何意义,只是一个纯粹的为了说明,跟注释类似但是又有着不一样的功能。

v8源码的头文件在类的定义上随处可见这种宏,通过宏的名字就可以看出类的一些特征,从而方便调试和像我这样无聊的人看源码……

其实v8内部还有更多宏起着巨大的作用,比如在类声明时,有时候需要禁掉这个类的拷贝构造函数和赋值功能,v8都把这个封装到一个宏里,声明的时候直接调用就行了,这些后面深入的时候再来细说把。

深入V8引擎-引擎内部类管理解析的更多相关文章

  1. V8 javascript 引擎

    V8是一个由丹麦Google开发的开源java script引擎,用于Google Chrome中.[2]Lars Bak是这个项目的组长.[3]   V8在执行之前将java script编译成了机 ...

  2. 用NAN简化Google V8 JS引擎的扩展

    通过C++扩展Google V8 JS引擎的文章很多,Google V8 JS带的例子也容易明白.但是大部分文章都是Hello World型的,真正使用时发现处处是坑.扩展V8最经典的例子就是node ...

  3. 在Android上使用Google V8 JS 引擎

    在cantk-runtime中直接使用的webview,通过JAVA扩展接口把Canvas的2d Context的API定向到JNI,通过OpenGL来图形加速,渲染速度大大提高.后来测试发现在大部分 ...

  4. V8:V8(Javascript引擎)

    ylbtech-V8:V8(Javascript引擎) Lars Bak是这个项目的组长,目前该JavaScript引擎已用于其它项目的开发.第一个版本随着第一个版本的Chrome于2008年9月2日 ...

  5. ClickHouse(10)ClickHouse合并树MergeTree家族表引擎之ReplacingMergeTree详细解析

    目录 建表语法 数据处理策略 资料分享 参考文章 MergeTree拥有主键,但是它的主键却没有唯一键的约束.这意味着即便多行数据的主键相同,它们还是能够被正常写入.在某些使用场合,用户并不希望数据表 ...

  6. .NET Core中的认证管理解析

    .NET Core中的认证管理解析 0x00 问题来源 在新建.NET Core的Web项目时选择“使用个人用户账户”就可以创建一个带有用户和权限管理的项目,已经准备好了用户注册.登录等很多页面,也可 ...

  7. 通过数据库中的表,使用 MyEclipse2017的反向生成工具-->hibernate反转引擎引擎(MyEclipse2017自带的插件) 来反转生成实体类和对应的映射文件

    通过数据库中的表,使用 MyEclipse2017的反向生成工具-->hibernate反转引擎引擎(MyEclipse2017自带的插件) 来反转生成实体类和对应的映射文件   文章目录 Ja ...

  8. 使用室内三维地图引擎ESMap来管理摄像头设备、消防设备和人员轨迹展示

    目前室内三维地图如何轻量化,能够在手机微信.电脑浏览器等平台快速显示地图,显示的地图性能好,转动地图不卡是大家都要面对的问题, 使用室内三维地图引擎ESMap后目前可以不用操心这方面的问题,开发只需要 ...

  9. V8 Javascript 引擎设计理念

    Netscape Navigator 在 90 在年代中期对 JavaScript 进行了集成,这让网页开发人员对 HTML 页面中诸如 form .frame 和 image 之类的元素的访问变得非 ...

随机推荐

  1. MQTT实战2 - 使用MQTTnet实现mqtt通信

    MQTT实战1 - 使用Apache Apollo代理服务器实现mqtt通信 MQTT实战2 - 使用MQTTnet实现mqtt通信 源码下载 -> 提取码  QQ:505645074 MQTT ...

  2. 软件设计师【软件工程:软件开发模型、XP极限编程十二最佳实践】

    一.软件开发模型 二.XP极限编程十二最佳实践

  3. python爬虫(5)——BeautifulSoup & docker基础

    BeautifulSoup基础实战 安装:pip install beautifulsoup4 常用指令: from bs4 import BeautifulSoup as bs import url ...

  4. E08【选尺码】I'm looking for size 43

    核心句型 I'm looking for size 43 我想要43号的 场景对话 A:Can I help you?您需要什么? B:Yes,can I try on those shoes,ple ...

  5. 201871010132--张潇潇--《面向对象程序设计(java)》第十六周学习总结

      博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh 这个作业的要求在哪里 https://www.cnblogs.c ...

  6. SHELL脚本--变量

    环境变量 环境变量就是运行在"环境"上下文的,在这个上下文都可以引用.例如,常见的cd.ls等命令严格来说应该使用绝对路径如/bin/ls来执行,由于/bin目录加入到了PATH环 ...

  7. HTML与CSS学习笔记(1)

    1.web三大核心技术? HTML CSS JavaScript 2.HTML基本机构和属性 HTML:超文本 标记 语言 超文本:文本内容+非文本内容(图片.视频.音频等) 标记:<单词> ...

  8. VC 静态库与动态库(一)介绍

    定义: 静态库与动态库都属于库,库从本质上来说就是种代码重用的方式. 把需要重复使用的公共代码抽离出来,生成库文件,外部程序只需包含库文件,调用相关接口即可 静态库与动态库区别: 静态库:需要库的.h ...

  9. UiPath:Split(","c)以逗号区分遍历字符串数组

    学习中遇到同一用户多种职业的情况,因为所有的数据都是从Excel里面取的,所以只能把所有的职业写在一个单元格里,以逗号区分. 那么就需要先把字符串转为数组,然后遍历数组去添加职位.如图 Split(& ...

  10. JS onFocus和onBlur

    onFocus事件就是当光标落在文本框中时发生的事件. onBlur事件是光标失去焦点时发生的事件. <form action="/chat" method="ge ...