chromium源码阅读--V8 Embbeding
V8是google提供高性能JavaScript解释器,嵌入在chromium里执行JavaScript代码。
V8本身是C++实现的,所有嵌入本身毫无压力,一起编译即可,不过作为一个动态语言解释器,它的世界观肯定跟C++还是有区别的。
编程语言定义了计算机对现实世界的表达方式,不同的语言有不同的认识,在JavaScript里,类,对象,方法的表达与C++只在概念上保持一致,在表达和实现上是有很大不同的。
那么要将C++类或对象绑定到V8里,就需要做一些对应的转换,才能使得V8认识C++定义的东西。V8提供函数模板(class FunctionTemplate)和对象模板(class ObjectTemplate)用来创建JS的函数与对象,
对JS有一定了解的同学,应该知道JS没有class关键字,只有function关键字,JS的类也是通过function定义的构造函数来完成的,而对于类的方法声明也是通过prototype来添加的,并且这一切都是可以动态添加(这感觉太酸爽~)哦。
嗯,通过C++来给V8解释器添加新的类,对象,函数等等,这个本身不动态,但是如果嵌入V8引擎,那个通过js脚本,可以配合已有的C++代码就可以很方便的完成类似插件的功能,在线热更新功能等等,这个跟做游戏的嵌入lua脚本,Python脚本也是类似的。
1、 V8的嵌入
这个只需要参考HelloWorld例子即可,代码在v8/samples目录下。
2、 函数模板与对象模板
FunctionTemplate和ObjectTemplate都继承Template,并且最上层父基类是Data类,而Data类是v8里所有值(class Value)和模板(class Template)的父类,是一个superclass.
FuntionTemplate,ObjectTemplate与Object的关系是:
如上图,通过对应的函数接口生成Object对象,该对象就是v8解释器里实际操作的对象。
为了避免繁杂的文字描述,以下举一些实际的code来说明如何来实际使用:
以下代码都是同步最新的chromium v8版,网上很多实例都是已经过时不能参考了。
(1)JS对象的创建:
(2)JS类的创建: