Lua
文章平均质量分 77
MaximusZhou
这个作者很懒,什么都没留下…
展开
-
Lua源码剖析(lmathlib.c)
0、该模块是Lua数学库math模块的实现,读该模块源码是为了学习Lua与C的API以及注册方法。1、当在Lua程序中,调用require("math")时,就会调用下面的luaopen_math函数,来注册函数库: static const luaL_Reg mathlib[] = { {"abs", math_abs}, {"acos",原创 2013-06-09 15:19:52 · 2788 阅读 · 0 评论 -
用LuaBridge为Lua绑定C/C++对象
最近为了总结Lua绑定C/C++对象的各种方法、第三方库和原理,学习了LuaBridge库为Lua绑定C/C++对象,下面是学习笔记,实质是对该库的Reference Manual基本上翻译了一遍,学习过程中测试代码,放在我的github上。LuaBridge的主要特点 源码只有头文件,没有.cpp文件,没有MakeFile,使用时只需一个#include即可。 支原创 2014-03-31 20:57:05 · 9790 阅读 · 2 评论 -
深入理解Lua的闭包一:概念、应用和实现原理
本文首先通过的例子讲解了Lua中闭包的概念,然后总结了闭包的应用场合,最后探讨了Lua中闭包的实现原理。闭包的概念在Lua中,闭包(closure)是由一个函数和该函数会访问到的非局部变量(或者是upvalue)组成的,其中非局部变量(non-local variable)是指不是在局部作用范围内定义的一个变量,但同时又不是一个全局变量,主要应用在嵌套函数和匿名函数里,因此若一个闭包没有会原创 2015-03-15 20:25:28 · 33924 阅读 · 6 评论 -
Lua中类的实现
概述 一个类就是像是一个创建对象的模具,对于Lua这种没有类的概念的语言,为了模拟类,方法是为要创建的对象制定一个原型(prototype)。这个原型相当于其他语言中的类。但是原型同时也是一种常规的对象,当其他的对象(看成是原型的实例)遇到一个未知的操作时,就会去原型中查找。因此,在Lua这种没有类的语言中,为了表示一个类,只需创建一个专用作其他对象的原型。类和原型都是一种组织对象间共原创 2015-03-28 20:49:26 · 1906 阅读 · 0 评论 -
Lua中数据类型的源码实现
概述 在Lua中有8种基础类型:nil、boolean、number、string、userdata、function、thread和table。可以使用函数type查看某个变量或值的类型,返回相应的类型名称。像其他动态语言一样,在语言中没有类型定义的语法,每个值都携带了它自身的类型信息。下面将通过Lua 5.2.1的源码来看类型的实现。 源码实现 Lua将值表示原创 2015-03-30 19:36:45 · 3104 阅读 · 0 评论 -
Lua中的模块以及实现方法
从使用的角度来看,一个模块就是一个程序库,可以通过Lua自身提供的require来加载。然后便得到一个全局变量,表示一个table。这个table就是像一个名字空间,其内容就是模块导出的所有东西,例如函数和常量。简单的说,Lua中的模块就是一个table,table中可以包括任何东西。本文首先详细介绍模块相关的require函数,包括该函数的执行流程以及查找模块的路径,然后介绍了实现模块的三种方法原创 2015-03-29 16:12:39 · 5610 阅读 · 0 评论 -
Lua中字符串类型的源码实现
概述 Lua完全采用8位编码,Lua字符串中的字符可以具有任何数值编码,包括数值0。也就是说,可以将任意二进制数据存储到一个字符串中。Lua的字符串是不可变的值(immutable values)。如果修改,实质上是新建一个字符串。根据《Lua中数据类型的源码实现》中知道,在Lua中,字符串是自动内存管理机制所管理的对象,并且由联合体TString来实现存储字符串值的。下面将通过Lu原创 2015-03-31 21:57:47 · 3430 阅读 · 0 评论 -
Lua中table类型的源码实现
1、概述table是lua中唯一的表示数据结构的工具。它可以用于实现数据容器、函数环境(Env)、元表(metatable)、模块(module)和注册表(registery)等其他各种用途。因此了解table的实现是非常有必要的,根据《Lua中数据类型的源码实现》中知道,在Lua中,table是由结构体体Table来实现的。下面将以Lua 5.2.1的源码来看table的实现。2、实现原原创 2015-04-14 20:25:37 · 5966 阅读 · 0 评论 -
Lua中Userdata类型源码实现
1、概述 Lua中userdata分两种,一种是轻量级userdata(light userdata),轻量级userdata是一种表示C指针的值,对Lua虚拟机来说,这种数据类型不需要GC(垃圾回收),其指向的内存由用户分配和释放,其实现就是一个void *p指针;后一种userdata类型完全userdata(full userdata),内存是由Lua虚拟机分配,并有GC机制负责处原创 2015-04-15 19:22:53 · 4588 阅读 · 0 评论 -
Lua中编译执行代码相关的函数以及机制
可以说Lua之所以称为是一种解释型的语言,正是因为有诸如load这样的函数,因为这样的函数使得Lua可以执行动态生成的代码。下面具体来分析这些函数。load函数load函数原型如下:load (chunk [, chunkname [, mode [, env]]]) 该函数加载一个chunk,如果没有错误,则返回一个函数。如果传入chunk的值是一个字符串,则就加载这个字符串;如果传原创 2015-04-09 19:15:40 · 2531 阅读 · 0 评论 -
浅析C++绑定到Lua的方法
虽然将C++对象绑定到Lua已经有tolua++、LuaBridge和luabind等各种库可以直接使用,但弄清楚C++对象绑定到Lua的常见方法,不但有助于更深的了解Lua的机制,还可以方便修改第三方库以满足实际项目需求。本文通过分析第三方库Lunar的实现,来理解C++对象绑定到Lua的通常方法。原创 2014-11-06 19:52:49 · 5411 阅读 · 1 评论 -
深入理解Lua与C数据通信的栈
Lua与C交互的栈是一个重要的概念。文章首先解释了为什么要引入Lua栈,然后对访问栈常用的API进行了总结,并使用这些API的注意事项,最后从Lua源代码来看栈的实现原理。原创 2014-03-16 18:00:03 · 9752 阅读 · 0 评论 -
Lua Faq翻译之为什么lua中没有类似于+=的操作符以及用Lua实现C++中的<<操作符
链接:http://lua-users.org/wiki/LuaFaq和http://lua-users.org/wiki/CustomOperators在实现lua时,目标之一就是简洁。大多数语言包括许多特性,这就意味着他们有许多复杂的特效,比如C++,pythoh,Lisp。很少语言像Forth和lua这样,语法简洁。lua目标是提供那些真正需要的原子特性,但如果需要,你可以利用这翻译 2013-07-21 15:45:45 · 4189 阅读 · 0 评论 -
Lua源码剖析(lstrlib.c)
0、lstrlib.c模块是Lua字符库string的实现,读该模块源码是为了学习Lua与C的API以及注册方法。1、类似于math库,Lua用下面的的代码来注册string模块以及里面的接口:static const luaL_Reg strlib[] = { {"byte", str_byte}, {"char", str_char}, {"dump原创 2013-08-23 15:15:08 · 3107 阅读 · 0 评论 -
Lua基础学习(一)
1、可以将一个table想象成一种动态分配的对象,程序仅仅持有一个对他们的引用(或指针),Lua不会暗中产生table的副本或创建新的table。table永远是匿名的(anonymous),一个持有table的变量与table自身没有固定的关联性。感觉与python完全类似。 Lua中怎么分配一块大的连续的数组,只用语言本身。table.insert不行。 table原创 2013-01-14 21:03:53 · 5277 阅读 · 4 评论 -
Lua学习笔记二之C中调用Lua
虽然之前看过《Lua程序设计》(第二版)这本书,但对C与Lua交互的部分,一直不是很理解。最近想系统学习和深入理解C与Lua的交互(实质是想通过这个,进一步阅读Lua源码,:)),因此又看了一下这本书的第4部分,下面是在学习C中调用Lua的全局变量、table和函数的笔记以及自己的理解,其中学习过程中的写的代码可以从我的github下载。 0、Lua与C有两种交互形式。在第一种原创 2014-02-26 20:33:32 · 2351 阅读 · 0 评论 -
Lua学习笔记三之从Lua中调用C
继续学习Lua与C交互,下面是在学习Lua中调用C定义函数的笔记以及自己的理解,其中学习过程中的写的测试代码可以从我的GitHub下载。 0、对于能被Lua调用的C函数,必须注册这个C函数,以便用某种适当的方式将函数地址告诉Lua。当Lua调用C函数时,使用了与C调用Lua函数时相同的栈。C函数从栈中获取函数参数,并将结果压入栈中。为了在栈中将函数结果与其他值区分,C函数还原创 2014-02-27 19:39:32 · 2517 阅读 · 0 评论 -
Lua学习笔记四之用C为Lua定义类型(UserData)
继续学习Lua与C交互,下面是在用C为Lua定义类型(UserData)的笔记以及自己的理解,其中学习过程中的写的测试代码都可以从我的github下载。 0、Lua中使用userdata类型来表示在C中定义的类型。userdata只是提供了一块原始的内存区域,可以用来存储任何东西,并且,在lua中userdata没有任何预定义的操作。在C中调用函数lua_newuserdata会根据指原创 2014-02-28 19:28:24 · 4995 阅读 · 1 评论 -
用Lua实现插入、删除和查找时间复杂度为O(1)的集合
利用下面代码可以定义一个集合S,对该集合所有的操作,比如插入、删除元素和查找元素都是O(1),代码如下:function newset() local reverse = {} --以数据为key,数据在set中的位置为value local set = {} --一个数组,其中的value就是要管理的数据 return setmetatable(set,{__i原创 2014-03-27 19:34:27 · 4951 阅读 · 0 评论 -
Lua 5.2 手册翻译之元表和元方法(Metatables and Metamethods)
0、手册应该是学习语言的最好的文档,一边看文档,一边想把它记录下来,lua 5.2 英文手册地址:http://www.lua.org/manual/5.2/manual.html在lua中,任何值都可以拥有元表(metatable)。元表本质是就是lua中table,但同时通过元表可以自定义在某些值上的操作。通过设置元表中特定的域(fields)值,可以改变某些值的操作行为。比如,当非数值类翻译 2013-07-20 16:53:44 · 2099 阅读 · 0 评论 -
深入理解Lua的全局变量_G以及源码实现
在Lua脚本层,Lua将所有的全局变量保存在一个常规的table中,这个table被称为全局环境,并且将这个table保存在一个全局变量_G中,文章首先通过一个递归函数,打印出_G中所有的信息,然后说明了怎么使用全局变量_G,最后从源码角度来看_G的实现原创 2014-04-19 13:53:29 · 17501 阅读 · 1 评论 -
Lua中的线程和状态
线程(thread)作为Lua中一种基本的数据类型,它代表独立的执行线程(independent threads of execution),线程类型是实现协程(coroutines)的基础。本文将介绍Lua虚拟中的全局状态和线程的关系,以及从源码角度来看其数据结构。原创 2015-05-30 20:19:10 · 12315 阅读 · 0 评论