热门标签 | 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源码分析的文章,我也是坚持这个初衷和方式。最开始的时候,我并没有想到能以纸书的形式呈现,回过头来看,以前做过的积累才是最重要的。

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

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

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

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

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


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




推荐阅读
  • FastDFS Nginx 扩展模块的源代码解析与技术剖析
    FastDFS Nginx 扩展模块的源代码解析与技术剖析 ... [详细]
  • 在Java分层设计模式中,典型的三层架构(3-tier application)将业务应用细分为表现层(UI)、业务逻辑层(BLL)和数据访问层(DAL)。这种分层结构不仅有助于提高代码的可维护性和可扩展性,还能有效分离关注点,使各层职责更加明确。通过合理的设计和实现,三层架构能够显著提升系统的整体性能和稳定性。 ... [详细]
  • 提升 Kubernetes 集群管理效率的七大专业工具
    Kubernetes 在云原生环境中的应用日益广泛,然而集群管理的复杂性也随之增加。为了提高管理效率,本文推荐了七款专业工具,这些工具不仅能够简化日常操作,还能提升系统的稳定性和安全性。从自动化部署到监控和故障排查,这些工具覆盖了集群管理的各个方面,帮助管理员更好地应对挑战。 ... [详细]
  • 小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限
    小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限 ... [详细]
  • REST与RPC:选择哪种API架构风格?
    在探讨REST与RPC这两种API架构风格的选择时,本文首先介绍了RPC(远程过程调用)的概念。RPC允许客户端通过网络调用远程服务器上的函数或方法,从而实现分布式系统的功能调用。相比之下,REST(Representational State Transfer)则基于资源的交互模型,通过HTTP协议进行数据传输和操作。本文将详细分析两种架构风格的特点、适用场景及其优缺点,帮助开发者根据具体需求做出合适的选择。 ... [详细]
  • SSAS入门指南:基础知识与核心概念解析
    ### SSAS入门指南:基础知识与核心概念解析Analysis Services 是一种专为决策支持和商业智能(BI)解决方案设计的数据引擎。该引擎能够为报告和客户端应用提供高效的分析数据,并支持在多维数据模型中构建高性能的分析应用。通过其强大的数据处理能力和灵活的数据建模功能,Analysis Services 成为了现代 BI 系统的重要组成部分。 ... [详细]
  • 2012年9月12日优酷土豆校园招聘笔试题目解析与备考指南
    2012年9月12日,优酷土豆校园招聘笔试题目解析与备考指南。在选择题部分,有一道题目涉及中国人的血型分布情况,具体为A型30%、B型20%、O型40%、AB型10%。若需确保在随机选取的样本中,至少有一人为B型血的概率不低于90%,则需要选取的最少人数是多少?该问题不仅考察了概率统计的基本知识,还要求考生具备一定的逻辑推理能力。 ... [详细]
  • Spring框架的核心组件与架构解析 ... [详细]
  • 在拉斯维加斯举行的Interop 2011大会上,Bitcurrent的Alistair Croll发表了一场主题为“如何以云计算的视角进行思考”的演讲。该演讲深入探讨了传统IT思维与云计算思维之间的差异,并提出了在云计算环境下应具备的新思维方式。Croll强调了灵活性、可扩展性和成本效益等关键要素,以及如何通过这些要素来优化企业IT架构和运营。 ... [详细]
  • (1)前期知识:1. 单机架构:单一服务器计算机——其处理能力和存储容量有限。2. 集群架构(负载均衡器与多节点服务器)——通过增加节点数量来提升系统性能和可靠性,实现高效的任务分配和资源利用。 ... [详细]
  • 第二章:Kafka基础入门与核心概念解析
    本章节主要介绍了Kafka的基本概念及其核心特性。Kafka是一种分布式消息发布和订阅系统,以其卓越的性能和高吞吐量而著称。最初,Kafka被设计用于LinkedIn的活动流和运营数据处理,旨在高效地管理和传输大规模的数据流。这些数据主要包括用户活动记录、系统日志和其他实时信息。通过深入解析Kafka的设计原理和应用场景,读者将能够更好地理解其在现代大数据架构中的重要地位。 ... [详细]
  • 深入解析GBASE系列中的列存储分析型数据库GBase 8a
    市场定位方面,GBase 8a 是 GBASE 系列中的一款高性能列存储分析型数据库,专为大规模数据仓库和实时分析场景设计。该数据库采用先进的列式存储技术,能够显著提升查询性能和数据压缩效率,适用于金融、电信、互联网等行业的大数据分析需求。此外,GBase 8a 还支持分布式部署,具备高可用性和可扩展性,能够满足企业级应用的严苛要求。 ... [详细]
  • 在腾讯云服务器上部署Nginx的详细指南中,首先需要确保安装必要的依赖包。如果这些依赖包已安装,可直接跳过此步骤。具体命令包括 `yum -y install gcc gcc-c++ wget net-tools pcre-devel zlib-devel`。接下来,本文将详细介绍如何下载、编译和配置Nginx,以确保其在腾讯云服务器上顺利运行。此外,还将提供一些优化建议,帮助用户提升Nginx的性能和安全性。 ... [详细]
  • 当前物联网领域十大核心技术解析:涵盖哪些关键技术?
    经过近十年的技术革新,物联网已悄然渗透到日常生活中,对社会产生了深远影响。本文将详细解析当前物联网领域的十大核心关键技术,包括但不限于:1. 军事物联网技术,该技术通过先进的感知设备实现战场环境的实时监测与数据传输,提升作战效能和决策效率。其他关键技术还包括传感器网络、边缘计算、大数据分析等,这些技术共同推动了物联网的快速发展和广泛应用。 ... [详细]
  • 本文源自极分享,详细内容请参阅原文。技术债务如同信用卡负债,随着时间推移,修复成本会越来越高,因此程序员必须对此有深刻认识。此外,团队应致力于培养一种持续维护和优化代码的文化,以减少技术债务的累积。 ... [详细]
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社区 版权所有