lua 学习之编译

编译

  1. lua 是解释语言
  2. 但 lua 允许在运行源代码前,先将源代码编译为一种中间形式
  3. 区别解释语言的主要特征并不在于是否能编译它们
    1. 在于编译器是否是语言运行时库的一部分
    2. 是否有能力执行动态生成的代码

loadfile 函数

  1. dofile 函数是一种内置的操作,用于运行 lua 代码块
  2. dofile 仅是做了 loadfile的辅助工作
  1. loadfile 会从一个文件加载 lua 代码块
  2. 但不会运行代码,只是编译代码
  3. 然后将编译结果作为一个函数返回
  4. dofile 会引发错误
  5. loadfile 只会抛出错误值,但不处理错误
function dofile(filename)
    -- assert 返回错误值
    local f = assert(loadfile(filename))
    return f()
end
  1. 发生错误时,loadfile 会返回 nil 及错误消息,可自定义错误消息
  2. 在需要多次运行一个文件时,只需调用一次 loadfile ,多次调用它的返回结果,也就是那个函数即可
  3. dofile 开销则相比 loadfile大得多,因为 loadfile 只编译一次文件

loadstring 函数

  1. 从一个字符串中读取代码
  2. 同样会返回一个函数
  3. 开销很大,因为在每次调用 loadstring 时都会编译一次
  4. function 的写法只在编译对于程序块时被编译了一次
i = 0
f = loadstring("i = i + 1") -- 等效于 f = function() i = i + 1 end
f()
print(i) -- 1
f()
print(i) -- 2

-- dostring 完成加载并运行代码
assert(loadstring(s))() -- 语法错误 "attempt to call a nil value"
  1. loadstring 编译时不涉及词法域
  2. loadsting 只在全局环境中编译字符串,而非局部环境
i = 32
local i = 0
f = loadstring("i = i + 1; print(i)")
g = function() i = i + 1; print(i) end
f() -- 33 使用了全局变量
g() -- 1 使用了局部变量
  1. 可以执行外部代码
do
print("enter you expression:")
local l = io.read()
local func = assert(loadstring("return '" .. l .. "'"))
print("the value of your expression is " .. func())
end

do
print("enter function to be plotted(with variable 'x'):")
local l = io.read()
local f = assert(loadstring("return " .. l))
for i = 1, 20 do
    x = i
    print(x .. ":" .. string.rep("*", f()))
end
end
  1. loadfileloadstring ,有一个真正的原始函数 load
  2. loadfileloadstring 分别从文件和字符串中读取程序块
  3. load 接收一个「读取器函数」,并在内部调用它来获取程序块
  4. 读取器函数可以分几次返回一个程序块,load 会反复调用它,直到它返回 nil (表示程序块结束)为止
  5. 只有当程序块不在文件中,或者程序块过大而无法放入内存时,才会用到 load
  1. lua 将所有独立的程序块视为一个匿名函数的函数体,并且该匿名函数还具有可变长实参
  2. 与其他函数一样,程序块中可以声明局部变量
loadstring("a = 1") -- 等效于 function(...) a = 1 end
f = loadstring("local a = 10; print(a + 10)")
f() -- 20
  1. 重写读取输入示例,避免使用全局变量 x
print("enter function to be plotted (with variable 'x'):")
local l = io.read()
local f = assert(loadstring("local x = ...; return " .. l))
for i = 1, 20 do
    print(string.rep("*", f(i)))
end
  1. load 函数不会引发错误。在错误发生时,load 会返回 nil 以及一条错误信息
print(loadstring("a a"))
-- nil [string "a a":1 '=' expected nead 'a']

  1. loadfileloadstring 不会带来任何副作用
  2. 它们只是将程序块编译为一种中间表示,然后将结果作为一个匿名函数来返回。
  3. 而并不是加载了一个程序块,或定义了其中的函数
  4. 函数定义是一种赋值操作,是在运行时才完成的操作。
-- 编写一个 lua 文件,命名为 foo
function foo(x)
    print(x)
end

-- 在 cmd 中的 lua 解释器中输入
f = loadfile("你存放 foo 文件的路径")
print(foo()) -- nil
f() -- 定义函数
foo("test") -- test
  1. 执行外部代码的一些操作
  2. 处理加载程序块时报告任何错误
  3. 如果代码不受信任,需要在保护环境(即之前提到的「沙盒」中执行这些代码)

本篇文章由一文多发平台ArtiPub自动发布

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容