概述

首先,lua是一门高效的(efficient)、轻量级(lightweight)的嵌入式脚本语言(embeddable scripting language),这是它的官方网站的标语。

其次,lua也是一门面向原型的编程语言(prototype-based language)。这一点其实很好理解,因为lua有元表(metatable)的概念和用法。

截止到目前(2019.01.28),lua官方推出的最新版本如下:

lua

可以看到到,源码+文档说明的压缩档案才不到300KB,代码总数在2w行上下,在Linux上可以编译成182KB左右的可执行文件,说明lua确实很小巧。

语法特性

这篇文章非常详细地总结了lua语言的优缺点,我这边稍微摘抄几个重点介绍下。

1、lua支持多个函数返回值,代码如下:

return 

2、lua支持列表项的展开与打包(pack与unpack),代码如下:

print 

这在做函数调用和参数传递时,会非常有用。

3、lua的数据类型,有如下几种:

(1)nil 空值

(2)boolean 布尔值,只有 true 和 false

(3)number 数字类型,用c语言的双精度浮点数(double)实现,lua 5.3+版本支持64位长整型。

(4)function 函数类型

(5)table lua表,内部由C语言的无序哈希表和C语言数组实现。

local 

(6)Thread lua协程,目前看来,lua并不支持多线程,只是在协同程序上实现了并发。这里有一篇文章详细地介绍了lua协程的用法和特点。

(7)LIGHTUSERDATA 一个 C 指针,由自己管理,lua不会回收。

(8)USERDATA 一块内存区域,由lua管理,自动回收。

(9)upvalue 非临时变量,一般用于lua的闭包

如何提升lua的开发效率

(一)类似面向对象的设计

lua本身不是面向对象编程语言,所以它没有继承、多态这些复杂的语法特性。但是,作为一个面向原型编程语言,lua提供了元表,在一定程度上,提供了类似面向对象的设计思路。

比如,我们可以设计一个ClassBase.lua,定义一个lua“基类”

ClassBase 

有了基类的方法,现在可以设计一个好友窗口类,它有自己的方法SortFriend,表示对好友进行排序,同时,它需要使用基类的方法,那么FriendWindow.lua代码如下:

FriendWindow 

对于lua表的属性访问,如果该表没有定义__index,则会去该lua表的元表的__index去寻找相应的属性,以此类推。

FriendWindow的元表的__index属性是ClassBase,这样我们可以通过FriendWindow间接使用ClassBase中的属性和方法。

这里很巧妙的,将FriendWindow的元表的__newIndex设置为一个空lua表,就是说,如果要在后续使用FriendWindow的过程中,要想写入一些新的属性和方法,则实际上,是写入到了这个空表中。好处就是,如果想直接清掉这些新属性和新方法的话,可直接修改__newIndex即可。这样的设计,可以极大程度地保留FriendWindow的固有结构,便于清空临时数据,这在游戏逻辑的数据管理中,非常重要。

同时,在FriendWindow的元表中,定义了__call,好处就是:

FriendWindow.key1 

(二)数据保护

有时,为了防止其他程序员擅自修改某些lua表中记录的数据,可以将这些数据做“只读化处理”,通过元表可以轻松实现这些特性。

local 

定义一个局部函数变量,lua内部会在内存中存储该函数的函数体,同时生成一个局部函数指针,指向函数体。 如果多次定义相同的函数,通过lua调试器可以发现,函数变量的指针地址,每一次都是不相同的。所以这里索性在代码初始的地方,就定义func_readonly这个函数,可以节约函数指针所消耗的内存空间。

通过调用GetReadOnlyValue()方法,获得某一个lua表的只读副本,从而保护lua表中的数据。这在使用配置表数据等应用场景中,非常好用。

lua虚拟机

诸如JVM、Python解释器,这类虚拟机是基于堆栈的虚拟机(stack based vm)。

关于lua虚拟机以及指令相关的内容,这篇文章讲得比较好,我这里做了简单的摘抄。

例如实现两个变量相加 (a = b + c),这类虚拟机通常会将代码编译成如下的指令:

PUSH 

而lua虚拟机,是基于寄存器的虚拟机(register based vm)。同样实现两个临时变量相加,虚拟机编译的代码会简单得多:

ADD  a  b  c   ; // a = b + c

其中,b、c是被加数和加数(均为操作数),结果存放于a。

Register based vm(基于寄存器的架构) 的指令可以直接对应标准的3地址指令,用一条指令完成了上面多条指令的计算工作,并且有效地减少了内存复制操作。

这样的指令系统对于效率有很大的帮助。

不过,在编译器设计上,就要在代码生成阶段对寄存器进行分配,增加了实现的复杂度。并且每条指令所占用的存储空间也相应的增加了。

对于lua来说,使用局部变量,和全局变量,lua代码编译后的字节码,是完全不一样的。

例如如下的代码,定义了两个临时变量a、b并进行求和操作:

local   

经过编译后的字节码如下:

ADD  0   0   1

未完待续。。。。。。

lua 给userdata设置元表_提高Lua语言开发效率的简单方法相关推荐

  1. lua 给userdata设置元表_lua学习之复习汇总篇

    第六日笔记 1. 基础概念 程序块 定义 在 lua 中任何一个源代码文件或在交互模式中输入的一行代码 程序块可以是任意大小的 程序块可以是一连串语句或一条命令 也可由函数定义构成,一般将函数定义写在 ...

  2. lua 给userdata设置元表_UE4热更新:基于UnLua的Lua编程指南

    本片文章搬运自我自己的博客:原文链接: UE4热更新:基于UnLua的Lua编程指南 作者: ZhaLiPeng UE使用的是C++这种编译型语言,在编译之后就成了二进制,只有通过玩家重新安装才能打到 ...

  3. linux 易语言窗口程序_用易语言开发Linux程序的方法

    漫溃廉江欧洲恺撒哈博浑饨?农区南雄青枫沙袋风行画行全盘.赁租落子淋雨长笑林登联氨.欠身双黄妹妹稠密平摊麻乱封杀,蹦极四友萌芽布鞋魔符采制.馆子恭喜乐天内绘磨勘泪液旁出并且! 全盟女神功曹使劲信徒,用易 ...

  4. css显示内容越来越模糊_55 个提高你 CSS 开发效率的必备片段

    这篇文章会记录我们平时常用到的 CSS 片段,使用这些 CSS 可以帮助我们解决许多实际项目问题中遇到的,墙裂建议点赞收藏再看,方便日后查找 附笔记链接,阅读往期更多优质文章可移步查看:前端笔记本 清 ...

  5. [55 个提高你 CSS 开发效率的必备片段]

    [55 个提高你 CSS 开发效率的必备片段] 清除浮动 浮动给我们的代码带来的麻烦,想必不需要多说,我们会用很多方式来避免这种麻烦,其中我觉得最方便也是兼容性最好的一种是,在同级目录下再创建一个&l ...

  6. 55个提高你CSS开发效率的必备片段

    55个提高你CSS开发效率的必备片段 来自:Join GitHub today 链接:https://github.com/Wscats/CV/issues/29 这篇文章会记录我们平时常用到的 CS ...

  7. 一些提高Android开发效率的工具方法

    一些提高开发效率的工具&方法 1. 使用快捷键提高操作效率 下面的有些快捷键是经过我修改的,如果你不知道AS原生的快捷键是什么或者忘记了快捷键可以到Settings->Keymap下面搜 ...

  8. C#(Net)软件开发常用工具汇总,提高你的开发效率

    C#(Net)软件开发常用工具汇总,提高你的开发效率 写代码也要读书,爱全栈,更爱生活.每日更新原创IT编程技术及日常实用技术文章. 我们的目标是:玩得转服务器Web开发,搞得懂移动端,电脑客户端更是 ...

  9. 有关提高visual studio开发效率的方法

    有关提高 visual studio 开发效率的方法见下面的参考文章: http://www.iplaysoft.com/vs2010-features.html  http://www.cnblog ...

最新文章

  1. keystone java,搭建KeystoneJS
  2. 协议 类似_IPv6基础及地址分类,地址发现协议,一分钟了解下
  3. Json模块dumps、loads、dump、load函数介绍
  4. 【数据平台】Pytorch库初识
  5. CVPR2019| 最新CVPR2019论文:含目标检测、分割、深度学习、GAN等领域
  6. 消息中间件常见问题汇总
  7. centos安装python3.7和yum报错解决方法
  8. Android 控件 -------- AutoCompleteTextView 动态匹配内容,例如 百度搜索提示下拉列表功能...
  9. html中img显示旋转,css如何实现图片的旋转展示效果(代码示例)
  10. [System Design] 系统设计 (2) -- 数据库设计
  11. cygwin安装配置apt-cyg工具
  12. pmp项目管理的优先级解决方法
  13. 【工具篇】EasyExcel的应用
  14. HKC神盾显示器MG27Q - Nano IPS显示器的好选择
  15. 计算机标准差的按键是什么,在计算器上用标准差键直接求离均差平方和的方法...
  16. W3C发布HTML5正式推荐标准 开放Web平台迎来新的里程碑
  17. 用c语言求出1加到100的和
  18. 两个字与三个字对齐html,css三个字如何和两个字对齐?
  19. 真正的宇宙中心?未来科技城、云城或将彻底爆发。逃离深圳,拥抱杭州的启示
  20. 大数据hadoop和spark怎么选择?

热门文章

  1. Java CompletableFuture
  2. 物联网技术或颠覆传统高等教育
  3. Nginx根据User-Agent适配PC和手机
  4. 前端 CSS的选择器 伪类选择器
  5. 代码审计中的SQL注入
  6. MYSQL数据库常用语句
  7. 【HDU2825】Wireless Password【AC自动机,状态压缩DP】
  8. JavaScript 中的相等检测
  9. 不用也要知道的几种算法(PHP版本)
  10. GCD 和 NSOperationQueue 的差别