鸽了

在动态语言中,这是一种加速手段,用于快速找到类型原型(存一份)

这篇文章的例子作为参考

function getX(o) {
 return o.x;
}

这段代码的字节码是

get_by_id loc0, arg1, x
return loc0

大意是拿到参数1 arg1存到loc0地址并且加载x,然后返回地址

inline cache究竟cache了什么?在对象的元信息,比如字段,字段的便宜这些概念抽象出一个shape的概念,cache的就是shape

json本身是不保存shape的,有另外的映射

那比如{x:'a'}这种简单的参数,第一次传,get_by_id就cache一下这种类型,x偏移是0,下次再来调用,对比shape相同,就不用算偏移了,直接命中

再举一个例子

一个inline cache的使用

typedef unsigned char byte;

#define STACK_SIZE 100

typedef struct {
  Object* stack_array[STACK_SIZE];
  Object** stack;
  Code* code;
  int pc;
} Frame;

void eval_code_uncached(Code* code, Object** args, int nargs) {
  Frame frame;
  init_frame(&frame, code);
  while (true) {
    Opcode op = code->bytecode[frame.pc];
    byte arg = code->bytecode[frame.pc + 1];
    switch (op) {
      case ARG:
        CHECK(arg < nargs && "out of bounds arg");
        push(&frame, args[arg]);
        break;
      case ADD: {
        Object* right = pop(&frame);
        Object* left = pop(&frame);
        Method method = lookup_method(object_type(left), kAdd);
        Object* result = (*method)(left, right);
        push(&frame, result);
        break;
      }
      case PRINT: {
        Object* obj = pop(&frame);
        Method method = lookup_method(object_type(obj), kPrint);
        (*method)(obj);
        break;
      }
      case HALT:
        return;
      default:
        fprintf(stderr, "unknown opcode %d\n", op);
        abort();
    }
    frame.pc += kBytecodeSize;
  }
}

这里的lookup_method


参考链接

  • https://zhuanlan.zhihu.com/p/38202123
  • Pyston https://blog.pyston.org/2016/06/30/baseline-jit-and-inline-caches/
  • 这里展示了一个inline cache实现https://bernsteinbear.com/blog/inline-caching/
  • https://bernsteinbear.com/blog/small-objects/
  • https://blog.csdn.net/sinat_39956944/article/details/105165074