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. composer基本操作详解

    原文转自微信公众号:qq1005349393 Composer介绍 Composer 是 PHP 的一个包依赖管理工具.我们可以在项目中声明所依赖的外部工具库,Composer 会帮你安装这些依赖的库 ...

  2. JMETER 审批任务实战

    业务场景 我们需要对流程任务进行审批,这个和流程发起是不一样的,因为在流程发起时,只需要用户登录后,指定固定的流程方案和数据就可以发起流程了. 流程任务是需要获取任务ID再做任务审批的. 实现思路 1 ...

  3. CnetOS6.7编译安装MariaDB

    --安装所需软件包 [root@localhost mariadb-10.1.14]# yum install bison bison-devel ncurses libxml2 libxml2-de ...

  4. 2.3 Scala面向对象编程基础

    一.类 1.类的定义 Unit表示什么都不返回 方法体最后一句的值,就是方法的返回值. 2.类成员的可见性 3.方法的定义方式 定义方法的时候加圆括号,调用时可以加圆括号c.getValue()也可以 ...

  5. 笔记7:Jquery知识

    jQuery 1 基本知识 jQuery 是一个 JavaScript 库.jQuery 极大地简化了 JavaScript 编程.其下载地址:http://jquery.com/download/ ...

  6. c# 第一节 .net与c#区分

    本节内容: 三个概念:1:.net 和c# 区分2:c# 可以做的事情3:.net 的两种交互模式 1:.net 和c# 区分 .net 一般指.Net Framework框架,是Microsoft为 ...

  7. 201871010126 王亚涛 《面向对象程序设计 Java》 第十五周学习总结

    内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p/11 ...

  8. Maven 中 dependencyManagement 元素,知识点

    Maven 提供的 dependencyManagement 元素既能让子模块继承到父模块的依赖配置,又能保证子模块依赖使用的灵活性.在 dependencyManagement 元素下的依赖声明不会 ...

  9. day8_7.8 文件操作

    一.文件模式 1.在文件的操作中,也有很多补充 的模式可使用 1.r+,可读可写模式,在此模式中,操作权限时可读可写,这里的写与write模式不一样的是,不再清空文件内容,写的内容添加到文件的后面,而 ...

  10. java 启动jar 指定端口

    java 启动jar 指定端口 java -jar xxx.jar --server.port=80