gpt4 book ai didi

ruby - 看到 Ruby 的内幕了吗?

转载 作者:数据小太阳 更新时间:2023-10-29 07:48:40 29 4
gpt4 key购买 nike

我最近一直在努力学习编程语言实用学第 3 版,以了解更多关于语言在底层如何工作的信息,并且通过查看由真正基本的 GCC 编译的 C 代码生成的程序集,我获得了很多进展.我开始对 C 系列的静态语言越来越熟悉,我也想开始研究解释型语言。

作为我最喜欢的脚本语言,Ruby 将是一个很好的候选者。我认为从 MRI 开始学习是可以的,并弄清楚所有扫描/解析/语义分析/绑定(bind)/范围界定和其他魔术是如何在幕后发生的。

是否在任何地方对此进行了详细描述,或者有什么方法可以让我深入研究它,比如通过反汇编已编译的程序?我没有对解释性语言进行过多的研究,所以就 MRI 而言,我不太清楚从哪里开始。

谢谢!

最佳答案

您可以使用 RubyVM::InstructionSequence

查看任何 Ruby 源代码的 YARV 字节码

这是一个简单的例子:

class Greeter
def initialize(name)
@name = name
end
def greet!
puts @name
end
end

Greeter.new("Charlie").greet!

然后就可以编译反汇编了:

puts RubyVM::InstructionSequence.compile(src).disassemble

然后得到这样的输出:

== disasm: <RubyVM::InstructionSequence:<compiled>@<compiled>>==========
0000 trace 1 ( 1)
0002 putspecialobject 3
0004 putnil
0005 defineclass :Greeter, <class:Greeter>, 3
0009 pop
0010 trace 1 ( 10)
0012 getinlinecache 19, <ic:0>
0015 getconstant :Greeter
0017 setinlinecache <ic:0>
0019 putstring "Charlie"
0021 send :new, 1, nil, 0, <ic:1>
0027 send :greet!, 0, nil, 0, <ic:2>
0033 leave
== disasm: <RubyVM::InstructionSequence:<class:Greeter>@<compiled>>=====
0000 trace 2 ( 1)
0002 trace 1 ( 2)
0004 putspecialobject 1
0006 putspecialobject 2
0008 putobject :initialize
0010 putiseq initialize
0012 send :"core#define_method", 3, nil, 0, <ic:0>
0018 pop
0019 trace 1 ( 5)
0021 putspecialobject 1
0023 putspecialobject 2
0025 putobject :greet!
0027 putiseq greet!
0029 send :"core#define_method", 3, nil, 0, <ic:1>
0035 trace 4 ( 8)
0037 leave ( 5)
== disasm: <RubyVM::InstructionSequence:initialize@<compiled>>==========
local table (size: 2, argc: 1 [opts: 0, rest: -1, post: 0, block: -1] s1)
[ 2] name<Arg>
0000 trace 8 ( 2)
0002 trace 1 ( 3)
0004 getlocal name
0006 dup
0007 setinstancevariable :@name, <ic:0>
0010 trace 16 ( 4)
0012 leave ( 3)
== disasm: <RubyVM::InstructionSequence:greet!@<compiled>>==============
0000 trace 8 ( 5)
0002 trace 1 ( 6)
0004 putnil
0005 getinstancevariable :@name, <ic:0>
0008 send :puts, 1, nil, 8, <ic:1>
0014 trace 16 ( 7)
0016 leave ( 6)

关于ruby - 看到 Ruby 的内幕了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8571848/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com