内容简介
《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