深入V8引擎-枚举+位运算实现参数配置

不知不觉都快月底了,看了看上一篇还是6号写的,惭愧惭愧,说好的坚持。为了证明没有偷懒(其实还是沉迷了一会dota2),先上一个图自证清白。

深入V8引擎-枚举+位运算实现参数配置_第1张图片

基本上从初始化引擎,到Isolate、handleScope、Context一直到编译其实都有记录,但是实在是无从下手。虽说我的博客也没有什么教学意义,但是至少也需要有一个中心和结论。很遗憾,上述的每一步都并互有关联,也就是单独拿出来写毫无意义。而从整体架构来阐述,然后细化到这每一步,我又还没有到那个境界。因此,综合考虑下,决定先暂时放弃逐步解析,优先产出一些有意义的东西。

这一篇的内容属于V8中(或许是C++独有)使用比较普遍的一个技巧,很多模块都有使用。

当初在入门学JS的时候,到了ajax那里,跟着视频学封装。老师讲,如果参数过多,就包装成封装一个对象,这样只需要一个参数就可以了。当时我想着,一个对象也好麻烦啊,还不如封装的时候自己定义一下,如果传1,就代表是"GET"请求,传2,就代表"POST"等等。没想到,当初天真的想法,竟然在C++里面实现了。

 

下面开始正文,首先需要简单介绍一下枚举,话说各位用过TS的大佬应该都懂,或者接触过protobuf这些数据格式化库也有。枚举在很多语言中都有,定义简单说就是一系列的常量集合,通常用来做简单配置。如果没有指定值,那么就是0、1、2...依次增加,举例如下。

enum fruit {
  apple,
  banana,
  pear,
  orange = 5,
};

int main(int argc, const char * argv[]) {
  cout << "enum apple is " << fruit::apple << endl;
  cout << "enum banana is " << fruit::banana << endl;
  cout << "enum pear is " << fruit::pear << endl;
  cout << "enum orange is " << fruit::orange << endl;
  return 0;
}

这里我们定义了一个枚举类型,依次打印每一个值,会得到0、1、2,而第四个由于手动指定了值,所以会得到5。如果不去手动指定值,从JS的角度来看枚举有点类似于一个颠倒形式的数组,比如说定义['apple', 'banana', 'pear'],通过下标0、1、2可以取到对应的值,而枚举恰恰相反,通过枚举值取到的是"下标"。大部分简单的配置情况下,是不用去关心枚举具体的值。这样,关于枚举就介绍完了,很简单。

接下来,来看看V8是如何利用这个数据类型来实现参数配置。在对JS源码字符串的编译过程中,有一个类十分重要,负责记录String => AST的过程,名为ParseInfo,这里不去探究转换过程,单纯看一下这个类的标记配置相关,类定义如下。

namespace v8 {
namespace interval {

// A container for the inputs, configuration options, and outputs of parsing.
/**
 * 有5个构造函数和大量私有属性
 */
class ParseInfo {
  public:
    explicit ParseInfo(AccountingAllocator* zone_allocator);
    explicit ParseInfo(Isolate*);
    ParseInfo(Isolate*, AccountingAllocator* zone_allocator);
    ParseInfo(Isolate* isolate, Handle
                    
                    

你可能感兴趣的:(深入V8引擎-枚举+位运算实现参数配置)