介绍一本好书 :)

时间:2025-01-15 10:26:03 来源:作文网 作者:管理员
好书介绍

一年多没有更新专栏了,催更的私信收到很多。首先,要和大家道个歉,专栏里的内容确实还有一些没有完结的。但我其实这一年也没闲着,所有的业余时间都用来写这样一本书:

《自己动手写Python虚拟机 海纳 书》【摘要 书评 试读】- 京东图书

这本书里详细地介结了如何写一个解释型语言的虚拟机。嗯。所以,这篇文章其实是一篇硬广告。哈哈。

写书的时候有一些心得,本身不适合放在书里去讲的。在这里补充一下。

这本书里有很多有意思的主题,是市面上同类型的书都没有涉及的。我这里想再补充一下,顺便有一些东西也想吐槽。我们一条条地说。

一切皆是对象

要想学好Python,一定要牢牢记住这句话:一切皆是对象。类型是对象,函数是对象,类也是对象。在以前的Python虚拟机的相关文章或者书籍中,对于这一条的解释总是让人觉得不过瘾。比如,我在面试的时候喜欢问的 instanceof 的实现机制,就需要对对象系统有深入地了解。Java程序员可以想想,自己是不是能讲明白,Long.class,Class.forName背后的机制?Python虚拟机的源代码也非常晦涩,因为那里没有特别地把 type, object, typeobject区分开来。但在这本书里,我的实现是使用了Hotspot中的Klass-oop的命名方式,然后,再借鉴了java_mirror的设计,让一切皆是对象变得不再模糊不清。当你写下type,type时就不会再模糊不清。

大家还记得这段神奇的代码吗?几乎每一个Python初学者都会被搞懵的一个例子:

>>> def func: ... lst.append ... print ... >>> func [1] >>> func

只有深刻地理解了函数也是对象,才能搞明白这段代码背后的问题。

垃圾回收

垃圾回收是每个Java程序员的必备技能,几乎所有的Java面试,日常工作中的所有调优都和GC相关,但有几个程序员写过垃圾回收的代码呢?我相信肯定有很多程序员有和我一样的困惑,GC的原理看了一大堆,自己想改进一下GC算法感觉无从下手,不管是Python还是Hotspot,还是什么Go,Art,它们的代码都十分庞大,想看懂都已经很难了,更不要说还想在里面改几行代码了。

我曾经在一个Java语言讨论群里看大家讨论,里面讲到什么是roots,这个东西只要自己写一个最简单的GC就能讲明白的,但如果只是原理讲解却是很难理解的。这就是理论和实践的差别。在这本书里,我只用300行代码就实习了一个完备的copy gc。为读者提供了一个良好的示范,然后因为copy gc非常简单,大家完全可以在这个框架里去完善自己的算法,在这个架子里去做mark-sweep, mark-compaction,甚至于分代,分region都是可能的。

我觉得一个Java程序员,一个Python,Android,Go的程序员,一生应该至少写一个专属于自己的内存管理框架。我们天天讲GC,却从未动手写过,实在是一大遗憾。

迭代

出乎我意料的是,很多Python程序员竟然没用过yield,更有少部分是听都没听说过。这就很糟糕了。同步,异步编程是程序员的基本技能之一。yield算是一个stackless的小协程吧。大家如果读完我的这本书就会明白yield和Generator是怎么回事了。javascript里也有Generator,v8里的实现和python中yield的实现是完全一样的。实现完yield以后再往前走一步,如果说我们每次保存状态都是把栈全部保存下来,那就是协程了。好多人看协程,goroutine的相关文章,看得十分痛苦,看上好几遍还不知道什么意思,那是因为没有掌握正确的学习方法,一旦你把虚拟机里的实现搞明白了。再去学习协程,你会体会到降维打击的乐趣。

通过字节码完全读透代码

Python中有很多非常特别的语法,我们称之为pythonic的,例如,正确地使用lambda表达式,在合适的地方使用with语句,通过decorator简化代码,适当的时候使用列表,字典推导。这些特性看着好像挺高级的,但其实它翻译成的字节码平平无奇,在学习Python的时候遇到一些特殊的语法,我们最好是有查看它所对应的字节码的能力。如果我们把字节码的种种细节都搞明白了,这些特别的语法在我们眼里就毫无秘密可言了。

再比如Python中的闭包的写法,正确的写法是这样的:

def cnt_func : cnt = 0 def foo : nonlocal cnt print cnt += 1 print ) return foo f = cnt_func f f

如果第4行,不带nonlocal标志,那就会报出奇怪的错误(这一点和大多数支持闭包的语言都有所不同)。为什么会产生这样奇怪的区别呢?我们只有从字节码中才能找到答案。

我个人觉得,结合我学习编程的过程来看,一些花了很多时间才理解的本质问题在这本书里,我都尽量地告诉读者了。除此之外,关于语言的模块,类定义,绑定和非绑定方法等部分,都有很详尽的介绍。总之,我觉得这本书非常值得一读。

从头到尾做一个工程,可能会比专栏里比较零散的文章来得系统,学得更扎实。这是一本学习语言虚拟机基本原理的必备书(至少目前为止,我认为是这样)。

文章的最后,还是要感谢专栏的读者们,是你们的热情鼓励着我去完成这样一件事情;中间有很多主题也是在和专栏读者们交流时得到的启发。谢谢大家。关于这本书,如果有任何问题,欢迎来我的工程里提issue。





专栏目录:
上一篇:介绍好书
下一篇:中国好书

TAG标签:一本好书介绍

热门排行: 2016拜年词 好词