lua
文章平均质量分 58
语言观止
不求技惊四座,但求一技之长。
展开
-
在lua中调用DLL
整整的花了一个下午的时候,才在lua中调用了动态链接库。比起其他脚本语言,lua的调用方式算是比较繁琐的,但是lua的编程思想非常的统一,即lua和C之间的传值都是通过栈进行的,目前为止我还没有深入的去了解这个“栈”,但是这并不妨碍去使用”栈“。当我们在一个空的工程中写下几个C/C++的函数,然后把属性类型设置为“动态链接库”以后,编译虽然成功了,DLL也产生了,但是我们得到的DLL是一个没有原创 2013-11-15 15:45:08 · 11260 阅读 · 4 评论 -
《Lua 5.0的实现》第二章 - Lua的设计和实现概述
《Lua 5.0的实现》第二章翻译,翻译方知写作难。翻译 2013-11-22 22:27:15 · 2484 阅读 · 0 评论 -
《Lua 5.0的实现》第一章 - 介绍
implementation of Lua 5.0 翻译翻译 2013-11-22 00:12:04 · 2778 阅读 · 0 评论 -
在VS2012中编译lua源码
在编译之前我们必须拥有lua源码,lua的源码可以通过lua的官网获得。lua在windows上的编译方式有两种。第一种是通过source code中自带的makefile文件来编译。makefile文件是基于linux写的,所有我们先要下载一个软件mingw,通过mingw可以在windows上模拟出linux的环境。解压文件包以后,双击open_distro_window.bat打开一个c原创 2013-11-12 20:11:22 · 4529 阅读 · 0 评论 -
在VS2012中用动态链接库生成lua.exe
上一篇说了如何生成动态库lua.dll,但是并没有产生.lib引导库,原因是工程中缺少.def文件。得到则个lua.def文件的方式有很多种,我就介绍我实现的那一种方式吧。我们已知通过mingw可以得到lua.dll,借助于这个dll,我们可以很容易就得到lua.def。1)打开VS2010的命令提示(VS自带的cmd命令框),cd到lua.dll的目录下面,输入dumpbin /expo原创 2013-11-12 23:18:38 · 1789 阅读 · 0 评论 -
lua学习之——有道词典“划词”的秘密
本文的目的是学习总结lua调用C函数的过程。文章的标题看上去挺标新立异的,其实主要的目的是为了在Lua中获取和修改Windows的剪贴板,因为有道词典“划词”的秘密就是通过剪贴板进行字母的传递。先给出本文的结果:当有道词典进行“划词”(不是取词哦,取词是通过hook进行的)操作的时候,lua就会print出那个被划的字母了。setClipBoard("");while true do原创 2013-11-13 21:14:33 · 1581 阅读 · 0 评论 -
语法语义、形参实参,懂彻底!
你知道parameter和argument的不同吗,你知道syntax和semantic的区别吗?这两对词汇经常在英文技术文档中出现,以前我不知道它们的确切含义,只知道前者说的是参数,后者说的和语法相关,这样都能蒙混过关。直到有一天它们很频繁的一起露面,我才不得已去把它们知彻底。中文解释: parameter:形式参数(形参) argument:实际参数(实参)原创 2013-11-27 22:42:48 · 2259 阅读 · 0 评论 -
Lua解析器Read脚本内容
你知道C语言是怎么Read一整个文件吗?如果你知道了,那么请忽略本文,如果你不知道,你可以花五分钟来阅读本文。在我开始阅读Lua代码之前,我好像没有用C语言写过一次性Read整个文件的字符的代码,以往都是一句句的读取。以至于我对这样的代码失去了敏感性。在开始阅读Lua代码的时候花了两个小时来寻找Lua解析器如何读取脚本的内容,一直当我看到getc的时候才豁然开朗,以前几乎没有用过getc,开篇就定原创 2013-11-14 18:54:27 · 2072 阅读 · 0 评论 -
C语言printf IEEE (数字在计算机中的表示)
在计算机中整数和字符串都用十六进制数表示,如 int a = 2,计算机中就存储着2,表示它的值。又如,char c = '2',则用0x32表示,计算机里存储着32。唯有浮点数的表示方法不同,它们采用IEEE格式存储。问题来了,如何在C语言中查看IEEE格式呢?在C语言中数据本身是没有意义的,只有我们告诉计算机这段数据的含义时,计算机才能正确的理解。所以当我们要查看一个float的IEEE时原创 2013-11-30 12:08:24 · 3986 阅读 · 0 评论 -
虚拟机漫谈(Lua、Java、C#)
最近,花了四天的时间去看和虚拟机相关的资料,终于换来了一知半解。其实在N年前,我就碰到过虚拟机。那时候用的java、C#、vmware都和虚拟机有千丝万缕的关系。甚至,windows的保护模式也是虚拟机的一种。但是很多时候我不求甚解,对虚拟机的认识只停留在名词解析上面。也怪那时候的老师们从来不点破这层窗户纸,把Java教的和C一样,让我误以为Java就是C的移动版;把C#当做XX系统管理工具的专属原创 2013-11-30 22:08:27 · 9282 阅读 · 1 评论 -
设置断点
function trace(event, line)if (line == 120) thendebug.debug() end -- 在120行设置断点enddebug.sethook(trace, "l")原创 2013-12-05 16:35:45 · 1289 阅读 · 0 评论 -
《Lua 5.0的实现》第四章 - 表
Table是Lua主要(实际上是唯一)的数据结构。Table在语言中和实现上都起到了关键的作用。Lua语言受益于我们精心设计的table,因为table用在几个内部的任务上,而无需担心性能问题。这有助于保持Lua设计的小巧。但是,由于缺乏其他数据结构,就对用table实现的效率提出了更高的要求。翻译 2013-11-25 20:21:09 · 1520 阅读 · 0 评论 -
《Lua 5.0的实现》第八章 - 结论和致谢
在本篇论文里,我们展现了Lua 5.0中很多创新的部分:基于寄存器的虚拟机,用新算法优化当数组使用的table,实现闭包。据我们所知,在所有被广泛使用的语言中,Lua是第一个使用基于寄存器的虚拟机的。对table的优化,lua可以实现一部分的table当数组使用(也就是说,如果有足够的key在1...n之间)。它实现的闭包也是唯一的,在复杂的情况下(基于数组的栈,词法作用域,first-cla翻译 2013-11-26 21:15:52 · 1374 阅读 · 1 评论 -
《Lua 5.0的实现》第三章 - 值的表现形式
导读:Lua中的值是如何用ANSI C表示的,它们存放在哪里?翻译 2013-11-25 14:02:55 · 1445 阅读 · 0 评论 -
User-Defined Types in C
User-Defined Types in C作为《Programming in Lua third edition》的第29章,引入了一个新的数据类型userdata,向我们介绍如何在Lua中实现C语言的数组。除此之外,其余的内容都在总结过往的章节,比如:原表(metatable)、原函数的使用。同样,首先给出文章的结果:array = require("array") --连接一个自己原创 2013-11-18 20:01:16 · 1291 阅读 · 0 评论 -
在C中调用lua的内置函数string.gsub
本章以string.gsub为例子讲述如何在C语言中调用Lua中的函数。假设我们有一个命名为fordebug.lua的lua脚本:function add(a, b) return a + bend要在C语言中调用这个add函数的方法想必大家都知道,通过lua_getglobal(L, "add");lua_pusnumber(L, 3);lua_pusnumber(L, 5原创 2013-11-20 00:15:04 · 1753 阅读 · 0 评论 -
Lua中使用C函数之简化版
在《Programming in lua》中告诉我们一种添加C函数的方法,然后可以在lua脚本中使用。它是通过在lua.c添加函数来实现的。我照着葫芦画瓢了一次,不是很到要领。今天突然想到一种更简单的方法可以为学习lua所用。例如我要在lua脚本中试验一个叫“mysin”的函数,即用C语言实现的sin,方法如下://#ifdef __cplusplus#include extern "C原创 2013-11-20 00:43:09 · 1283 阅读 · 0 评论 -
C言语中可变参数的原理
《Programming in Lua》的26章最后列举了一个可变参数的例子。通过for循环将后面的参数都压入lua的栈中,lua_pushnumber(L, va_arg(v1, double))。在C语言中,函数的参数压栈的顺序是由右至左,而栈的变换是从高地址到地址,所有最左边的参数地址是最小的。比如int add(int a, int b, int c),入栈的顺序是c,b,a。假如原创 2013-11-19 21:48:51 · 1334 阅读 · 0 评论 -
Programming in Lua -- 27.2 Continuations
通过lua_pcall和lua_call可以实现,在lua脚本中调用一个C函数,这个C函数可以回调lua。很多个标准库中的函数都是这样做的,比如table.sort可以调用一个排序函数;string.gsub可以调用一个替换函数;pcall和xpcall在保护模式下调用函数。我们是否还记得lua的主要代码是通过C(一个主程序)来调用的,所有我们得到一条调用链条:C(主程序)--> Lua(脚本)-翻译 2013-11-20 10:23:07 · 1305 阅读 · 0 评论 -
在lua中实现printf
本文讨论如何在lua中实现printf。学习的目的是为了进一步了解C函数和lua之间利用栈传值的过程。在lua中printf的功能等于string.format + io.wirte,前者用于格式化字符串,后者用于输出。文中的代码来自于lua官网。用lua代码实现为:printf= function(s, ...) return io.write(s:format(...))原创 2013-11-20 16:04:10 · 7348 阅读 · 1 评论 -
辅助调试
本文内容和Lua代码无关,只是写了一段用于调试的C代码。只需在每个函数体的第一句写上:DEBUGFLAG。就可以通过Lua脚本控制每个函数的调试行为。调试行为包含断点、printf函数名和fprintf函数名。输出的函数名带有缩进格式,并用花括号表示函数体。这样的格式可以很清晰的看到函数之间的调用关系。下面是lua.c中的调用关系。main{ pmain{ collectarg原创 2013-11-20 20:31:47 · 2452 阅读 · 0 评论 -
基于Lua的C/C++调试模块
基于Lua的C/C++调试模块 每当阅读逻辑复杂的代码时,首先都想弄清函数之间的调用关系,然后想在适当的位置打上断点(或者移除断点),或者想看看某个函数被调用了多少次。很多代码阅读器、编辑器都已经提供了这些基本的功能,甚至提供的功能比我们想象的要强大很多。但有时候总不能满足我们的所有需求。经过数次的摸索,我写成了一个较为可行的调试模块与君交流商榷。其中用到了Lua脚本,固称为基于Lua,其实就是一个C/C++的模块。原创 2013-11-21 16:22:09 · 4057 阅读 · 0 评论 -
《Lua 5.0的实现》第五章 - 函数和闭包
当Lua编译一个函数时,Lua为此产生一个原型(prototype),原型的内容包括:函数的虚拟机指令、常量(数字,字符串等),一些调试信息。在运行时,当Lua执行一个function ... end表达式时,它就创建一个新的闭包。每个闭包都包含:一个对它所对应的原型的引用;一个对它environment的引用(environment是一张表,函数通过这张表获得全局变量);和一个对upvalues的引用数组,用过upvalues引用数组,可以访问函数外面的局部变量。翻译 2013-11-26 21:02:52 · 1684 阅读 · 1 评论 -
《Lua 5.0的实现》第六章 - 线程和协程
自Lua 5.0以后,Lua实现了非对称协同程序(也称为半对称协同程序或者半协同程序)[7]。Lua通过三个标准库支持协程:create、resume和yield。(这几个函数位于coroutine命名空间中。)create函数接受一个”主“函数,然后创建一个新的协程。create返回一个类型为thread的值,表示创建的协程(和Lua的其他值一样,协程也是first-class。)resume函翻译 2013-11-26 21:06:28 · 1459 阅读 · 0 评论 -
24.1 Lua debug library
Debug库并没有为你提供一个Lua的调试器,而是为你提供了编写个人调试器的基本功能。出于性能的考虑,调用基本功能的正式接口都是通过C API提供。在Lua中访问debug库的一种方式是通过Lua代码直接访问。和其他库不同,你要很吝啬的使用debug库。首先,库中的很多功能都会影响性能。其次,它打破了Lua中一些颠扑不破的真理,比如在一个局部变量的作用域之外,你不能访问它。最后,你可以翻译 2013-12-05 11:10:52 · 5429 阅读 · 0 评论