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. linux 广播和组播

    广播和组播 广播,必须使用UDP协议,是只能在局域网内使用,指定接收端的IP为*.*.*.255后,发送的信息,局域网内的所有接受端就能够接到信息了. 广播的发送端代码 #include <st ...

  2. Nginx+Docker部署模式下 asp.net core 获取真实的客户端ip

    目录 Nginx+Docker部署模式下 asp.net core 获取真实的客户端ip 场景 过程还原 结论 参考资料 Nginx+Docker部署模式下 asp.net core 获取真实的客户端 ...

  3. ajax的一些知识

    一.关于XMLHttpRequest的实例的属性和方法 实例的属性: 1.xhr.response 响应主体内容 2.xhr.responseText 响应主体内容字符串(JSON或者XML格式字符串 ...

  4. 使用rider做为unity的代码编辑器

    使用Rider做的编写Unity代码的IDE,记录一些与VS不相同的笔记 安装和设置方法: 我使用Rider 2019.1 + Unity3D 2018.3.4,在安装完Rider之后,在Unity中 ...

  5. git使用笔记(第一次)

    背景:公司基于微服务的架构,前端的服务web只有一个.在并行完成不同需求的测试任务时,该服务会拉出不同分支,此时会碰到sit环境与其他测试小伙伴部署冲突的问题.解释下.需求1对应的服务web的A分支, ...

  6. HttpWatch功能详细介绍

    来源:https://www.cnblogs.com/Chilam007/p/6947235.html HttpWatch是功能强大的网页数据分析工具,集成在IE工具栏,主要功能有网页摘要.cooki ...

  7. Spring Boot Quartz 动态配置,持久化

    Quartz 是一个很强大的任务调度框架在SpringBoot中也很容易集成 添加依赖: <dependency> <groupId>org.springframework&l ...

  8. MyBatisPlus快速入门

    MyBatisPlus快速入门 官方网站 https://mp.baomidou.com/guide 慕课网视频 https://www.imooc.com/learn/1130 入门 https:/ ...

  9. zz独家专访AI大神贾扬清:我为什么选择加入阿里巴巴?

    独家专访AI大神贾扬清:我为什么选择加入阿里巴巴? Natalie.Cai 拥有的都是侥幸,失去的都是人生 ​关注她 5 人赞同了该文章 本文由 「AI前线」原创,原文链接:独家专访AI大神贾扬清:我 ...

  10. VIJOS-P1625 精卫填海

    JDOJ 1587 VIJOS-P1625 精卫填海 https://neooj.com/oldoj/problem.php?id=1587 洛谷 P1510 精卫填海 https://www.luo ...