主页 > 知识库 > Lua中的源代码预编译浅析

Lua中的源代码预编译浅析

热门标签:Linux服务器 服务外包 地方门户网站 网站排名优化 呼叫中心市场需求 百度竞价排名 AI电销 铁路电话系统

尽管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,调用其读取代码;

您可能感兴趣的文章:
  • Lua中使用元表(metatable)执行算术类元方法实例
  • Lua简介、编译安装教程及变量等语法介绍
  • Mac平台中编译安装Lua运行环境及Hello Lua实例
  • Lua中编译执行代码相关的函数详解

标签:铜川 兰州 仙桃 湘潭 黄山 衡水 崇左 湖南

巨人网络通讯声明:本文标题《Lua中的源代码预编译浅析》,本文关键词  ;如发现本文内容存在版权问题,烦请提供相关信息告之我们,我们将及时沟通与处理。本站内容系统采集于网络,涉及言论、版权与本站无关。
  • 相关文章
  • 收缩
    • 微信客服
    • 微信二维码
    • 电话咨询

    • 400-1100-266