赞 | 0 |
VIP | 2 |
好人卡 | 27 |
积分 | 1 |
经验 | 26327 |
最后登录 | 2019-10-13 |
在线时间 | 953 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 110
- 在线时间
- 953 小时
- 注册时间
- 2007-4-25
- 帖子
- 805
|
本帖最后由 苏小脉 于 2010-10-27 03:06 编辑
概念类似,它们都是一种元编程,不过"编译"一词不妥。C/C++ 预处理指令直接影响了编译时生成的二进制代码,可以静态决定参与编译的代码内容,所以可以说是"条件编译";而 CRuby (1.9 后)代码无论如何都会先被编译为 YARV 字节码,条件只是决定了解释器"解释"与否。
如:
- if false
- def foo
- p 1
- end
- end
复制代码 这段代码会被编译为:- == disasm: <RubyVM::InstructionSequence:<compiled>@<compiled>>==========
- 0000 trace 1 ( 1)
- 0002 jump 22
- 0004 trace 1 ( 2)
- 0006 putspecialobject 1
- 0008 putspecialobject 2
- 0010 putobject :foo
- 0012 putiseq foo
- 0014 send :"core#define_method", 3, nil, 0, <ic:0>
- 0020 leave ( 1)
- 0021 pop
- 0022 putnil ( 2)
- 0023 leave
- == disasm: <RubyVM::InstructionSequence:foo@<compiled>>=================
- 0000 trace 8 ( 2)
- 0002 trace 1 ( 3)
- 0004 putnil
- 0005 putobject 1
- 0007 send :p, 1, nil, 8, <ic:0>
- 0013 trace 16 ( 4)
- 0015 leave ( 3)
复制代码 而如果是 C/C++ 预处理指令,foo 这个函数压根儿就不参与编译。预处理指令条件是静态的,在编译时确定;而 Ruby 的条件可以是动态的,在运行时确定。 |
评分
-
查看全部评分
|