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

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

导读:

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

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

不过,我仍是知道了codedump笔名掩盖下的真身,他被Lua吸引的缘由,研究Lua的方法,Lua的优点以及Lua的编译原理,等等。数据库

好了,仍是大家本身开阅吧~编程

访谈嘉宾:

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

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

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

图片描述

访谈话题:

越想作好一件事,心理负担就越大
接下这件事以后,个人心理负担变得很大。若是成为正式的出版物,读者是要真金白银地花钱来买的,我但愿尽可能作好,不辜负别人的指望。网络

为何使用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源码分析的文章,我也是坚持这个初衷和方式。最开始的时候,我并无想到能以纸书的形式呈现,回过头来看,之前作过的积累才是最重要的。

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

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

你对本身将来的技术之路,是怎么规划的?

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

若是不能走得比别人快,那就尽可能走得比别人远一点、长一点吧。固然,作到这些的大前提,仍是身心的健康。


更多精彩,加入图灵访谈微信!

相关文章
相关标签/搜索