查看Ruby Under a Microscope的源代码
←
Ruby Under a Microscope
跳转到:
导航
、
搜索
因为以下原因,你没有权限编辑本页:
您刚才请求的操作只有这个用户组中的用户才能使用:
用户
您可以查看并复制此页面的源代码:
== YARV 执行代码 == * 整体上, YARV 跟 JVM 的构造机器类似。 YARV 也是有一个调用栈,每个栈帧 rb_control_frame_t 包含 sp( stack pointer,指向栈顶), pc(程序计数器,当前指令地址),self(接收者) 和 type (节点类型)等信息。CFP (current frame pointer) 指向当前的 rb_control_frame_t。调用就是压入和弹出栈帧,栈帧内部维护操作数栈,pc 指向指令地址,对操作数和接收者进行入栈出栈操作,根据指令求值。YARV 也被称为是双堆栈虚拟机。 * 所有 YARV 指令定义在 https://github.com/ruby/ruby/blob/bd2fd73196bbff7dc5349c624342e212c09d174e/insns.def,最终经过 Miniruby 转成 vm.inc 的 c 语言代码。 * 指令基本格式 <pre> instruction comment @c: category @e: english description @j: japanese description instruction form: DEFINE_INSN instruction_name (instruction_operands, ..) (pop_values, ..) (return value) { .. // insn body } DEFINE_INSN getlocal (lindex_t idx, rb_num_t level) () (VALUE val) { int i, lev = (int)level; const VALUE *ep = GET_EP(); /* optimized insns generated for level == (0|1) in defs/opt_operand.def */ for (i = 0; i < lev; i++) { ep = GET_PREV_EP(ep); } val = *(ep - idx); } </pre> * 本地变量的访问,通过 getlocal 和 setlocal 指令,当 CFP 变化的时候,为了访问本栈帧之外的 local 变量, YARV 还引入了一个叫 EP( environment pointer) 的指针,它被设置为 SP-1。 栈帧之间的 EP 形成了一种层次结构(其实就是嵌套作用域),通过 EP 的移动来访问外部环境的本地变量。 * 内部栈还有两个特殊栈帧 special 和 svar/cref, special 用于保存传递了 Block 代码块的指针,指向代码块所在的栈帧,让 EP 可以找到正确的栈帧。后者 svar 用于保存特殊变量,$ 开头的一些特殊变量,特别是跟正则相关的,比如 $&, $~ 等。而 cref 用于标示是否要在一个新的词法作用域内(lexical scope)执行。 Ruby 中开启新的词法作用域的只有:使用class关键字定义一个类;使用module 定义一个模块;使用def关键字定义一个方法。而 Block 是没有的。这一块在 ruby 元编程里有详细描述。
返回到
Ruby Under a Microscope
。
个人工具
登录
名字空间
页面
讨论
变换
查看
阅读
查看源代码
查看历史
操作
搜索
导航
首页
社区专页
新闻动态
最近更改
随机页面
帮助
工具箱
链入页面
相关更改
特殊页面