Lua 编译

本文探讨了Lua的编译与执行过程,强调了loadfile和loadstring的区别。loadfile负责编译源代码为函数,而dofile执行编译后的函数。通过示例展示了loadstring如何影响全局变量,并提醒开发者避免使用loadstring来创建可能关联全局作用域的函数,因为这不体现闭包特性。最后提到了load函数,它是loadfile和loadstring的通用版本,接受一个reader函数来读取代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

尽管Lua被称为是一种解释型的语言,但Lua确实允许在运行源代码之前,将源代码预编译成一种中间形式(类比Python的.pyc)。区别解释型语言的主要特征在于编译器是否是语言运行时库的一部分,即是否有能力执行动态生成的代码(Lua可以通过dofile执行Lua代码)。

   

其实,dofile的核心功能是由loadfile完成的,可以这样来定义dofile:

   

loadfile并不是执行代码,而只是编译,返回一个函数,由dofile执行。

如果多次运行一个文件,可以只调用一次loadfile,重复调用其返回的函数即可。

   

另外一个函数,loadstring从字符串加载代码:

> f = loadstring('print "hello"')

> f()

hello

   

考察一下loadstring代码的执行域

> i = 1

> f = loadstring('i = i + 1')

> =i

1

   

--不要完了交互式命令行中,一行代码默认一个block

   

> f = loadstring('i=i+1')

> do

>> local i =1

>> f()

>> print(i)

>> end

1

   

> do

>> local i = 1

>> local f = loadstring('i=i+1')

>> f()

>> print(i)

>> end

1

   

两次运行,都是将global中的i加1.

可以这样理解f:

function f()

i = i+1

end

但如果直接替换,其结果并不一致。

> do

>> local i =1

>> function f()

>> i = i + 1

>> end

>> f()

>> print(i)

>> end

2

可以认为,loadstring编译出的函数,会关联global scope,因而不会表现出闭包的特性,故而,应该尽量不使用这种方式!

   

另外,如果语法有误,那么loadstring返回nil。

可以使用assert(loadstring(s))()的方式。

如果参数不是nil/false,返回参数,否则assert error;

   

深究一下loadfile和loadstring就会知道,Lua中其实有一个load函数,后者接收一个reader function,调用其读取代码;

   

   

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值