编程语⾔Lua(⼀):⼊门介绍、学习资料、项⽬管理与调试⽅法作者:李佶澳  转载请保留:原⽂地址  发布时间:2018/10/22 17:10:00
说明
Lua简介
Lua的学习资料
Lua的第三⽅库和配套⼯具
Lua的安装
Lua代码的运⾏
Lua的语法
以ing结尾的形容词>freemarker取值Lua代码组织⽅式
Lua Module
require函数加载Module的过程
require函数查Module的路径getparameter爆红
Module的版本管理
package
Lua的项⽬管理⼯具
依赖管理与发布打包:luarocks
luarocks初始化项⽬
luarocks安装依赖
记录依赖的rockspec⽂件
项⽬的安装
IntelliJ Idea
Lua代码的调试⽅法
在IntelliJ IDEA中调试Lua代码
IDEA中使⽤Remote Debugger
可能需要引⽤mobdebug模块
参考
说明
最近在学习API⽹关Kong(六):Kong数据平⾯的实现分析,Kong的数据平⾯使⽤的语⾔是Lua,需要学习⼀下Lua这门语⾔的使⽤⽅法、项
⽬组织⽅式以及配套的开发调试⼯具等。
Lua简介
Lua⽹站上说这门语⾔已经有25年的历史了,上的Lua (programming language)页⾯上给出了具体的时间:
Lua was created in 1993 by Roberto Ierusalimschy, Luiz Henrique de
Figueiredo, and Waldemar Celes, members of the Computer Graphics
Technology Group (Tecgraf) at the Pontifical Catholic University of Rio
de Janeiro, in Brazil.
有点吃惊,Lua是⼀门挺古⽼的语⾔,⽽且是巴西的⼤学开发的,顺便查了⼀下其它⼏种常见语⾔的诞⽣时间:
C,1969年⾄1973年间,贝尔实验室的丹尼斯·⾥奇与肯·汤普逊,为了移植与开发UNIX操作系统,以B语⾔为基础设计、开发出来。
C++,1979年,Bjarne Stroustrup(⽐雅尼·斯特劳斯特鲁普)决定为C语⾔增强⼀些类似Simula的特点,1985年10⽉出现了第⼀个商业化发布。
Python,1989年的圣诞节期间,吉多·范罗苏姆为了打发时间,在荷兰的阿姆斯特丹的开发的脚本解释程序,第⼀版发布于1991年。(他得有多闲?…)
Java,1990年Sun公司的⼀个内部项⽬研究的技术,最开始的名称是Oak,1993年夏天能够使⽤,1994年决定将该技术⽤于互联⽹,1994年Java 1.0a提供下载。1996年Sun公司成⽴Java业务集团,专门开发Java技术,因为Oak商标已经被注册,从Oak改名为Java。
Lua,1977~1992年,巴西在计算机软件和硬件上设置了贸易壁垒,位于巴西的Tecgraf公司不能从国外购买软件,于是从零开始开发基础软件,lua是葡萄⽛语,意思是⽉亮。
Brainfuck,1993年,Urban Müller创建的奇葩语⾔,⼀共只有8个命令和1个结构指针,它的代码是这个样⼦的:
++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
你没看错,上⾯的++++等就是⽤Brainfuck语⾔写的代码。
Lua的学习资料
matlab软件的功能Programming in Lua,Lua的设计者Roberto Ierusalimschy写的Lua语⾔教程,2016年出版了第4版,覆盖了Lua 5.3。百度云下载地
址:Download:Programming in Lua, 4th Edition。
Lua 5.3 Reference Manual,Lua语⾔的概念、语法定义和标准库函数列表。
Lua Directory,收集了⼤量的Lua资料。
Lua wiki,Lua的wiki。
另外还有邮件列表、IRC、StackOverFlow主页等,这⾥不列出了,在Lua Getting Started中可以到。
Lua的第三⽅库和配套⼯具
Lua的标准库很⼩,只有11个⽂件,Lua Addons中收录了⼤量拓展Lua功能的资源:
Lua在多个平台上的发⾏⽅式
Lua的解释器,以及其它语⾔解释器对Lua的⽀持
Lua可以调⽤的Library,包括⽤其它语⾔实现的、提供了Lua接⼝的Library
Lua与其它编程语⾔的相互调⽤
Lua的功能增强补丁(code patch)
Lua的项⽬开发⼯具,包括开发调试、编译打包、性能分析等
Lua的集成开发环境(IDE)
Lua的⽂档汇总
此外还有:
awesome-lua,⼀组精选的、⾼质量的Lua Package。
LuaRocks,⼀个Lua Package管理⼯具,收录了⼤量以rocks⽅式发布的Lua Package。
luadist,⼀个跨平台的Lua Package管理⼯具。
zerobrane,⼀个纯粹的Lua IDE 。(装起来看了⼀下,功能很少,不⽀持安装插件,感觉没有Idea+EmmyLua好⽤)
如果使⽤Idea,可以⽤EmmyLua插件。
Lua的安装
在windows上可以使⽤luadist安装,在Linux和Mac上,可以直接使⽤对应的包管理⼯具安装:
yum install -y lua    # for centos
brew install lua      # for mac
也可以⾃⼰编译安装,lua download:
tar zxf lua-5.3.
cd lua-5.3.5
make linux test    # for linux
make macosx test  # for mac
从OpenResty最佳实践的lua介绍中了解到Lua和LuaJIT的关系和区别:
LuaJIT 就是⼀个为了再榨出⼀些速度的尝试,它利⽤即时编译(Just-in Time)技术把 Lua 代码编译成本地机器码后交由
CPU 直接执⾏。LuaJIT 2 的测评报告表明,在数值运算、循环与函数调⽤、协程切换、字符串操作等许多⽅⾯它的加速效果都很显著。对性能要求更⾼,可以使⽤luaJIT,下⾯是mac上的安装⽅法:
winform 仪表盘brew install luajit
后⾯⽤到lua命令的地⽅,⽤luajit命令替代,执⾏效率会更⾼。
Lua代码的运⾏
安装lua之后,直接执⾏lua,进⼊lua的命令⾏后,可以直接输⼊代码,回车执⾏:
➜  ~ lua
Lua 5.3.5  Copyright (C) , PUC-Rio
> print("hello world!")
hello world!
>
也可以将代码写到.lua⽂件中,lua中注释符号是--:
$ cat 01-hello-world.lua
#! /usr/bin/env lua
--
-
- 01-hello-world.lua
-- Copyright (C) 2018 lijiaocn <lijiaocn@foxmail>
--
-- Distributed under terms of the GPL license.
--
print("Hello World")
⽤lua命令加载执⾏.lua⽂件:
$ lua 01-hello-world.lua
Hello World
Lua的语法
这块的内容⽐较多,单独开⼀篇笔记记录。
建议直接学习Programming in Lua, 4th Edition。
百度⽹盘下载地址:Download:Programming in Lua, 4th Edition
Lua代码组织⽅式
Lua5.1版本开始,定义了Module和Package,Module是可复⽤的Lua代码⽂件,Package是⼀组平铺的或有树状包含关系的Module。Lua Module
Module是⼀个返回⼀个Table变量的.lua⽂件,使⽤函数require引⼊:
-- 引⼊math.lua
local m = require "math"
print(m.sin(3.14))
模块名称也可以⽤变量,动态加载模块:
local cmd = require("d." .. cmd_name)
Lua的标准模块会被⽤下⾯的⽅式加载默认加载:
math = require "math"
string = require "string"
...
因此标准模块可以直接⽤模块名引⽤:
math.sin(3.14)
python入门教程完整版百度网盘Lua特别⼩巧,标准库数量只有⼀下⼏个,可以到Lua的⼿册中查看标准库中函数和⽤法:
coroutine.lua
debug.lua
global.lua
io.lua
math.lua
os.lua
package.lua
stdfuncs.lua
stdlibrary.doclua string.lua
table.lua
除了直接⽤操作.调⽤modules中的函数,还可以将函数复制给其它变量,通过其它变量调⽤:
local m = require "mod"
local f = m.foo
f()
还可以只导⼊module中的⼀个函数:
local f = require "mod".foo
require函数加载Module的过程
require函数的内部流程如下:
1 require⾸先检查package.loaded,查看⽬标module是否已经加载过,如果加载过,直接返回上次加载得到的table;
2 如果没有,⽤package.path中的⽬录模版中查module对应的lua⽂件,到之后⽤loadfile函数加载,⽣成⼀个loader变量;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。