16

Lua5.4新特性

 4 years ago
source link: https://zhuanlan.zhihu.com/p/137588708
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Lua5.4新特性

Lua5.4已经进入rc(Release Candidate)状态,相信很快就会发布正式版。这个版本在语言层面上修改的东西并不多,但是默认的GC被换成了“分代式GC”,这对于那些经常产生短期对象的程序应该会有很明显的性能提升。GC带来的负担永远是自动内存管理语言的一大痛点,如果能在这一点上取得突破,那肯定比提供更多语法糖来得有价值。

此外5.4可以指定局部变量的属性,用这样的语法:

local a <NAME> = 3

NAME可以是constclose,为const时表示const变量(const variables),const变量可以帮助编译器作一些优化,比如下面的代码:

local a <const> = 4
local b = a + 7
print(b)

编译器会把a消除掉,直接给b赋11。这种优化是有限的,对于基本类型和字符串,能够有效减少寄存器的访问,但对于table貌似益处不大。代码文件如果需要一些数值常量,可以写成const变量,比如:

local MAX_LEN <const> = 20
function check_name(name)
    return #name <= MAX_LEN
end

check_name中就没有upvalue的访问,而是直接转换成和20的比较。

close变量(To-be-closed Variables)需要和close元方法结合使用,在变量超出作用域时,会调用变量的close元方法,这听起来是不是有点像C++的RAII用法。下面是一个例子:

local function newlock()
    local lock = {
        acquire = function()
            print("acquire lock")
        end,
        release = function()
            print("release lock")
        end,
    }
    return lock
end

local function lockguard(lock)
    local wrap = {
        lock = lock
    }
    lock.acquire()
    return setmetatable(wrap, {__close = function(t, err)
        t.lock.release()
    end})
end

local lock = newlock()
do
    for i = 1, 3 do
        local l <close> = lockguard(lock)
        print(i)
        error("err")
    end
end

定义local l <close>后,无论是否有错误,release都能得到调用;从这个例子也可以看出,close变量一般用于需要及时释放资源的情况;否则Lua的GC可以应付大多数情况。

除了上面提到的特性,还有一些新的修改罗列如下:

  • userdata现在可以关联多个user值,C的API也有相应的修改,如果我们新建的userdata没有关联值,则尽量使用lua_newuserdatauv,这样更高效,lua_newuserdata仅仅为了兼容,且默认会关联1个值。
  • math.random使用了新的实现,会从某个随机种子开始,简单说即程序启动后第1次调用math.random会得到不同值;以前版本都从相同值开始。
  • 协程库提供了新的APIcoroutine.closelua_resetthreadcoroutine.close只能在挂起或死亡状态下调用,挂起状态下会使用协程进入死亡状态,并且关闭所有的close变量。

其他修改请参考Lua文档:


Recommend

  • 109
    • www.cnblogs.com 7 years ago
    • Cache

    C# 7.0 新特性:本地方法 - 冠军

    C# 7.0:本地方法 VS 2017 的 C# 7.0 中引入了本地方法,本地方法是一种语法糖,允许我们在方法内定义本地方法。更加类似于函数式语言,但是,本质上还是基于面向对象实现的。 1. 本地方法 先看一个示例: 1 using static...

  • 114

    微软刚刚宣布,Windows10FallCreatorsUpdate(秋季创意者更新)已经正式发布,并开始向全球Windows10用户陆续推送。这是Windows10发布以来的第四次重磅升级,可以称之为“Windows10.4”。现在用户就可以通过WindowsUpdate检查更新(分批次推送耐心等),或者手动下载官方...

  • 142
    • 微信 mp.weixin.qq.com 7 years ago
    • Cache

    深入解读 Java 9 新特性

    深入解读 Java 9 新特性 Original 杨晓峰...

  • 110
    • www.jianshu.com 7 years ago
    • Cache

    Java 9 新特性概览 - 简书

    pre-reade&本文涉及的内容 首先,你可以在Java 9 Download下载java 9,然后就可以体验java 9了。本文是对java 9新特性的概览而不是详解,因为要详解的话需要收集大量的信息,而且有可能还不能覆盖所有特性,还有一点是本人才疏学浅,未免对新事物的理解过于迟...

  • 183

    Site not found · GitHub Pages There isn't a GitHub Pages site here. If you're trying to publish one, read t...

  • 97
    • zhuanlan.zhihu.com 7 years ago
    • Cache

    TypeScript 2.5~2.6 新特性一览

    TypeScript 2.5~2.6 新特性一览JavaScript话题下的优秀答主TypeScript 团队周二发布了 TypeScript 2.6, 带来了包括严格函数类型和更快的 tsc --watch 在内的...

  • 168

    Site not found · GitHub Pages There isn't a GitHub Pages site here. If you're trying to publish one, read t...

  • 71
    • www.10tiao.com 6 years ago
    • Cache

    用TCC在Windows下编译Lua5.3.4

    最新的Lua版本是5.3.4,网上能找到的编译过的版本有这么几种: 1、Lua5.3.4源码 2、用新版MinGW-w32/w64编译的Lua5.3.4,只有exe文件,没有链接库,同时MinGW必须带上libgcc_s_dw2-1.dll这么一个...

  • 21
    • zhuanlan.zhihu.com 4 years ago
    • Cache

    Lua5.4新特性 - 知乎

  • 5

    xmake v2.6.1 released, Switch to Lua5.4 runtime, Support Rust and Cplusplus mixed compilation

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK