热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

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

本文仅用于学习和交流目的,不得用于商业目的。非商业转载请注明作译者、出处,并保留本文的原始链接: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源码分析的文章,我也是坚持这个初衷和方式。最开始的时候,我并没有想到能以纸书的形式呈现,回过头来看,以前做过的积累才是最重要的。

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

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

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

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

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


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




推荐阅读
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了包的基础知识,包是一种模块,本质上是一个文件夹,与普通文件夹的区别在于包含一个init文件。包的作用是从文件夹级别组织代码,提高代码的维护性。当代码抽取到模块中后,如果模块较多,结构仍然混乱,可以使用包来组织代码。创建包的方法是右键新建Python包,使用方式与模块一样,使用import来导入包。init文件的使用是将文件夹变成一个模块的方法,通过执行init文件来导入包。一个包中通常包含多个模块。 ... [详细]
author-avatar
陈苏女士
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有