《Lua设计与实现》的作者codedump:学习也要讲究性价比

本文仅用于学习和交流目的,不得用于商业目的。非商业转载请注明作译者、出处,并保留本文的原始链接:http://www.ituring.com.cn/art...

导读:

访谈之前,我曾多次央求codedump给我一张照片,用于简介部分的介绍。如他所愿,不管是派人偷拍还是全网开搜,我都没有得到也不可能找到一张照片。所以,就有了这样一篇没有嘉宾图片的访谈文章。

我想,这大概就是技术型人才的“通病”吧。低调、务实、有干货!

不过,我还是知道了codedump笔名掩盖下的真身,他被Lua吸引的原因,研究Lua的方法,Lua的优势以及Lua的编译原理,等等。

好了,还是你们自己开阅吧~

访谈嘉宾:

codedump,一线开发人员,长期从事互联网后端服务的开发工作。

他曾经在网易等公司从事游戏服务器后台开发,因为工作需要,使用C++编写服务核心引擎和使用Lua脚本编写游戏逻辑的技术组合,之后开始对Lua产生浓厚的兴趣。他不断地研究Lua的实现原理,并且陆续公布在网络上:www.codedump.info。

codedump多年的努力,最终以纸质图书的形式——《Lua设计与实现》呈现给了大家。

《Lua设计与实现》的作者codedump:学习也要讲究性价比

访谈话题:

越想做好一件事,心理负担就越大
接下这件事之后,我的心理负担变得很大。如果成为正式的出版物,读者是要真金白银地花钱来买的,我希望尽量做好,不辜负别人的期望。

为什么使用codedump这个笔名?有什么特殊的含义?

codedump是我自己造的单词,其实是code和dump这两个单词的组合。我很喜欢深入到代码层面去了解一些项目的运作原理,也就是把code给dump出来,所以就起了这个名字。总是会有人把它错看成coredump,话说哪有程序员用这个名字咒自己的。(笑)

写作《Lua设计与实现》的时候,最大的困难是什么?

写作过程中,主要有两方面的困难。

一方面是技术上的。最大的问题是,Lua解释器解析Lua文件、生成Lua Opcode的过程中,涉及一些编译原理的知识。另外,Lua为了效率其实是一次遍历的,也就是说,只分析一遍源文件就生成Opcode。虽然性能提升了很多,但是对于(当时基础不太好的)我来说就有不小的困难。

这方面的分析文档比较少,因为大部分Lua分析的文档集中在虚拟机本身的结构和运作上,涉及Lua解释器解析过程的文档太少了。后来,我找到了调试分析的办法,也就是像书里分析的那样:每分析一种类型的指令时,就以一段简单的Lua来具体分析,同时把握住分析的几个关键函数,如luaK_code和luaV_execute,慢慢地自己也就啃下来了。从我的角度来看,这部分的内容仍然不是很满意。如果精力允许,我希望可以继续这方面的研究。

另一方面的困难是心理上的。编辑王军花看到了我在Github上公开的文档,通过邮件找到我,希望把内容整理成书出版。等接下这件事之后,我的心理负担变得很大。如果成为正式的出版物,读者是要真金白银地花钱来买的,我希望尽量做好,不辜负别人的期望。

越想做好一件事,心理负担就越大。加上工作、家庭等因素,写作会被打断,重新捡起来又需要更多的时间和精力。因为觉得有些章节写得不够好,我一度有放弃这次出版计划的打算,还好编辑王军花有足够的耐心,才把这个差点半途而废的事情坚持做完了。

从最开始简单地写一些东西,到最后和出版社合作、和网上的朋友合作等,这些都是很好的经历。

你认为,书中哪部分最重要,为什么重要?

哪些部分“最重要”,其实还要看个人的需求。不过,我认为,应该了解Lua栈和虚拟机的一些原理,比如代码是如何先分析再到虚拟机中执行的,比如Opcode是如何组织在Lua栈中的。这部分的内容可以在书中的第五章找到,因为明白了这些知识会对理解代码的生成有帮助。

学习也要讲究性价比
接触Lua时,我发现Lua 5.1.4版本的代码量只有不到两万行。对于一个世界级同时在业界大量使用的脚本语言,这样的代码量确实性价比太高。

为什么对Lua产生浓厚的兴趣,谈一谈对Lua产生兴趣的缘由?

接触Lua时,我发现Lua 5.1.4版本的代码量只有不到两万行。对于一个世界级同时在业界大量使用的脚本语言,这样的代码量确实性价比太高。加上,我一直对如何实现一门语言很感兴趣,所以就坚持着学习了下来。我发现Lua的代码组织形式精干简洁,几乎没有冗余。相比Nginx,我认为Lua才是最好的C语言项目。

另外,我在Lua身上看到了一种别样的编程语言设计哲学。Lua从来没有追求过要做一门号称“可以解决所有问题”的语言,它对自己的定位就是辅助型的语言,这样的出发点也决定了它的特点——小巧、性能高、可扩展性强。

跟Python、Ruby这样的语言相比,Lua有哪些特点?更适合解决哪类的问题?

Python、Ruby的定位是全能型的语言,即它们可以独立完成一些工作。而Lua的定位是传球者、助攻者,它需要借助宿主语言,辅助宿主语言解决问题。

根据我之前从事网络游戏服务器开发的经验来看,Lua更适合运用在既需要高性能又需要灵活性的情况下。我们可以采用C、C++这样的编译型语言实现核心的模块,如网络、数据库操作等,同时提供接口给Lua层进行调用,在需要灵活实现的业务层用Lua代码来实现。

讨论Lua解决技术问题的时候,你想到的、最佳的实际例子是什么?

OpenResty,这个项目在章亦春(网名agentzh,OpenResty项目的发起人)的带领下,已经取得了巨大的成功。它的架构正是我前面提到的:使用高性能的编译型语言实现底层,同时给业务编写提供Lua接口。经过这些年的发展,OpenResty已经越来越像一个平台化的软件,开发人员不需要自己写底层的C代码,使用Nginx配置文件和Lua脚本就能驱动Nginx来完成业务。

另外,OpenResty把Lua的协程很好地使用了起来,以同步的方式来写业务代码,避免了异步回调的问题。做过高并发服务器的人都知道,事件驱动加异步回调是常用的手段,但是回调层次多了,又会让代码逻辑变得支离破碎,这些痛点就是协程类技术最好的发挥场所了。当然,这很大方面也得益于Lua的精简和高效。试想如果根据OpenResty的设计,每个链接就创建一个对应的Lua协程,那成本是很大的。

除了游戏、扩展数据库插件等方面,Lua适合开发Web应用吗?

前面提到的OpenResty就是基于Web服务器的例子。但是,好像现在还没有看到很流行的Web框架是使用Lua编写的。

简单介绍下Lua的编译原理?

Lua使用最简单的递归下降的分析方式,只需要扫描一遍Lua源文件,就生成Lua虚拟机执行所用的OpCode。原理本身并不难,只要能够清楚一些编译前端的知识就可以阅读Lua源码了,只是由于Lua对性能的追求,所以代码写得很精简,需要结合具体代码的生成过程去理解。我在生成代码那一章也是这样,一个一个例子逐渐展开来分析这一过程的。

回头看你自己学习Lua的这一段历程,哪部分是最耗费精力的?

其实,前面已经提到了,Lua分析代码生成Opcode的过程是最耗费精力的。GC部分也是难度比较大的,但是因为云风写的关于“Lua GC分析”的系列文章,难度会相对减少很多。

平民化的资本,构建出庞大的网络世界
编程跟数学的特点很像,只需要有一台可以编程的电脑就能构建起虚拟的世界。它对场地设备的要求也还算比较平民化,更多的是需要抽象和逻辑思维能力,这对我而言是相对简单的。

听说你并非科班出身,为什么会选择进入编程这一行?

虽然我读的是理科,但是对于需要自己动手做实验的学科,如化学、物理,却并不擅长。像数学这样的只需要纸和笔就能完成的科目,我学得还不错。编程跟数学的特点很像,只需要有一台可以编程的电脑就能构建起虚拟的世界。它对场地设备的要求也还算比较平民化,更多的是需要抽象和逻辑思维能力,这对我而言是相对简单的。

DOOM之父卡马克有一个类似的说法,“在信息时代,进入编程领域的壁垒完全不存在了。即使有也是自我强加的。如果你想着手去开发一些全新的东西,不需要数百万美元的资本。你只需要足够的比萨和健怡可乐存在冰箱里,有一台便宜的PC用于工作,以及让你坚持下来的奉献精神。”

如果不能走得比别人快,那就尽量走得比别人远一点、长一点
实际上,很多开发人员遇到的,比如中年危机,比如面对新知识的焦虑,等等,我也有一样的困惑。目前能想到的不多,只是确定自己是喜欢技术的,愿意一直在技术的道路上走下去的。

你平时很喜欢写作,记录技术学习的点滴。写作是你的技术学习方法吗?

最开始写博客记录技术学习的时候,是想在整理思路的前提下,能够和其他同行分享一些知识。如果能把一个知识点用简洁清晰的语言写出来,让别人看懂,才能说明我的理解很到位。

写技术类文章的时候,我建议首先把原理和问题解释清楚,然后才解释具体的数据结构和伪代码的算法,最后才是具体的代码。我不建议大量地贴代码,因为可能当时你懂了,等过段时间后你就不懂了。决定写Lua源码分析的文章,我也是坚持这个初衷和方式。最开始的时候,我并没有想到能以纸书的形式呈现,回过头来看,以前做过的积累才是最重要的。

技术学习的过程中,最重要的三点是什么?

首先还是得有兴趣吧,没有兴趣的话,事情做起来别扭。其次是善于归纳和总结知识,写博客、技术文章,尝试向别人解释清楚一个知识点,时常整理知识点,跟以前学过的东西串联起来。最后应该就是不断提高自己解决问题的思路、能力等。出现了问题不是大事,问题是出了问题之后自己能否解决、能否从里面学到东西。

你对自己未来的技术之路,是怎么规划的?

这个问题太大了,实在回答不了太多。实际上,很多开发人员遇到的,比如中年危机,比如面对新知识的焦虑,等等,我也有一样的困惑。目前能想到的不多,只是确定自己是喜欢技术的,愿意一直在技术的道路上走下去的。然后找对适合自己的技术方向,走好眼前的路吧。

如果不能走得比别人快,那就尽量走得比别人远一点、长一点吧。当然,做到这些的大前提,还是身心的健康。


更多精彩,加入图灵访谈微信!《Lua设计与实现》的作者codedump:学习也要讲究性价比

相关推荐