Lua源码的编译

转载自:http://blog.csdn.net/qinyuanpei/article/details/45169969

Lua5.3已经发布好长时间了,可是因为LuaForWindows的Lua版本无法和官方保持一致,所以想尝试下编译Lua5.3的源代码,因为作为一名合格的程序员,是应该要懂得编译原理的相关内容的啊(可是我真的没有学过编译原理啊!…..)。好了,那么今天博主将在文章中和大家分享自己编译Lua5.3的过程,希望能够对大家学习和使用Lua有些帮助吧!

我们知道Lua由三部分组成,即 
* Lua链接库 
* Lua解释器 
* Lua编译器

因此,对于Lua源代码的编译主要就是编译Lua链接库、Lua解释器和Lua编译器

编译Lua链接库

  • 使用Visual Studio创建一个VC++项目,项目命名为Lua53,项目类型为静态库、不设置预编译头。
  • 删除Visual Studio自动创建的.cpp文件及其对应的.h文件。
  • 将下载的Lua代码解压,将src目录下的全部文件拷贝到项目中,然后删除lua.c、luac.c和lua.hpp这三个文件。
  • 编译项目会得到一个Lua53.lib的文件,这就是我们编译得到的Lua链接库。

编译Lua解释器

我们知道Lua解释器是一个可以直接运行Lua代码的可执行文件,因此 
* 在同一个解决方案下继续创建VC++项目,项目命名为Lua,项目类型为控制台应用程序、需设置预编译头。 
* 删除Visual Studio自动创建的.cpp文件及其对应的.h文件。 
* 将下载的Lua代码解压,将src目录下的全部文件拷贝到项目中,然后删除luac.c这个文件。 
* 设置当前项目依赖于Lua53项目 
* 编译项目会得到一个Lua.exe文件,这就是我们编译得到的Lua解释器。

运行该程序,我们可以看到下面的结果:

Lua解释器程序

好了,现在我们来写一个简单的Lua程序:

<code class="language-Lua hljs lua has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">io</span>.write(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Hello I get a powerful program language called Lua \n"</span>)
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">io</span>.write(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span>.format(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"This Lua is %s and now is %s \n"</span>,<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">_VERSION</span>,<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">os</span>.date()))</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

程序运行结果为:

Hello I get a powerful program language called Lua 
This Lua is Lua5.3 and now is 04/16/15 16:06:43

编译Lua编译器

和Lua类似地, 
* 在同一个解决方案下继续创建VC++项目,项目命名为Lua,项目类型为控制台应用程序、需设置预编译头。 
* 删除Visual Studio自动创建的.cpp文件及其对应的.h文件。 
* 将下载的Lua代码解压,将src目录下的全部文件拷贝到项目中,然后删除lua.c这个文件。 
* 设置当前项目依赖于Lua53项目 
* 编译项目会得到一个Luac.exe文件,这就是我们编译得到的Lua解释器。

使用Lua编译器需要在环境变量中增加对Lua编译器路径地引用,比如Luac.exe放在D:\Program Files\Lua\build\这个目录下,就在PATH这个变量中增加:

<code class="hljs tex has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">D:<span class="hljs-command" style="box-sizing: border-box; color: rgb(0, 0, 136);">\Program</span> Files<span class="hljs-command" style="box-sizing: border-box; color: rgb(0, 0, 136);">\Lua</span><span class="hljs-command" style="box-sizing: border-box; color: rgb(0, 0, 136);">\build</span>;</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

因为每个人的Lua编译器存放的位置都不同,所以这个就不再赘述了。

好了,今天的内容就是这样了。

链接


993 年在巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro in Brazil)诞生了一门编程语言,发明者是该校的三位研究人员,他们给这门语言取了个浪漫的名字——Lua,在葡萄牙语里代表美丽的月亮。事实证明她没有糟蹋这个优美的单词,Lua语言正如它名字所预示的那样成长为一门简洁、优雅且富有乐趣的语言。 Lua从一开始就是作为一门方便嵌入(其它应用程序)并可扩展的轻量级脚本语言来设计的,因此她一直遵从着简单、小巧、可移植、快速的原则,官方实现完全采用ANSI C编写,能以C程序库的形式嵌入到宿主程序中。Lua的每个版本都保持着开放源码的传统,不过各版采用的许可协议并不相同,自5.0版(最新版是5.1) 开始她采用的是著名的MIT许可协议。正由于上述特点,所以Lua在游戏开发、机器人控制、分布式应用、图像处理、生物信息学等各种各样的领域中得到了越来越广泛的应用。其中尤以游戏开发为最,许多著名的游戏,比如Escape from Monkey Island、World of Warcraft、大话西游,都采用了Lua来配合引擎完成数据描述、配置管理和逻辑控制等任务。 作为一门过程型动态语言,Lua有着如下的特性:1、变量名没有类型,值才有类型,变量名在运行时可与任何类型的值绑定;2、语言只提供唯一一种数据结构,称为表(table),它类似key-value关联数组,可以用任何类型的值作为key和value。提供了一致且富有表达力的表构造语法,使得Lua很适合描述复杂的数据;3、函数是一等类型,支持匿名函数和正则尾递归(proper tail recursion);4、支持词法定界(lexical scoping)和闭包(closure);5、提供thread类型和结构化的协程(coroutine)机制,在此基础上可方便实现协作式多任务;6、运行期能编译字符串形式的程序文本并载入虚拟机执行;7、通过元表(metatable)和元方法(metamethod)提供动态元机制(dynamic meta-mechanism),从而允许程序运行时根据需要改变或扩充语法设施的内定语义;8、能方便地利用表和动态元机制实现基于原型(prototype-based)的面向对象模型;9、从5.1版开始提供了完善的模块机制,从而更好地支持开发大型的应用程序; Lua 的语法类似PASCAL和Modula但更加简洁,所有的语法产生式规则(EBNF)不过才60几个。熟悉C和ASCAL的程序员一般只需半个小时便可将其完全掌握。而在语义上Lua则与Scheme极为相似,她们完全共享上述的1、3、4、6点特性,Scheme的continuation与协程也基本相同只是自由度更高。最引人注目的是,两种语言都只提供唯一一种数据结构:Lua的表和Scheme的列表(list)。正因为如此,有人甚至称Lua为“只用表的Scheme”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值