内容简介

《Ruby原理剖析》解开Ruby编程语言的魔法面纱。《Ruby原理剖析》图文并茂、深入浅出地剖析了Ruby编程语言的核心工作原理。作者本着科学实证的精神,设计了一系列实验,帮助读者轻松了解这门编程语言的工作奥秘,包括Ruby如何用虚拟机执行代码,Ruby的垃圾回收算法,以及类和模块在Ruby内部的关系等。

作者简介

PatrickShaughnessy是著名的Ruby开发者,目前在麦肯锡管理咨询公司(McKinsey&Co.)从事开发工作。Patrick有20多年软件开发工作经验,精通C、Java、PHP、Ruby等多种编程语言。他是RubyConferenceCircuit的主持人,定期在RubyWeekly电子报、Ruby5Podcast和TheRubyShow上发表文章和演讲。他的博客地址:http://patshaughnessy.net

精彩书评

“很多人研究过Ruby的源码,但很少有人像Patrick这样把研究成果写成一《Ruby原理剖析》。我特别喜欢书里的图表,加上Patrick恰到好处的解说,晦涩难懂的内容变得易于理解。《Ruby原理剖析》是编程极客和喜欢深入研究软件工具的Ruby爱好者的福音。”

——PETERCOOPER(@PETERC),《RUBYINSIDE》《RUBYWEEKLY》的编辑

“这《Ruby原理剖析》填补了Ruby领域的空白——内容太棒了!”

——XAVIERNORIA(@FXN),RUBYHERO、RUBYONRAILS核心团队成员

“PatrickShaughnessy做了一件很棒的事,写了这本关于Ruby内部原理的书。你一定要看,因为其他书里找不到这样的内容。”

——SANTIAGOPASTORINO(@SPASTORINO),WYEWORKS联合创始人、RUBYONRAILS核心团队成员

“这《Ruby原理剖析》让我爱不释手,它让我对Ruby和CS有了更深的理解。书中的图表真的非常棒,我写代码时会浮现在我的脑海里。它是我zui喜欢的三本Ruby书籍之一。”

——VLADIVANOVIC(@VLADIIM),HOLLERSYDNEY的数字媒体策略师

“虽然我不经常研究Ruby的内部原理,但是这《Ruby原理剖析》绝对值得一读。”

——DAVIDDERYLDOWNEY(@DAVIDDWDOWNEY),CYBERSPACETECHNOLOGIESGROUP创始人

目录

1分词与语法解析3

1.1词条:构成Ruby语言的单词5

1.2语法解析:Ruby如何理解代码13

1.2.1理解LALR解析算法14

1.2.2真实的Ruby语法规则21

1.3总结31

2编译33

2.1Ruby1.8没有编译器34

2.2Ruby1.9和Ruby2.0引入了编译器35

2.3Ruby如何编译简单脚本37

2.4编译块调用41

2.5本地表49

2.5.1编译可选参数52

2.5.2编译关键字参数53

2.6总结57

3Ruby如何执行代码59

3.1YARV内部栈和Ruby调用栈60

3.1.1逐句查看Ruby如何执行简单脚本62

3.1.2执行块调用65

3.2访问Ruby变量的两种方式72

3.2.1本地变量访问72

3.2.2方法参数被看成本地变量75

3.2.3动态变量访问76

3.3总结86

4控制结构与方法调度89

4.1Ruby如何执行if语句90

4.2作用域之间的跳转93

4.2.1捕获表94

4.2.2捕获表的其他用途96

4.3send指令:Ruby最复杂的控制结构99

4.3.1方法查找和方法调度99

4.3.2Ruby方法的11种类型100

4.4调用普通Ruby方法102

4.4.1为普通Ruby方法准备参数103

4.5调用内建的Ruby方法104

4.5.1调用attr_reader和attr_writer105

4.5.2方法调度优化attr_reader和attr_writer106

4.6总结110

5对象与类113

5.1Ruby对象内部114

5.1.1检验klass和ivptr115

5.1.2观察同一个类的两个实例117

5.1.3基本类型对象118

5.1.4简单立即值完全不需要结构体119

5.1.5基本类型对象有实例变量吗120

5.1.6基本类型对象的实例变量保存在哪里122

5.2RClass结构体内部有什么125

5.2.1继承128

5.2.2类实例变量vs类变量129

5.2.3存取类变量131

5.2.4常量134

5.2.5真实的RClass结构体135

5.3总结140

6方法查找和常量查找143

6.1Ruby如何实现模块145

6.1.1模块是类145

6.1.2将模块include到类中147

6.2Ruby的方法查找算法148

6.2.1方法查找示例149

6.2.2方法查找算法实践151

6.2.3Ruby中的多继承152

6.2.4全局方法缓存153

6.2.5内联方法缓存154

6.2.6清空Ruby的方法缓存155

6.2.7在同一个类中include两个模块155

6.2.8在模块中include模块157

6.2.9Module#prepend示例158

6.2.10Ruby如何实现Module#prepend161

6.2.11在已被include的模块中增加方法164

6.2.12在已被include的模块中include其他模块164

6.2.13“被include的类”与原始模块共享方法表166

6.3常量查找168

6.3.1在超类中查找常量169

6.3.2Ruby如何在父级命名空间中查找常量170

6.4Ruby中的词法作用域171

6.4.1为新类或模块创建常量172

6.4.2在父命名空间中使用词法作用域查找常量173

6.4.3Ruby的常量查找算法175

6.4.4Ruby真实的常量查找算法177

6.5总结178

7散列表:Ruby内部的主力军181

7.1Ruby中的散列表182

7.1.1在散列表中保存值183

7.1.2从散列表中检索值185

7.2散列表如何扩展以容纳更多的值188

7.2.1散列冲突188

7.2.2重新散列条目189

7.3Ruby如何实现散列函数195

7.3.1Ruby2.0中的散列优化202

7.4总结203

8Ruby如何借鉴Lisp几十年前的理念207

8.1块:Ruby中的闭包208

8.1.1Ruby如何调用块210

8.1.2借用1975年的理念212

8.2Lambda和Proc:把函数当做一等公民219

8.2.1栈内存vs堆内存220

8.2.2深入探索Ruby如何保存字符串的值220

8.2.3Ruby如何创建Lambda223

8.2.4Ruby如何调用Lambda226

8.2.5Proc对象227

8.2.6在同一个作用域中多次调用lambda232

8.3总结234

9元编程237

9.1定义方法的多种方式239

9.1.1Ruby的普通方法定义过程239

9.1.2使用对象前缀定义类方法241

9.1.3使用新的词法作用域定义类方法242

9.1.4使用单类定义方法244

9.1.5在单类的词法作用域中定义方法245

9.1.6创建Refinement246

9.1.7使用Refinement248

9.1.8顶级作用域中的self250

9.1.9类作用域中的self251

9.1.10元类作用域中的self252

9.1.11类方法中的self253

9.2元编程与闭包:eval、instance_eval和binding255

9.2.1能写代码的代码255

9.2.2使用binding参数调用eval257

9.2.3instance_eval示例259

9.2.4Ruby闭包的另一个重点260

9.2.5instance_eval改变接收者的self262

9.2.6instance_eval为新的词法作用域创建单类262

9.2.7使用define_method266

9.2.8充当闭包的方法266

9.3总结268

10JRuby:基于JVM的Ruby271

10.1使用MRI和JRuby运行程序272

10.1.1JRuby如何解析和编译代码274

10.1.2JRuby如何执行代码276

10.1.3用Java类实现Ruby类278

10.1.4使用-J-XX:+PrintCompilation选项281

10.1.5JIT是否提升了JRuby程序的性能283

10.2JRuby和MRI中的字符串284

10.2.1JRuby和MRI如何保存字符串数据284

10.2.2写时复制286

10.2.3创建唯一且非共享的字符串288

10.2.4可视化写时复制290

10.2.5修改共享字符串更慢291

10.3总结293

11Rubinius:用Ruby实现的Ruby295

11.1Rubinius内核和虚拟机296

11.1.1词法分析和解析298

11.1.2使用Ruby编译Ruby299

11.1.3Rubinius字节码指令300

11.1.4Ruby和C++一起工作302

11.1.5使用C++对象实现Ruby对象303

11.1.6Rubinius中的(栈)回溯305

11.2Rubinius和MRI中的数组307

11.2.1MRI中的数组307

11.2.2Rubinius中的数组309

11.2.3阅读Array#shift源码311

11.2.4修改Array#shift方法312

11.3总结315

12MRI、JRuby、Rubinius垃圾回收317

12.1垃圾回收器解决三个问题319

12.2MRI中的垃圾回收:标记与清除320

12.2.1空闲列表320

12.2.2标记321

12.2.3MRI如何标记存活对象323

12.2.4清除323

12.2.5延迟清除324

12.2.6标记-清除的缺点325

12.2.7观察MRI执行延迟清除327

12.2.8观察MRI执行全回收328

12.2.9解读GC分析报告329

12.3JRuby和Rubinius中的垃圾回收332

12.4复制垃圾回收333

12.4.1碰撞分配333

12.4.2半空间算法334

12.4.3伊甸堆336

12.5分代垃圾回收337

12.5.1弱代假说337

12.5.2为新生代使用半空间算法338

12.5.3晋升对象338

12.5.4成熟代对象垃圾回收339

12.6并发垃圾回收341

12.6.1当对象图改变时进行标记341

12.6.2三色标记343

12.6.3JVM中的三种垃圾收集器344

12.6.4触发主收集347

12.7延伸阅读348

12.8总结349

索引351

前言/序言

哦,你好!虽然我向来喜欢含蓄,但我不得不说:你应该买这《Ruby原理剖析》!

我的名字叫AaronPatterson,但是网络上的朋友都叫我tenderlove。我效力于Ruby和RubyonRails的核心团队,同时也是这《Ruby原理剖析》的技术顾问。这是不是意味着你就应该听我的呢?不是的。好吧,也许。

实际上,当Patrick要我做这《Ruby原理剖析》的技术顾问时,我兴奋得帽子都差点掉了,眼镜也掉到咖啡里去了!我知道很多开发者都被Ruby的底层原理吓住了,不敢深入研究。常常有人问我该如何学习Ruby的底层原理,或者该从哪里入手。不幸的是,我没能给他们一个好答案,但现在我可以回答他们了。

Patrick科研式的写作风格让Ruby的底层原理变得更加直观。实验与讲解的结合让Ruby的行为和性能更容易理解。如果你对Ruby代码产生疑惑,无论是性能表现、局部变量,还是垃圾回收,你都能在这《Ruby原理剖析》里找到解答。

如果你想探索Ruby内部原理,或者想理解Ruby的工作方式,那就不用犹豫了,这本就是你要找的书。我很喜欢这《Ruby原理剖析》,希望你也喜欢。

AaronPatterson


其他推荐