Lua是一个小巧的脚本语言,该语言设计的目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

  1. 可扩展性。Lua的扩展性非常卓越,可以通过Lua代码或C代码扩展,很多功能可以通过外部库来扩展。
  2. 简单。Lua本身简单,小巧,但功能强大,易于学习。
  3. 高效率。Lua有很高的执行效率,是目前平均效率最高的脚本语言。
  4. 平台无关。Lua几乎可以运行在所有系统上,通过完全使用ANSI C来编写的,只要有ANSI C编译器就可以编译并使用Lua。
  5. 其它特性:同时支持面向过程和函数式编程;自动内存管理;只提供一种通用类型的表table,用它可以实现数组、哈希表、集合、对象;语言内置模式匹配;闭包;函数也可以看做一个值;提供多线程支持,并非操作系统中的线程;通过闭包和table可以方便地支持面向对象所需要的一些关键机制,如数据抽象、虚函数、继承、重载等。

那么为什么要学习Lua语言了?仅仅上面这些优点是不够的,一般来说,Lua主要用于游戏开发中,性能不错,也可以当作配置文件。而对于性能要求不高的应用,强大的Python是更好的选择。

要学习Lua,自然离不开实践,我是在Win8下用VS2013来编译Lua源代码的,编译完成后可以得到一个Lua解释器,可以直接运行我们的脚本。先去官网下载Lua源代码,然后用Visual Studio创建一个C++控制台解决方案,默认不包含代码。接着把src文件夹复制到项目目录下,在VS中添加所需代码。我们一共需要创建3个项目,Lua5.2项目作为静态库,生成Lib文件;Lua项目作为解释器,引用Lua5.2项目,生成exe文件;Luac作为编译器,引用Lua5.2项目。src文件夹中,lua.c文件不要添加到库Lua5.2中,要单独添加到Lua中;luac.c文件则添加到Luac项目中。需要注意的是,在编译为lib文件时,需要做如下配置:C/C++   -->  高级  -->  编译为  -->  选择“编译为C++代码(/TP)”,否则使用lua  lib库的时候会报链接错误。不知道怎么弄的可以直接下载我提供的Lua工程代码,点击下载。弄好后,得到Lua.exe,Luac.exe和Lua5.2.lib文件,我们把这些文件放入一个Lua文件夹中,加入到系统环境变量Path中可以直接在CMD下使用。

那么用什么代码编辑器了?这里推荐使用sublime,加上插件确实方便,https://github.com/leitwolf/LuaTools。不过代码提示不够好,使用io函数时会报错,我也不知道用什么好,随意吧。好了,如果你把lua.exe加入到了环境变量中,就可以在Windows下直接运行Lua命令来启动解释器了。输入print('hello')就可以得到输出结果,但你肯定不想这么写程序,所以还是用编辑器创建一个.lua文件比较好,然后在CMD中输入命令lua file.lua就可以得到运行结果了。下面总结一下这些常用的命令格式。

在CMD模式下,就是没有直接运行lua.exe的情况下,格式如下,前面的是命令,后面是注释:

lua options script args;
lua -e "print('hello')", to execute code;
lua -i -llib, to load lib library;
lua -e "a=1" a b c, so arg[0] = "a", arg[1] = "b",
arg [-1] = "a=1", arg[-2] = "-e", arg[-3] = "lua";

在运行了Lua.exe的交互模式下,格式如下:

=4*3, as a calculator;
os.exit(), to exit the console;
dofile("test.lua"), to execute and load function;
use "do ... end" for a complete chunk

下面我们创建一个test.lua测试文件,一个简单的函数:

function fact(n)
if n < then
return nil
elseif n == then
return
else
return n * fact(n-)
end
end print(fact(-))
print("filename: " .. arg[] .. "\n")

function表示函数,后面是函数名和参数。可以看到,语句之间不需要分隔符,但你使用;并没有错。if语句和函数以end作为结尾,也不需要指定返回值类型。

Lua是一个自由格式的语言,变量名可以由任意字符构成,但不能以数字开头,也不能是常用的关键字。Lua是区分大小写的。常用的关键字有:and, or, not, if, else, elseif, then, end, true, false, nil, goto, function, for, do, while, until, break, return, in, local, repeat。

Lua是动态脚本语言,这意味着“变量”没有类型,只有“值”有类型。语言中不存在类型定义,所有的值拥有自身类型。Lua中的八种基础数据类型,可以用type函数查看类型:

  1. nil :表示值为空。
  2. boolean :nil类型的值和false都表示false,其它值表示true。
  3. number :数字类型。
  4. string :不可变的字节序列,可包含任何8-bit值,包括'\0'。
  5. function :调用由Lua或C写的函数。
  6. userdata : 指向一块内存的指针,用于存储C语言类型数据。有两种userdata,full userdata的内存由Lua管理,light userdata的内存由宿主语言管理。对于userdata,没有预定义的操作,通过使用metatables(元表),可以为full userdata定义相关数据操作。不能在Lua中修改和创建userdata类型的值,仅仅可以用C API修改。
  7. thread :Lua中的coroutine(协程),在不支持多线程的系统中也可以使用。
  8. table :用于实现数组,包含key和value,key不可以是nil和NaN,value可以包含所有类型数据,但value不可以是nil。即不存在的key的value为nil。

Tables,functions,threads,full userdata的value都是objects(变量并不包含值,只是这些值的引用)。

关于Lua的学习,推荐Programming in Lua第三版这本书,英文的,不懂的可以对照第二版中文的看。本以为Lua的知识很少,写点东西就没了,但学完后才发现太多了,所以就不继续了。

推荐一个学习项目,https://github.com/xfbs/PiL3;还有这篇博文

http://www.cnblogs.com/stephen-liu74/archive/2012/06/13/2407507.html

编译并使用Lua语言的更多相关文章

  1. 用VC编译lua源码,生成lua语言的解释器和编译器

    用VC编译lua源码,生成lua语言的解释器和编译器 1.去网址下载源码 http://www.lua.org/download.html 2.装一个VC++,我用的是VC6.0 3.接下来我们开始编 ...

  2. GJM : Lua 语言学习笔记

    Lua笔记 容易与C/C++整合 Lua所提供的机制是C所不善于的:高级语言,动态结构,简洁,易于测试和调试. Lua特有的特征: `1:可扩展性.卓越的扩展性导致了很多人将Lua用作搭建领域语言的工 ...

  3. lua语言介绍

    什么是Lua Lua是一个小巧的脚本语言. 是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Rober ...

  4. Lua语言中文手册 转载自网络

    Programming in LuaCopyright ® 2005, Translation Team, www.luachina.net Programming in LuaProgramming ...

  5. 51CTO专访淘宝清无:漫谈Nginx服务器与Lua语言

    http://os.51cto.com/art/201112/307610.htm 说到Web服务器,也许你第一时间会想到Apache,也许你会想到Nginx.虽然说Apache依然是Web服务器的老 ...

  6. 【quick-cocos2d-x】Lua 语言基础

    版权声明:本文为博主原创文章,转载请注明出处. 使用quick-x开发游戏有两年时间了,quick-x是cocos2d-Lua的一个豪华升级版的框架,使用Lua编程.相比于C++,lua的开发确实快速 ...

  7. lua语言入门之Sublime Text设置lua的Build System

    转自: http://blog.csdn.net/wangbin_jxust/article/details/8911956 最近开始学习LUA语言,使用Sublime Text作为编辑器,不得不说, ...

  8. Lua语言在Wireshark中使用(转)

    1.       检查Wireshark的版本是否支持Lua 打开Wireshark,点击“HelpàAbout Wireshark”菜单,查看弹出的对话框,如果有“with Lua 5.1”表示支持 ...

  9. Unity进阶----Lua语言知识点(2018/11/08)

    国内开发: 敏捷开发: 集中精力加班堆出来第一个版本 基本没啥大的bug 国外开发: 1).需求分析: 2).讨论 3).分模块 4).框架 5).画UML图(类图class function)(e- ...

随机推荐

  1. Tiny6410 交叉编译helloworld程序

    在工作目录下建立helloworld.c文件 #include <stdio.h> main() { printf("helloworld!\n"); } 保存关闭后. ...

  2. JavaScript 踩坑心得— 为了高速(上)

    一.前言 很多情况下,产品的设计与开发人员一直想打造一套高品质的解决方案,从而快速.平稳地适应产品迭代.速度是衡量产品适应性的真正且唯一的标准,而且,这并不是笔者的一家之言. 「速度是衡量适应能力的真 ...

  3. marmalade android 5.0 JNI 调用失败的解决方案

    5.0 真机日志如下:sart/runtime/check_jni.cc:65] JNI DETECTED ERROR IN APPLICATION: JNI CallVoidMethodV call ...

  4. Nginx的介绍和使用

    http://blog.csdn.net/shimiso/article/details/8690897 1.什么是Nginx Nginx(发音同 engine x)是一款轻量级的Web 服务器/反向 ...

  5. 在自己的网站上实现QQ授权登录

    最近在实现QQ授权登录,现将我的实现过程以及我的理解整理如下.以下所述如有不对之处,请指正. 官方提供的SDK有:JS,PHP,Java.我的网站使用Scala+Play搭建的,所以只能用JS SDk ...

  6. inflate方法与findViewById的区别

    LayoutInflater作用是将layout的xml布局文件实例化为View类对象. 对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来找 re ...

  7. ASCII码表详解

    第一部分:ASCII非打印控制字符表 ASCII表上的数字0–31分配给了控制字符,用于控制像打印机等一些外围设备.例如,12代表换页/新页功能.此命令指示打印机跳到下一页的开头.(参详ASCII码表 ...

  8. Oracle数据导入导出imp/exp sp2-0734:未知的命令开头'imp...解决方法

    Oracle数据导入导出imp/exp sp2-0734:未知的命令开头'imp...解决方法   sp2-0734:未知的命令开头'imp 忽略了剩余行默认分类   www.2cto.com  应该 ...

  9. WinCE启动失败的原因与解决办法分析

    本文通过一个真实的嵌入式项目进行说明.文中的嵌入式系统用的是ARM处理器+WinCE平台,项目的目的是要把WinCE平台从旧版本移植到WinCE6.0平台上.但结果是这个WinCE系统在启动的时候经常 ...

  10. 【HDOJ】2459 Maximum repetition substring

    后缀数组+RMQ. /* 2459 */ #include <iostream> #include <sstream> #include <string> #inc ...