Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua编译器是否优化本地变量?_Lua_Compiler Optimization - Fatal编程技术网

Lua编译器是否优化本地变量?

Lua编译器是否优化本地变量?,lua,compiler-optimization,Lua,Compiler Optimization,当前的Lua编译器是否足够聪明,可以优化掉用于清晰显示的局部变量 local top = x - y local bottom = x + y someCall(top, bottom) 还是手动内联的东西运行得更快 someCall(x - y, x + y) 由于Lua经常动态地将源代码编译成字节码,因此它被设计成一个快速的单通道编译器。它确实做了一些固定的折叠,但除此之外,没有太多的优化。您通常可以通过执行luac-l-l-p file.lua并查看生成的(反汇编的)字节码来检查编译器

当前的Lua编译器是否足够聪明,可以优化掉用于清晰显示的局部变量

local top = x - y
local bottom = x + y
someCall(top, bottom)
还是手动内联的东西运行得更快

someCall(x - y, x + y)

由于Lua经常动态地将源代码编译成字节码,因此它被设计成一个快速的单通道编译器。它确实做了一些固定的折叠,但除此之外,没有太多的优化。您通常可以通过执行
luac-l-l-p file.lua
并查看生成的(反汇编的)字节码来检查编译器的功能

在您的例子中,Lua代码

function a( x, y )
  local top = x - y
  local bottom = x + y
  someCall(top, bottom)
end

function b( x, y )
  someCall(x - y, x + y)
end
当运行
luac5.3-l-l-p file.lua时,结果显示在以下字节码列表中(跳过了一些不相关的部分):


因此,上面的
2[3]ADD 3 0 1
从寄存器0和1(本例中为局部变量
x
y
)获取值,将它们相加,并将结果存储在寄存器3中。这是此函数中的第二个操作码,相应的源代码位于第3行。

优化代码本身将是一种时空权衡,因为编译器通常内置在虚拟机中(请参阅)。不过,很明显,您可以使用不同的编译器来优化目标运行时VM的Lua字节码。(您还可以将
luac
的输出通过管道传输到。它显示
lopcodes.h
中的伪代码,而不是搜索它。)
function <file.lua:1,5> (7 instructions at 0xcd7d30)
2 params, 7 slots, 1 upvalue, 4 locals, 1 constant, 0 functions
    1   [2] SUB         2 0 1
    2   [3] ADD         3 0 1
    3   [4] GETTABUP    4 0 -1  ; _ENV "someCall"
    4   [4] MOVE        5 2
    5   [4] MOVE        6 3
    6   [4] CALL        4 3 1
    7   [5] RETURN      0 1
constants (1) for 0xcd7d30:
    1   "someCall"
locals (4) for 0xcd7d30:
    0   x   1   8
    1   y   1   8
    2   top 2   8
    3   bottom  3   8
upvalues (1) for 0xcd7d30:
    0   _ENV    0   0

function <file.lua:7,9> (5 instructions at 0xcd7f10)
2 params, 5 slots, 1 upvalue, 2 locals, 1 constant, 0 functions
    1   [8] GETTABUP    2 0 -1  ; _ENV "someCall"
    2   [8] SUB         3 0 1
    3   [8] ADD         4 0 1
    4   [8] CALL        2 3 1
    5   [9] RETURN      0 1
constants (1) for 0xcd7f10:
    1   "someCall"
locals (2) for 0xcd7f10:
    0   x   1   6
    1   y   1   6
upvalues (1) for 0xcd7f10:
    0   _ENV    0   0
OP_ADD,/*       A B C   R(A) := RK(B) + RK(C)                           */