Lua 5.4 was released on 29 Jun 2020

79 views
Skip to first unread message

Denis Dos Santos Silva

unread,
Jul 1, 2020, 8:13:30 PM7/1/20
to Lua BR

http://www.lua.org/ftp/lua-5.4.0.tar.gz

http://www.lua.org/manual/5.4/contents.html  


Lua 5.4 was released on 29 Jun 2020. See its main new features.

The current release is Lua 5.4.0, released on 29 Jun 2020.

Changes since Lua 5.3

Here are the main changes introduced in Lua 5.4. The reference manual lists the incompatibilities that had to be introduced.

Main changes

  • new generational mode for garbage collection
  • to-be-closed variables
  • const variables
  • userdata can have multiple user values
  • new implementation for math.random
  • warning system
  • debug information about function arguments and returns
  • new semantics for the integer 'for' loop
  • optional 'init' argument to 'string.gmatch'
  • new functions 'lua_resetthread' and 'coroutine.close'
  • string-to-number coercions moved to the string library
  • allocation function allowed to fail when shrinking a memory block
  • new format '%p' in 'string.format'
  • utf8 library accepts codepoints up to 2^31

Michel Braz de Morais

unread,
Jul 3, 2020, 12:37:54 PM7/3/20
to lua...@googlegroups.com
Does it have some benchmark compared to the previous version?

Best Regards,

Michel Braz de Morais



--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para lua-br+un...@googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/lua-br/32b563da-bf3a-448f-8e23-3a1076c4be71n%40googlegroups.com.

Luiz Henrique de Figueiredo

unread,
Jul 3, 2020, 1:22:28 PM7/3/20
to lua...@googlegroups.com
> Does it have some benchmark compared to the previous version?

Por favor, compartilhe aqui os seus resultados quando fizer uma
comparação de desempenho. Obrigado.

Denis Dos Santos Silva

unread,
Jul 3, 2020, 5:30:17 PM7/3/20
to Lua BR
benchmark é um assunto pra la de controverso, mas, um exemplo simples, meramente ilustrativo.

ambiente: windows 7, sp1, 64-bit
cygwin: 64-bit
lua:
  - sem alterações
  - compilado usando $make clean generic

==
== execução do exemplo
==

$ sh run.sh
gcc (GCC) 7.4.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

model name      : Intel(R) Core(TM) i7-2630QM CPU @ 2.00GHz
model name      : Intel(R) Core(TM) i7-2630QM CPU @ 2.00GHz
model name      : Intel(R) Core(TM) i7-2630QM CPU @ 2.00GHz
model name      : Intel(R) Core(TM) i7-2630QM CPU @ 2.00GHz
model name      : Intel(R) Core(TM) i7-2630QM CPU @ 2.00GHz
model name      : Intel(R) Core(TM) i7-2630QM CPU @ 2.00GHz
model name      : Intel(R) Core(TM) i7-2630QM CPU @ 2.00GHz
model name      : Intel(R) Core(TM) i7-2630QM CPU @ 2.00GHz
Lua 5.1.5  Copyright (C) 1994-2012 Lua.org, PUC-Rio
Lua 5.2.4  Copyright (C) 1994-2015 Lua.org, PUC-Rio
Lua 5.3.5  Copyright (C) 1994-2018 Lua.org, PUC-Rio
Lua 5.4.0  Copyright (C) 1994-2020 Lua.org, PUC-Rio
[ c      ] fib
9227465

real    0m0,514s
user    0m0,343s
sys     0m0,030s
[ lua-51 ] fib
9227465

real    0m6,281s
user    0m5,912s
sys     0m0,046s
[ lua-52 ] fib
9227465

real    0m6,033s
user    0m5,538s
sys     0m0,062s
[ lua-53 ] fib
9227465

real    0m5,537s
user    0m5,194s
sys     0m0,000s
[ lua-54 ] fib
9227465

real    0m4,391s
user    0m4,056s
sys     0m0,030s

==
== arquivos
==

$ cat run.sh
#!/bin/sh

set -e

gcc --version
cat /proc/cpuinfo | grep 'model name'

../lua/lua-5.1.5/src/lua.exe -v
../lua/lua-5.2.4/src/lua.exe -v
../lua/lua-5.3.5/src/lua.exe -v
../lua/lua-5.4.0/src/lua.exe -v

gcc                              -o fib.out   fib.c
../lua/lua-5.1.5/src/luac.exe -s -o fib51.out fib.lua
../lua/lua-5.2.4/src/luac.exe -s -o fib52.out fib.lua
../lua/lua-5.3.5/src/luac.exe -s -o fib53.out fib.lua
../lua/lua-5.4.0/src/luac.exe -s -o fib54.out fib.lua

echo "[ c      ] fib"
time ./fib.out

echo "[ lua-51 ] fib"
time ../lua/lua-5.1.5/src/lua.exe fib51.out

echo "[ lua-52 ] fib"
time ../lua/lua-5.2.4/src/lua.exe fib52.out

echo "[ lua-53 ] fib"
time ../lua/lua-5.3.5/src/lua.exe fib53.out

echo "[ lua-54 ] fib"
time ../lua/lua-5.4.0/src/lua.exe fib54.out

$ cat fib.lua
--
--

local function fib(n)
    if n < 2 then return n end
    return fib(n - 2) + fib(n - 1)
end

print(fib(35))

$ cat fib.c
//
//

#include<stdio.h>

int fib(int n) {
   return (n < 2)? n: (fib(n - 2) + fib(n - 1));
}

int main() {
  printf("%d\n",fib(35));
}



OBS: 
- apenas ilustrativo
- vou rever um exemplo com sha1 e dkjson (c/ e sem lpeg)

Michel Braz de Morais

unread,
Jul 4, 2020, 5:44:35 AM7/4/20
to lua...@googlegroups.com
Também concordo que benchmark é um assunto pra la de controverso. 
Apenas imaginei que fazem alguma coisa assim.

Os exemplos acima já mostram ganhos significantes. 

Legal,

Michel Braz de Morais



--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para lua-br+un...@googlegroups.com.

Denis Dos Santos Silva

unread,
Jul 4, 2020, 12:24:59 PM7/4/20
to Lua BR
$ sh run.sh
gcc (GCC) 7.4.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

model name      : Intel(R) Core(TM) i7-2630QM CPU @ 2.00GHz
model name      : Intel(R) Core(TM) i7-2630QM CPU @ 2.00GHz
model name      : Intel(R) Core(TM) i7-2630QM CPU @ 2.00GHz
model name      : Intel(R) Core(TM) i7-2630QM CPU @ 2.00GHz
model name      : Intel(R) Core(TM) i7-2630QM CPU @ 2.00GHz
model name      : Intel(R) Core(TM) i7-2630QM CPU @ 2.00GHz
model name      : Intel(R) Core(TM) i7-2630QM CPU @ 2.00GHz
model name      : Intel(R) Core(TM) i7-2630QM CPU @ 2.00GHz
Lua 5.1.5  Copyright (C) 1994-2012 Lua.org, PUC-Rio
Lua 5.2.4  Copyright (C) 1994-2015 Lua.org, PUC-Rio
Lua 5.3.5  Copyright (C) 1994-2018 Lua.org, PUC-Rio
Lua 5.4.0  Copyright (C) 1994-2020 Lua.org, PUC-Rio
[ c      ] fib
9227465

real    0m0,524s
user    0m0,234s
sys     0m0,000s
[ lua-51 ] fib
9227465

real    0m3,629s
user    0m3,338s
sys     0m0,030s
tbl     table   15
memory  30.470703125    248.6298828125  218.1591796875

real    0m0,176s
user    0m0,000s
sys     0m0,015s
[ lua-52 ] fib
9227465

real    0m2,854s
user    0m2,667s
sys     0m0,016s
tbl     table   15
memory  26.4013671875   277.955078125   251.5537109375

real    0m0,142s
user    0m0,000s
sys     0m0,031s
[ lua-53 ] fib
9227465

real    0m5,056s
user    0m4,758s
sys     0m0,000s
tbl     table   15
memory  26.3134765625   246.130859375   219.8173828125

real    0m0,158s
user    0m0,015s
sys     0m0,015s
[ lua-54 ] fib
9227465

real    0m2,281s
user    0m2,090s
sys     0m0,015s
tbl     table   15
memory  23.05078125     143.87109375    120.8203125

real    0m0,214s
user    0m0,015s
sys     0m0,015s

--
-- arquivos
--

$ cat run.sh
#!/bin/sh

set -e

gcc --version
cat /proc/cpuinfo | grep 'model name'

../lua/lua-5.1.5/src/lua.exe -v
../lua/lua-5.2.4/src/lua.exe -v
../lua/lua-5.3.5/src/lua.exe -v
../lua/lua-5.4.0/src/lua.exe -v

gcc                              -o fib.out   fib.c
../lua/lua-5.1.5/src/luac.exe -s -o fib51.out fib.lua
../lua/lua-5.2.4/src/luac.exe -s -o fib52.out fib.lua
../lua/lua-5.3.5/src/luac.exe -s -o fib53.out fib.lua
../lua/lua-5.4.0/src/luac.exe -s -o fib54.out fib.lua

echo "[ c      ] fib"
time ./fib.out

echo "[ lua-51 ] fib"
time ../lua/lua-5.1.5/src/lua.exe fib51.out
time ../lua/lua-5.1.5/src/lua.exe json.lua

echo "[ lua-52 ] fib"
time ../lua/lua-5.2.4/src/lua.exe fib52.out
time ../lua/lua-5.2.4/src/lua.exe json.lua

echo "[ lua-53 ] fib"
time ../lua/lua-5.3.5/src/lua.exe fib53.out
time ../lua/lua-5.3.5/src/lua.exe json.lua

echo "[ lua-54 ] fib"
time ../lua/lua-5.4.0/src/lua.exe fib54.out
time ../lua/lua-5.4.0/src/lua.exe json.lua


$ cat json.lua
--
-- dkjson: register global + disable lpeg
--

local memory1 = collectgarbage("count");

require ('dkjson');

if (type(dkjson) ~= 'table') then error('unable do load dkjson'); end

function json_decode( str )
    local obj, pos, err = dkjson.decode (str, 1, nil);

    if (err) then return nil, err; end

    return obj;
end

local fd;
local raw, tbl, err;

--
-- load file
--

fd = io.open('sample.txt', 'rb');
assert(fd);

raw = fd:read('*all');
assert(raw);

--
-- convert 'string' to table
--

tbl = json_decode( raw );
assert(tbl);

print( 'tbl', type(tbl), #tbl );

--
--
--

local memory2 = collectgarbage("count");
print( 'memory', memory1, memory2, (memory2-memory1) );

--
-- cleanup
--

fd:close();
fd = nil;


Michel Braz de Morais

unread,
Jul 15, 2020, 1:02:38 PM7/15/20
to lua...@googlegroups.com

Fazendo a migração para 5.4 percebi que para conversão de números (por exemplo math.random ), frequentemente tenho que ajustar scripts antigos pois a exceção "number has no integer representation" é frequentemente emitida.

Isso é porque por exemplo estou passando um numero flutuante e o esperado é inteiro (pelo menos foi isso que entendi). 

Pergunto, existe algum "define" que mudar isso aceitando números quebrados?


Michel Braz de Morais



--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para lua-br+un...@googlegroups.com.

Roberto Ierusalimschy

unread,
Jul 15, 2020, 2:03:19 PM7/15/20
to lua...@googlegroups.com
> Fazendo a migração para 5.4 percebi que para conversão de números (por
> exemplo math.random ), frequentemente tenho que ajustar scripts antigos
> pois a exceção "number has no integer representation" é frequentemente
> emitida.
>
> Isso é porque por exemplo estou passando um numero flutuante e o esperado é
> inteiro (pelo menos foi isso que entendi).
>
> Pergunto, existe algum "define" que *mudar* isso aceitando
> números quebrados?

Você deveria corrigir os scripts, pois uma chamada a math.random
com números fracionários provavelmente não está fazendo o que
parece. Desde 5.0, math.random trabalha com parâmetros inteiros.
Se você passa um fracionário, ele é meramente convertido para
um inteiro. Por exemplo, uma chamada math.random(0.5, 2.5) vai
retornar 0, 1 ou 2. Lua 5.4 (e 5.3 também!) está apenas apontando
um erro que as versões antigas ignoravam.

-- Roberto

Michel Braz de Morais

unread,
Jul 16, 2020, 3:29:59 AM7/16/20
to lua...@googlegroups.com
Eu suspeitava disso,

Porém os scripts foram feitos tempo atras (Lua 5.2)  e é verdade que poderiam forçar uma converção direta pra inteiro.

Obrigado pela resposta, 

Vou corrigir os scripts 😂
 

Michel Braz de Morais


--
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.

Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para lua-br+un...@googlegroups.com.

Michel Braz de Morais

unread,
Jul 18, 2020, 3:47:54 AM7/18/20
to lua...@googlegroups.com
De novo eu aqui 😒,

Depois de analisar as mudanças percebi que mesmo quando eu usava um ponto flutuante para operações que esperavam inteiros notei que na esmagadora maioria dos casos eu estava ciente e esperava uma simples conversão (truncamento) para inteiro na engine LUA.

Por exemplo o código abaixo:

image.png

Entendo que em C isso seria um grande problema pois os bits que representam um ponto flutuante não representam um inteiro.
Mas em uma linguagem interpretada eu esperaria uma checagem do tipo de dado na engine.

Uma simples mudança na engine tentando primeiramente a conversão esperado e, se, em caso de falha, então tentar a conversão para flutuante resolve esse "problema" (não é exatamente um problema e sim uma comodidade eu diria).

No meu caso interferi em um ponto que foi o suficiente (testando com meus scripts antigos a mudança parece boa pro meu caso):
image.png


Então, por exemplo o código anterior agora teria o seguinte resultado:
image.png


Vou manter essa mudança para minha engine mas entendo que esse tipo de mudança pode ter grandes impactos porém, 
pesquisando alguns comentários na internet, 
eu diria que a grande maioria das pessoas que usam lua,
de uma forma ou outra passaram por esse "problema". 
Por exemplo quando uma engine que o pessoal usa faz um upgrade de versão LUA, o pessoal começa a constatar que a mensagem "number has no integer representation" sem entender o que está acontecendo.

Finalizando, levando em conta de que há várias finalidades para LUA engine, eu sugeria uma opção de compilação para conversão implícita (default true).
Isso ajudaria (pelo menos ao meu ver) a promover a linguagem ainda mais pois penso que muita gente não tem grande conhecimento em programação usa LUA através de engines.

Isso é apenas uma reflexão pessoal que penso ser boa para a comunidade LUA no geral.

Valeu 😂





Michel Braz de Morais


Denis Dos Santos Silva

unread,
Jul 18, 2020, 10:56:01 AM7/18/20
to Lua BR
string.format() está implementa na funcao str_format() no arquivo no lstrlib.c 
-- é uma implementação simplificada do sprintf(c) não suportando todos

ainda não fiz nenhum 'teste de retrocompatibilidade' 
Reply all
Reply to author
Forward
0 new messages