Почему язык Lua — это интересно · Почему язык Lua — это...
Transcript of Почему язык Lua — это интересно · Почему язык Lua — это...
![Page 2: Почему язык Lua — это интересно · Почему язык Lua — это интересно? Ник Заварицкий mejedi@tarantool.org](https://reader034.fdocument.pub/reader034/viewer/2022043006/5f8db70051f5b2295930b202/html5/thumbnails/2.jpg)
Индекс TIOBE (2016)
1. Java
2. C
3. C++
4. Python
5. C#
6. PHP
7. JavaScript
31. Lua
![Page 3: Почему язык Lua — это интересно · Почему язык Lua — это интересно? Ник Заварицкий mejedi@tarantool.org](https://reader034.fdocument.pub/reader034/viewer/2022043006/5f8db70051f5b2295930b202/html5/thumbnails/3.jpg)
Кто использует Lua?
![Page 4: Почему язык Lua — это интересно · Почему язык Lua — это интересно? Ник Заварицкий mejedi@tarantool.org](https://reader034.fdocument.pub/reader034/viewer/2022043006/5f8db70051f5b2295930b202/html5/thumbnails/4.jpg)
Кто еще использует Lua?
![Page 5: Почему язык Lua — это интересно · Почему язык Lua — это интересно? Ник Заварицкий mejedi@tarantool.org](https://reader034.fdocument.pub/reader034/viewer/2022043006/5f8db70051f5b2295930b202/html5/thumbnails/5.jpg)
Далее…
• Знакомство с Lua
• Lua WAT
• Почему в Tarantool LuaJIT, а не V8
• Как устроен трассирующий JIT-компилятор
![Page 6: Почему язык Lua — это интересно · Почему язык Lua — это интересно? Ник Заварицкий mejedi@tarantool.org](https://reader034.fdocument.pub/reader034/viewer/2022043006/5f8db70051f5b2295930b202/html5/thumbnails/6.jpg)
Lua: Пример
print("Hello, world!")
local function left_pad(str, len, ch) return string.rep(ch or " ", len - #str) .. str end
![Page 7: Почему язык Lua — это интересно · Почему язык Lua — это интересно? Ник Заварицкий mejedi@tarantool.org](https://reader034.fdocument.pub/reader034/viewer/2022043006/5f8db70051f5b2295930b202/html5/thumbnails/7.jpg)
Lua: Типы данных
nil
boolean true false
number 42 3.14159265
string “Hello, world!”
table{ 1,2,3 } { name=“John”, last=“Doe” }
function
thread, userdata, cdata
![Page 8: Почему язык Lua — это интересно · Почему язык Lua — это интересно? Ник Заварицкий mejedi@tarantool.org](https://reader034.fdocument.pub/reader034/viewer/2022043006/5f8db70051f5b2295930b202/html5/thumbnails/8.jpg)
Lua: if / then / else
local function say(animal) if animal == "Duck" then print("Quack") elseif animal == "Cat" then print("Meow") else print("♫") end end
![Page 9: Почему язык Lua — это интересно · Почему язык Lua — это интересно? Ник Заварицкий mejedi@tarantool.org](https://reader034.fdocument.pub/reader034/viewer/2022043006/5f8db70051f5b2295930b202/html5/thumbnails/9.jpg)
Lua: for
local sum = 0 for i = 1,100 do sum = sum + i end
local t = { language="Lua", notes="It rocks!" } for k,v in pairs(t) do print(k, "=", v) end
![Page 10: Почему язык Lua — это интересно · Почему язык Lua — это интересно? Ник Заварицкий mejedi@tarantool.org](https://reader034.fdocument.pub/reader034/viewer/2022043006/5f8db70051f5b2295930b202/html5/thumbnails/10.jpg)
Lua: Функции (1)
local function max(a, b) return a > b and a or b end
local first, last = string.find("Dark room", "a cat")
![Page 11: Почему язык Lua — это интересно · Почему язык Lua — это интересно? Ник Заварицкий mejedi@tarantool.org](https://reader034.fdocument.pub/reader034/viewer/2022043006/5f8db70051f5b2295930b202/html5/thumbnails/11.jpg)
Lua: Функции (2)
local function wrap(fn) return function(...) print("Calling ", fn) return fn(...) end end
![Page 12: Почему язык Lua — это интересно · Почему язык Lua — это интересно? Ник Заварицкий mejedi@tarantool.org](https://reader034.fdocument.pub/reader034/viewer/2022043006/5f8db70051f5b2295930b202/html5/thumbnails/12.jpg)
Lua: Осталось за кадром…
while repeat
local module = require("module")
мета-таблицы
GC
error() pcall()
loadstring() string.dump()
coroutine.create() coroutine.yield()
![Page 13: Почему язык Lua — это интересно · Почему язык Lua — это интересно? Ник Заварицкий mejedi@tarantool.org](https://reader034.fdocument.pub/reader034/viewer/2022043006/5f8db70051f5b2295930b202/html5/thumbnails/13.jpg)
WAT
![Page 14: Почему язык Lua — это интересно · Почему язык Lua — это интересно? Ник Заварицкий mejedi@tarantool.org](https://reader034.fdocument.pub/reader034/viewer/2022043006/5f8db70051f5b2295930b202/html5/thumbnails/14.jpg)
WAT
#{ 1, 2, nil, 4 } = ?
0 or 1 = ?
"" or "apple" = ?
1 .. "bar" = ?
![Page 15: Почему язык Lua — это интересно · Почему язык Lua — это интересно? Ник Заварицкий mejedi@tarantool.org](https://reader034.fdocument.pub/reader034/viewer/2022043006/5f8db70051f5b2295930b202/html5/thumbnails/15.jpg)
WAT
local function chunky_bacon() return "chunky", "bacon" end
{ chunky_bacon() } = ?
{ (chunky_bacon()) } = ?
{ "OMNOMNOM", chunky_bacon() } = ?
{ chunky_bacon(), "Tastes good!" } = ?
![Page 16: Почему язык Lua — это интересно · Почему язык Lua — это интересно? Ник Заварицкий mejedi@tarantool.org](https://reader034.fdocument.pub/reader034/viewer/2022043006/5f8db70051f5b2295930b202/html5/thumbnails/16.jpg)
WAT
local i for i = 1,100 do -- nothing end i = ?
local function factorial(n) return n > 1 and n * factorial(n-1) or 1 end factorial(10) = ?
![Page 17: Почему язык Lua — это интересно · Почему язык Lua — это интересно? Ник Заварицкий mejedi@tarantool.org](https://reader034.fdocument.pub/reader034/viewer/2022043006/5f8db70051f5b2295930b202/html5/thumbnails/17.jpg)
Почему в Tarantool LuaJIT, а не V8?
• Проще встраивается
• FFI
• Работает быстрее*
• 78,098 LOC vs. 2,155,836 LOC
![Page 18: Почему язык Lua — это интересно · Почему язык Lua — это интересно? Ник Заварицкий mejedi@tarantool.org](https://reader034.fdocument.pub/reader034/viewer/2022043006/5f8db70051f5b2295930b202/html5/thumbnails/18.jpg)
LuaJIT FFI
![Page 19: Почему язык Lua — это интересно · Почему язык Lua — это интересно? Ник Заварицкий mejedi@tarantool.org](https://reader034.fdocument.pub/reader034/viewer/2022043006/5f8db70051f5b2295930b202/html5/thumbnails/19.jpg)
local ffi = require("ffi")
ffi.cdef([[ unsigned char *SHA512( const unsigned char *d, size_t n, unsigned char *md);]])
local crypto = ffi.load("libcrypto.so")
local function sha512(s) local md = ffi.new("char[?]", 64) crypto.SHA512(s, #s, md) return ffi.string(md, 64) end
![Page 20: Почему язык Lua — это интересно · Почему язык Lua — это интересно? Ник Заварицкий mejedi@tarantool.org](https://reader034.fdocument.pub/reader034/viewer/2022043006/5f8db70051f5b2295930b202/html5/thumbnails/20.jpg)
Как устроен трассирующий JIT-компилятор
• Компилируются «горячие куски кода» (правило 80% / 20%)
• Full-method JIT vs. tracing JIT
![Page 21: Почему язык Lua — это интересно · Почему язык Lua — это интересно? Ник Заварицкий mejedi@tarantool.org](https://reader034.fdocument.pub/reader034/viewer/2022043006/5f8db70051f5b2295930b202/html5/thumbnails/21.jpg)
local function sum_positive(sum, val) if val > 0 then return sum + val else return sum end end
local function reduce(array, func, initial) local res = initial for i = 1,#array do res = func(res, array[i], i, array) end return res end
reduce({ ... }, sum_positive, 0)
![Page 22: Почему язык Lua — это интересно · Почему язык Lua — это интересно? Ник Заварицкий mejedi@tarantool.org](https://reader034.fdocument.pub/reader034/viewer/2022043006/5f8db70051f5b2295930b202/html5/thumbnails/22.jpg)
④ ③
② ①
local function sum_positive(sum, val) if val > 0 then return sum + val else return sum end end
local function reduce(array, func, initial) local res = initial for i = 1,#array do res = func(res, array[i], i, array) end return res end
reduce({ ... }, sum_positive)
![Page 23: Почему язык Lua — это интересно · Почему язык Lua — это интересно? Ник Заварицкий mejedi@tarantool.org](https://reader034.fdocument.pub/reader034/viewer/2022043006/5f8db70051f5b2295930b202/html5/thumbnails/23.jpg)
④ ③
② ①
local function sum_positive(sum, val) if val > 0 then return sum + val else return sum end end
local function reduce(array, func, initial) local res = initial for i = 1,#array do res = func(res, array[i], i, array) end return res end
reduce({ ... }, sum_positive)
G(type(array) == “table”)G(func == sum_positive)
G(i <= #array)G(type(array[i]) == “number”)G(array[i] > 0)res = res + array[i]i = i + 1 ①
①
③②④
![Page 24: Почему язык Lua — это интересно · Почему язык Lua — это интересно? Ник Заварицкий mejedi@tarantool.org](https://reader034.fdocument.pub/reader034/viewer/2022043006/5f8db70051f5b2295930b202/html5/thumbnails/24.jpg)
G(type(array) == “table”) G(func == sum_positive)
G(i <= #array)G(type(array[i]) == “number”) G(array[i] > 0)res = res + array[i]i = i + 1
JLOOP
Байткод
else (Side Trace)
ветка else
завершение цикла
другая функция
![Page 25: Почему язык Lua — это интересно · Почему язык Lua — это интересно? Ник Заварицкий mejedi@tarantool.org](https://reader034.fdocument.pub/reader034/viewer/2022043006/5f8db70051f5b2295930b202/html5/thumbnails/25.jpg)
Оптимизации
• DCE, CSE, FOLD, ABC, SINK…
•
•
string.format("%04d/%02d/%02d", yy, mm, dd)
sql(“SELECT name FROM users WHERE ID=%1", id)
![Page 26: Почему язык Lua — это интересно · Почему язык Lua — это интересно? Ник Заварицкий mejedi@tarantool.org](https://reader034.fdocument.pub/reader034/viewer/2022043006/5f8db70051f5b2295930b202/html5/thumbnails/26.jpg)
Заключение
• Lua — удобный высокоуровневый язык.
• У нас есть приложения >10000 LOC на Lua.
• LuaJIT очень быстрый.
• Легко встроить.
• При желании, можно влезть внутрь и понять, как это работает.
![Page 27: Почему язык Lua — это интересно · Почему язык Lua — это интересно? Ник Заварицкий mejedi@tarantool.org](https://reader034.fdocument.pub/reader034/viewer/2022043006/5f8db70051f5b2295930b202/html5/thumbnails/27.jpg)
![Page 28: Почему язык Lua — это интересно · Почему язык Lua — это интересно? Ник Заварицкий mejedi@tarantool.org](https://reader034.fdocument.pub/reader034/viewer/2022043006/5f8db70051f5b2295930b202/html5/thumbnails/28.jpg)
Ссылки
http://lua.org
http://luajit.org
http://tarantool.org
https://openresty.org
http://torch.ch
https://luvit.io
https://snabb.co
http://terralang.org