当前位置:首页 » 操作系统 » 云风lua源码欣赏

云风lua源码欣赏

发布时间: 2022-05-03 11:42:17

㈠ lua源码分析4(lua是怎么执行的)收藏

当分析到这里,对于lua生成中间码的过程就比较熟悉了。关键是生成的中间码必须要和lua虚拟机的执行联系在一起。所以,对于这里分析的函数调用,要结合lua虚拟机的执行一起来分析。

上篇文章对生成局部函数中间码做了简单的介绍。这里知道,当lua发现一个新定义的函数的时候,会生成OP_CLOSURE指令。那么,lua虚拟机执行到OP_CLOSURE后怎么执行呢?
在此之前,先说在lua解析代码完了以后,会做那些善后之事呢?
前面说过,lua会把一个代码文件当作是一个函数解析执行。在解析期间,它会率先生成一个FuncState的结构,作为最外面的函数。但这是解析时做的事情,运行期间,是不会有FuncState这个东西出现的。在运行期间,是由一个个叫CallInfo的数据结果的,它指的是当前运行的函数。
那么,在解析代码以后,是怎么转入运行的呢?

㈡ Lua为什么在游戏编程领域被广泛运用

用过Lua的都知道,Lua无论在与C/C++数据传递,还是在封装都很方便,API非常简单。同时Lua的许可证和紧凑性(把lib编译进程序即可),都十分利于集成。这些都是python和V8不能比的。同时,Lua编程学习难度极低。Python虽然容易学,但不简单;JavaScript学习难度不够低。实际上,Lua进入游戏业非常早,早在1998年卢卡斯的《异域狂想曲》(Grim Fandango)中,就首次在游戏领域用到了Lua。十年之前着名的游戏博德之门、猴岛4都用了Lua。至少从开源代码来看,云风对Lua的使用是十分重度的,比如skynet的入口是在Lua上。国内很多游戏对Lua的使用很浅,多是把一些需要经常改的运算放出来给Lua做。

㈢ 如何阅读luajit的代码

为什么要看luajit的源码
作为目前最快的脚本语言之一,luajit确实是一个杰作,但相比原生lua仅仅几万行的代码而言,luajit却可以说是巨无霸。更要命的是,luajit之所以快,是因为大量使用了机器码相关的技术,无论是它的机器码编译部分,还是字节码执行部分,读起来都非常麻烦。
网上这方面的资料非常少,即使是lua社区的云风大大也主要以分析原生lua为主,跟luajit有很多不同。万一遇到了性能坑,或者其他难以解决的问题,需要找到原因,又不能阅读源码的话,就只能依赖网上其他人的结论,否则完全无从下手。
调试luajit
万事的开头,从能够自己调试代码开始
一个能调试的代码,阅读起来会远远比眼看要清晰得多。
而如果能利用visual studio进行调试,那么对读luajit而言还是非常有帮助的,毕竟借助visual assist的代码查找,能够非常快的帮你找到你想了解的东西
luajit下面提供了一个msvcbuild.bat用于编译luajit,但如果你需要调试的话,可以进行以下几个步骤:
1.将luajit解压,比如解压到LuaJIT-2.1.0-beta2_msvc目录
2.如果要得到精确的栈,修改LuaJIT-2.1.0-beta2_msvc\src\msvcbuild.bat,搜索/O2,将/O2改为/Od
3.在win64版本的visual studio命令行,执行一次msvcbuild.bat debug,这时会生成luajit.exe,测试一下exe是否正常。
4.用visual studio建立一个命令行工程,例如工程保存在LuaJIT-2.1.0-beta2_msvc\luajitcmd
5.把LuaJIT-2.1.0-beta2_msvc\src下所有.h和.c代码加入工程
6.把工程的调试路径设置为
命令:$(ProjectDir)..\..\src\luajit.exe
工作目录:$(ProjectDir)..\..\src\
7.此时你可以正常按f5下断点调试了
至于可以调试什么呢?
最简单就是写一个lua文件,require之,执行里面的代码,下断点观察luajit的行为。
这里必须说明,luajit的执行过程中有两大部分是没有.c对应的:
1.有一部分代码是通过dasm工具生成的,这部分直接通过汇编生成,没有.c,所以没有办法在visual studio调试(其实也可以,但是只能汇编调试)。这些主要是lua虚拟机的代码(是的,为了快,作者hand tune汇编的方式来写lua虚拟机)
2.luajit会通过jit模块编译一部分代码变为高度优化的机器码,这些也是临时生成的可执行机器码,你只能在.c看到他们是如何生成的,但执行阶段当然是没有.c对应的。
除此以外,几乎所有东西都可以直接vs调试:所有的编译过程、所有的lua标准库和api、luatable等常规数据结构、profiler,等等
下一步我们会简单说一下代码结构,以及结果luajit一些基本原理来说说怎么阅读
尤其是luajit的原理,如果对此毫无了解的情况下,阅读其源码是十分困难的,因为luajit从编译到执行的过程,走了很多步,跨越了多个模块,涉及了三种不同形式的编码(bytecode, SSA IR, 机器码),可见其复杂程度。

㈣ 如何学习 Lua VM 的源码

2011年底开始阅读Lua代码,选择的版本是5.1.4,在那个时候是最新的版本了,不过2012年不仅有更新的5.1版本出来,还有最新的5.2.暂时管不了这么多,继续看这个版本先了。 历经近一年,中间酸甜苦辣只有自己知道,你问有什么方法,我的回答只有坚持。一边看代码,一看补一些基础(比如看龙书),到最后觉得差不多了就自己抄Lua虚拟机代码来跟踪它的实现。 我的博客上:http://www.codemp.info/?tag=lua,有我写的Lua分析文章,还没有完全写完。当然我现在也不认为我完全理解的通通透透了。 我最后希望能做到的是:把Lua某个版本的代码通透看完,在github上写一个开源的分析Lua源码的文档,最后能正确写一份英文的得到Lua社区的认可。 之 所以花这么大功夫去啃Lua代码,是因为我觉得Lua是门很好的语言,参见知乎我在其他帖子中对Lua的评价。另一方面是Lua的代码数量足够 小,5.1.4仅仅1.5W行,去掉空白行和注释估计能到1W行。Lua是世界最流行的脚本语言之一,前几年还进过top20的流行语言,另外又是 C\C++的完美伴侣。另外,我自己对如何实现一门语言也充满了好奇,Lua虽小五脏俱全而且还是正经实用的项目。就这些理由一直在支撑着我看下去。当然 现在最难的时候已经过去了。 其他人的文章,国内云风写的是最多的。不过我认为云风的文章key太高,很难follow,你如果对云风写的文章涉及的技术点没有什么涉猎就直接去看,可能很难看懂。 另外国外人写过的,最推荐的有: 《》 《The implementation of Lua 5.0》

㈤ 如何学习 Lua VM 的源码

啊哈,我觉得由我来回答这个问题再合适不过了。

2011年底开始阅读Lua代码,选择的版本是5.1.4,在那个时候是最新的版本了,不过2012年不仅有更新的5.1版本出来,还有最新的5.2.暂时管不了这么多,继续看这个版本先了。

历经近一年,中间酸甜苦辣只有自己知道,你问有什么方法,我的回答只有坚持。一边看代码,一看补一些基础(比如看龙书),到最后觉得差不多了就自己抄Lua虚拟机代码来跟踪它的实现。

我的博客上:codemp,有我写的Lua分析文章,还没有完全写完。当然我现在也不认为我完全理解的通通透透了。

我最后希望能做到的是:把Lua某个版本的代码通透看完,在github上写一个开源的分析Lua源码的文档,最后能正确写一份英文的得到Lua社区的认可。

之所以花这么大功夫去啃Lua代码,是因为我觉得Lua是门很好的语言,参见知乎我在其他帖子中对Lua的评价。另一方面是Lua的代码数量足够小,5.1.4仅仅1.5W行,去掉空白行和注释估计能到1W行。Lua是世界最流行的脚本语言之一,前几年还进过top20的流行语言,另外又是C\C++的完美伴侣。另外,我自己对如何实现一门语言也充满了好奇,Lua虽小五脏俱全而且还是正经实用的项目。就这些理由一直在支撑着我看下去。当然现在最难的时候已经过去了。

其他人的文章,国内云风写的是最多的。不过我认为云风的文章key太高,很难follow,你如果对云风写的文章涉及的技术点没有什么涉猎就直接去看,可能很难看懂。

㈥ 云风的网易云风

“大话”云风
2001年4月初的一天,云风又从床边厚厚的一摞历史和哲学书中选了一本,津津有味的看了起来。这样的日子已经有一段时间了,大学毕业后尽管曾经到北京闯荡过,不过更喜欢休闲生活的他还是感觉在武汉老家更为惬意。
电话铃响了,竟然是丁磊从广州打来的。原来云风早在大学期间曾写过2D的图形引擎风魂,这套引擎被很多公司所使用,而天夏就是其中之一。这家很早就开始进入网络游戏开发领域的公司不久前被网易所收购,正在开发一款网络游戏“大话西游”。在开发过程中,感觉风魂有一些模块需要做一些扩展,于是找到了云风。开始的时候是云风在家里做一些兼职,不过后来对方认为这样异地合作有些麻烦,于是希望云风能够到广州,云风没有答应,现在网易的“老大”亲自出动了。
长谈半个小时后,云风有些动摇。更令云风没有想到的是,第二天,丁磊就派人把去往广州的机票送到了家里。抱着看看也无妨的想法,云风到了广州。
刚去的时候,云风主要工作还是维护原来的引擎。然而,当时大话西游Ⅰ的开发已经到了后期。由于很多人都是第 一次做游戏,项目混乱。最后连着几天加班,连续工作六七十个小时,云风也不能幸免,到处充当救火队员。
大话西游Ⅰ并不成功,再加上网易当时低迷的股价,很多员工选择了离开。游戏的系统构架也有很多问题,连主程序员都觉得维护起来很麻烦。云风建议不如重做,但多数人认为工作量太大,太浪费。
大话西游Ⅰ收费后,云风也没有多少具体工作,于是跑到家里,按照自己想法重新写客户端的核心架构。新系统将对象层进行了清晰的划分,强化了对于对象的管理,包括内部消息的传递,整个系统架构更清晰,模块之间的耦合度也小一些,整个系统没有用任何的类库,数据结构也是云风自己实现的。
一个月左右,原型出来了。看到云风的原型,丁磊下决心重做大话西游,并把原来技术部的优秀程序员调了进来。后来他们还使用了第三方的LUA脚本,使网络层和界面层的处理分开,更容易扩展,这样程序员就不需要做很多细节性的工作。
新版本做完之后,云风也很疲惫,于是请了两个月的假去旅游。就在那段时间,新的大话西游II推出,火爆的出乎所有人的预料。
云风的职责主要是做 R&D,向其他程序员提实现方案,以及提供代码的框架和底层。他喜欢尝试新技术,写升级程序的时候他也从来不拷贝原来的任何代码。2002年学术界流行泛型的思想和模板,云风也做了很多研究,通读了STL的源码,给他留下了深刻的印象。按照这种思想,云风又重写了图形引擎,裁掉了很多认为不必要的内容,使之精简到刚好够用。云风说:“我现在并不主张代码复用,因为游戏不是一个特别大的工程,只要有非常基础的代码就够了。我以前曾经做过一整套的UI系统,底层代码就写了一两万行。但有位朋友对我讲,日本做游戏开发有一套UI代码用了10年都没有换,而且只用了一千行代码就实现了,其中只有最简单的对话框和按钮。我比较认同这点,我认为网络游戏最重要是稳定,保证稳定的一个方案就是简洁,其次是一定的扩展性。” 在这种的思想指导下,云风又重新开发了一个引擎。
新引擎除了精简了图形方面的东西,还增加了很多功能来方便二次开发。比如用汇编写的完全不依赖 OS 的协作式多线程模块,可以由开发人员自己指定每个线程的工作,而且每个线程的开销很小。每个活动的对象都由自己的线程来控制逻辑,方便了开发人员去思考问题,真正把每个对象的逻辑分开了。而且还附带了其他的好处,这就是当在汇编一级看程序的运行时,指令的运行次序会变的相对混乱,会使制作外挂的人非常头痛。
大话西游Ⅱ成功后,丁磊准备做一个漫画版的大话西游,招聘的几位同事看到了云风的新技术后,提出不如用这套新引擎重新做一套游戏,于是梦幻西游诞生了。现在正在推广,反响也非常不错。
云风以前喜欢玩PC游戏,不过现在经济宽裕了,他更喜欢玩Xbox、PS2、GBA这样的游戏机,觉得游戏机上的游戏更好玩。看来,云风未来还有很大的空间可以去创造新的梦想。

㈦ 如何学习 Lua VM 的源码

2011年底开始阅读Lua代码,选择的版本是5.1.4,在那个时候是最新的版本了,不过2012年不仅有更新的5.1版本出来,还有最新的5.2.暂时管不了这么多,继续看这个版本先了。

历经近一年,中间酸甜苦辣只有自己知道,你问有什么方法,我的回答只有坚持。一边看代码,一看补一些基础(比如看龙书),到最后觉得差不多了就自己抄Lua虚拟机代码来跟踪它的实现。

我的博客上:codemp,有我写的Lua分析文章,还没有完全写完。当然我现在也不认为我完全理解的通通透透了。

我最后希望能做到的是:把Lua某个版本的代码通透看完,在github上写一个开源的分析Lua源码的文档,最后能正确写一份英文的得到Lua社区的认可。

之所以花这么大功夫去啃Lua代码,是因为我觉得Lua是门很好的语言,参见知乎我在其他帖子中对Lua的评价。另一方面是Lua的代码数量足够小,5.1.4仅仅1.5W行,去掉空白行和注释估计能到1W行。Lua是世界最流行的脚本语言之一,前几年还进过top20的流行语言,另外又是C\C++的完美伴侣。另外,我自己对如何实现一门语言也充满了好奇,Lua虽小五脏俱全而且还是正经实用的项目。就这些理由一直在支撑着我看下去。当然现在最难的时候已经过去了。

其他人的文章,国内云风写的是最多的。不过我认为云风的文章key太高,很难follow,你如果对云风写的文章涉及的技术点没有什么涉猎就直接去看,可能很难看懂。
另外国外人写过的,最推荐的有:
《》
《The implementation of Lua 5.0》

还有一个:
详解关于Lua源码分析学习教程
你可以找找。转载仅供参考,版权属于原作者

㈧ 如何评价腾讯在Unity下的xLua热更方案

我认为xlua的概念很好,很多人用lua就是为了热更新,如果没有热更新的需求,大多数人是不喜欢lua,或者所谓的脚本开发的,xlua很好的解决了这部分人得需求。

但我有一点其他看法,我04年毕业在网易工作的时候,网易的游戏都是基于脚本的,不管是客户端,还是服务器端,那个时候不是lua,就是python,还有一种是类似c语法的脚本(我忘记名字了),这个是云风主导的,当时选择脚本作为逻辑开发语言的核心想法**不是为了热更新**,而是解决

1)划分引擎层和业务层,svn管理好权限,让新来的同学,接触不到核心引擎的代码权限,他们只能在脚本层做业务,等你对业务足够熟悉,对引擎足够了解,对公司足够忠诚后,才开放引擎层代码,这么做早年是为了解决私服问题,很多同学拿着全部源代码去架设私服,这多可怕,所以做业务的程序员只能拿到一个编译后的app和一份脚本接口文档,而编译出来的app会检查线上ip,报告非法服务器地址等,协助打击私服。

2)避免书写不好的c、cpp代码崩溃整个进程,脚本代码出错了,最多影响局部逻辑,还可以上报脚本错误,方便后续解决问题,现在unity里也一样,如果c#代码书写不好,就直接闪退了,不如用lua做一个安全的调用层。

3)快速修改代码,快速跑起来,早年cpp代码编译速度比较慢,修改一行代码调试运行等半天,脚本代码方便修改,方便跑起来,不用等,放到今天也一样,同时iOS还有text size大小的限制,太多的stub function会撑大text size,而lua脚本再多的代码也不会有这个问题,不用再为了text size取舍代码怎么写,功能去留的问题。

4)反外挂,对,你没看错,反外挂,早年PE各种脱壳、反编译工具,使得一个exe几乎没有秘密,外挂作者很容易做外挂,而用脚本后,几乎所有逻辑都是中间代码,这部分中间代码可以通过修改opcode,加密,一边run,一边解密等技术,保证在进程空间内基本没有完成代码存在,对外挂作者是个很大挑战,所以网易的游戏反外挂历来做的都是最好的;

5)最后才是所谓的“热更新”, 当年也不是现在这种热更新,就是每次客户端启动的时候,有一个launcher去服务器下载一个update,然后应用这个update而已。

热点内容
fpga编程语言 发布:2024-10-06 10:29:24 浏览:341
python按时间排序 发布:2024-10-06 10:02:50 浏览:214
安卓收款机下载什么应用能收款 发布:2024-10-06 09:38:29 浏览:1000
java初级工程师面试题 发布:2024-10-06 09:37:49 浏览:217
知鸟在哪里修改密码 发布:2024-10-06 09:37:10 浏览:303
怎么更改微信钱包密码 发布:2024-10-06 09:28:08 浏览:549
控制中心不支持配置怎么办 发布:2024-10-06 09:16:39 浏览:811
地暖存储罐 发布:2024-10-06 09:10:19 浏览:580
搭建模型服务器 发布:2024-10-06 09:05:23 浏览:845
java使用类 发布:2024-10-06 09:05:22 浏览:931