70
Александр Гладыш [email protected]

Александр Гладыш — Lua

Embed Size (px)

DESCRIPTION

Александр Гладыш рассказывает о достоинствах, особенностях и недостатках Lua, предупреждает о типичных ошибках начинающих Lua-программистов.

Citation preview

Page 1: Александр Гладыш — Lua

Александр Гладыш[email protected]

Page 2: Александр Гладыш — Lua

Lua:

• мощный,• быстрый,• лёгкий,• расширяемый,• встраиваемый

скриптовый язык программирования.

Page 3: Александр Гладыш — Lua

function generatefib (n)     return coroutine.wrap(function ()         local a, b = 1, 1         while a <= n do             coroutine.yield(a)             a, b = b, a + b         end     end) end 

for i in generatefib(1000) do     print(i) end

Page 4: Александр Гладыш — Lua

Где можно встретить Lua?

• Adobe Photoshop Lightroom• World of Warcraft и другие игры• Wireshark, Nmap...• Фотоаппараты, клавиатуры, принтеры,

тв-приставки

И много, много где ещё...

Page 5: Александр Гладыш — Lua

Личный опыт

• Пишу на Lua с 2005-го года• Несколько серьёзных проектов, до 160 KLOC Lua• Много мелочи, библиотеки, модули, утилиты...

github.com/agladysh

Page 6: Александр Гладыш — Lua

Луа хорош для

• Логики, настраиваемой пользователем• Бизнес-логики• Высокоуровневой системной логики

Page 7: Александр Гладыш — Lua
Page 8: Александр Гладыш — Lua

Prof. Roberto Ierusalimschy

Prof. Waldemar Celes

Benevolent Dictators

Dr. Luiz Henrique de Figueiredo

Page 9: Александр Гладыш — Lua

Даты выхода новых версий

Число строк кода

График из презентации Small is Beautiful: the design of Lua, Roberto Ierusalimschy

Page 10: Александр Гладыш — Lua

Баланс

Photo by David Allouche (flickr.com)

Page 11: Александр Гладыш — Lua

Lua:

• мощный,• быстрый,• лёгкий,• расширяемый,• встраиваемый

скриптовый язык программирования.

Page 12: Александр Гладыш — Lua

Lua — скриптовый язык программирования

• Виртуальная машина,исполняющая байт-код

• Динамическая типизация• Сборщик мусора

Page 13: Александр Гладыш — Lua

Lua — встраиваемый

• Отличный Plain C API• Великолепная портируемость

Page 14: Александр Гладыш — Lua

Lua — встраиваемый

• Легко сделать Sandbox• Нет Global Interpreter Lock

Page 15: Александр Гладыш — Lua

Интеграция с другими языками

ActionScript 3 Ada Basic C C++ COBOL D Delphi

Erlang Haskell Java Objective-C .Net PHP Pascal

Perl Python Ruby Tcl. . .

Page 16: Александр Гладыш — Lua

Альтернативные реализации

Java .Net LLVM Lua Parrot

LuaJIT

Metalua

Page 17: Александр Гладыш — Lua

Lua — расширяемый

При помощи Lua C API можно легко расширять доступный из

языка функционал

Всё, что можно сделать на Lua, можно сделать при помощи

C API

Page 18: Александр Гладыш — Lua

Lua — лёгкий

• 150 КБ вся библиотека• 100 КБ без компилятора• Минимальное потребление памяти• Луа очень любят embed-щики

Page 19: Александр Гладыш — Lua

А ещё — Lua легко освоить!

Page 20: Александр Гладыш — Lua

Lua — быстрый

Page 21: Александр Гладыш — Lua

shootout.alioth.debian.org

Page 22: Александр Гладыш — Lua

LuaJIT 2luajit.org

• x86, x86_64• Потрясающая скорость!• Полная совместимость со стандартом• Отличия в недокументированном /

неопределённом поведении• Почти полная ABI-совместимость• Beta 4, достаточно стабильный для

продакшена

Page 23: Александр Гладыш — Lua

Lua 5.1.4 vs. LuaJIT2 beta4luajit.org/performance.html

Логарифмическая шкала!

Page 24: Александр Гладыш — Lua

Lua 5.1.4 vs. LuaJIT2 beta4 (interp.)luajit.org/performance.html

Логарифмическая шкала!

Page 25: Александр Гладыш — Lua

Lua — мощный

• Мета-механизмы,а не конкретные решения

• Мультипарадигменный язык

Page 26: Александр Гладыш — Lua

Lua — мощный

• Множественные возвращаемые значения у функций

• Полноценный lexical scoping• Функции — значения

первого класса• Полноценная хвостовая рекурсия• Замыкания• Кооперативная многозадачность• Таблицы

Page 27: Александр Гладыш — Lua

Хвостовая рекурсия

function factorial(x, fac)     fac = fac or 1     if x == 1 then         return fac     else         return factorial(x - 1, x * fac)     end end

Page 28: Александр Гладыш — Lua

Замыкания

function make_multiplier(coeff)  return function(value)    return value * coeff  endend local x5 = make_multiplier(5)print(x5(10)) --> 50

Page 29: Александр Гладыш — Lua

Кооперативная многозадачность

function generatefib (n)  return coroutine.wrap(function ()  local a, b = 1, 1  while a <= n do             coroutine.yield(a)             a, b = b, a + b  end  end) end 

for i in generatefib(1000) do     print(i) end

Page 30: Александр Гладыш — Lua

Таблицы

Основное (и единственное!) средство композиции данных

array dictionary set list queue record

...

Объекты

Page 31: Александр Гладыш — Lua

Таблицы: обычный синтаксис

local t = { 1, 2, key = "value" }

t[3] = "three"

print(t[3], t.key) --> three, value

Page 32: Александр Гладыш — Lua

Таблицы: объектный синтаксис

myobj = { a = 5 } function myobj:foo(b) print(self.a + b)end myobj:foo(37) --> 42

Page 33: Александр Гладыш — Lua

Декларативный синтаксис

gui:dialog  "Message Box"{ gui:label  "Hello, world!"   {     font_size  = 20;  };  gui:button  "OK" { };}

Page 34: Александр Гладыш — Lua

Метатаблицы

• Наследование / прототипы

• Перегрузка операторов

Page 35: Александр Гладыш — Lua

Тонкие места Lua

Page 36: Александр Гладыш — Lua

Осторожно!

Глобальная видимость переменных по умолчанию

local variable = 42if vareable == 42 then print("Life, the universe, and everything")end

Решения:

• Run-time Global Environment Protection• Статическая валидация кода

Page 37: Александр Гладыш — Lua

Осторожно!

nil и false — ложьВсё остальное — истина

if 0 then print("Ноль — тоже true")end

Page 38: Александр Гладыш — Lua

Осторожно!

"Тернарный оператор"

Связка a and b or c не полностью эквивалентна (a) ? b : c

local foo, bar, baz = false, 1, 42print(foo and bar or baz) --> 1bar = falseprint(foo and bar or baz) --> 42

Page 39: Александр Гладыш — Lua

Осторожно!

Массивы индексируются с единицы

local a = { [0] = 0, [1] = 1 } for i, v in ipairs(a) do

print(i, "=>", v) end --> 1 => 1

for k, v in ipairs(a) do print(k, "=>", v)

end --> 1 => 1 --> 0 => 0

Page 40: Александр Гладыш — Lua

Осторожно!

Определение длины таблицы

print( #{ 1, 2, nil, 4 } )

The length of a table t is defined to be any integer index n such that t[n] is not nil and t[n+1] is nil; moreover, if t[1] is nil, n can be zero. 

For a regular array, with non-nil values from 1 to a given n, its length is exactly that n, the index of its last value. 

If the array has "holes" (that is, nil values between other non-nil values), then #t can be any of the indices that directly precedes a nil value (that is, it may consider any such nil value as the end of the array).

Page 41: Александр Гладыш — Lua

Осторожно!

Определение длины таблицы

Также влияет на все функции, работающие с таблицами как с линейным массивом.

unpack(), table.concat(), table.insert(), table.remove(), table.sort() и т.п.

Поведение ipairs() отличается!

Page 42: Александр Гладыш — Lua

Осторожно!

Только конструкции вида return g(x) — хвостовая рекурсия

Эта — да:

return x[i].foo(x[j] + a * b, i + j)

Эти — нет:

g(x); return

return g(x) + 1

return x or g(x)

return (g(x))

return g(x), 42

Page 43: Александр Гладыш — Lua

Осторожно!

Константные строки

-- Медленно:local s = ""for i = 1, #large_array do s = s .. f(large_array[i])end

-- Быстро:local t = { }for i = 1, #large_array do t[#t + 1] = f(large_array[i])endlocal s = table.concat(t)

Page 44: Александр Гладыш — Lua

Кстати о строках

В Lua нет нативной поддержки Unicode, но

• Unicode (как и любые бинарные данные)можно спокойно хранить в строках

• Есть сторонние библиотеки для работы со строками в Unicode

Page 45: Александр Гладыш — Lua

Несколько советов

Page 46: Александр Гладыш — Lua

Совет

Когда пишете код на Lua — пишите его на Lua!

Page 47: Александр Гладыш — Lua

Совет

Не плодите без нужды диалекты Lua

Оставьте в покое синтаксис и семантику языка

Page 48: Александр Гладыш — Lua

Совет

Никогда не ставьте патч, добавляющий битовые

операторы!

Модуль bitop — ваш друг

Page 49: Александр Гладыш — Lua

Совет

Не меняйте без нужды стандартные глобальные

пространства имён (string, table, ...)

Заведите свои модули

Page 50: Александр Гладыш — Lua

Совет

Не пользуйтесь без нужды глобальными переменными

Page 51: Александр Гладыш — Lua

Совет

Пишите тесты!

Page 52: Александр Гладыш — Lua

Совет

Не изобретайте сложных обвязок для ООП

Lua — скорее prototype-based,множественное наследование и

проч. чудеса — не нужны

Duck Typing и делегирование — ваши друзья!

Page 53: Александр Гладыш — Lua

Совет

Не используйте сторонние библиотеки для написания

биндингов

Используйте стандартный Lua C API для биндинга своего

кода

Используйте генераторы (например, tolua)

для биндинга больших 3rd-party / legacy API

Page 54: Александр Гладыш — Lua

Совет

Не используйте многоязычные генераторы биндингов

(например, SWIG)

Page 55: Александр Гладыш — Lua

Совет

При написании биндинга

• Минимизируйте поверхность соприкосновения

• Пишите на стороне C, как удобно коду на C

• Потом оберните это в Lua, чтобы было удобно и там

Page 56: Александр Гладыш — Lua

Совет

При дизайне системы

• Максимум кодавыносите в Lua

• Минимум оставляйте написанным на языке со статической типизацией

Любой грамотно написанный модуль на Lua можно заменить

на такой же на C / C++

Page 57: Александр Гладыш — Lua

Организация приложения на Lua

Page 58: Александр Гладыш — Lua

Организация многопоточного приложения на Lua

Page 59: Александр Гладыш — Lua

Где достать библиотеки?

• LuaRocksluarocks.org

• Lua For Windowscode.google.com/p/luaforwindows

Page 60: Александр Гладыш — Lua

Где достать библиотеки?

• Google.com• LuaForge.org• LHF's Libraries and Tools for Lua

www.tecgraf.puc-rio.br/~lhf/ftp/lua• GitHub.com• Code.Google.com• SourceForge.org

Page 61: Александр Гладыш — Lua

Некоторые полезные библиотеки

Общего назначения

• LuaSocketbit.ly/luasocket

• LPegbit.ly/lua-lpeg

• Alienalien.luaforge.net

Page 62: Александр Гладыш — Lua

Некоторые полезные библиотеки

Web-development

• Kepler Projectkeplerproject.org

• Ещё с десяток вариантов

Page 63: Александр Гладыш — Lua

Некоторые полезные библиотеки

Разработка игр

• Löve2d — 2D-игры на чистом Lualove2d.org

• Большинство игровых движков

Page 64: Александр Гладыш — Lua

Некоторые полезные библиотеки

iPhone / iPad

• Corona SDK (non-free)anscamobile.com/corona

• iPhone Waxbit.ly/iphone-wax

Page 65: Александр Гладыш — Lua

IDE

• Любой "программерский" редактор• Decoda (non-free, Windows-only)

unknownworlds.com/decoda/• LuaEclipse 2.0 (unstable)

github.com/KINFOO/LuaEclipse

Page 66: Александр Гладыш — Lua

Что читать?

Must read

• Lua 5.1 Reference Manual lua.org/manual/5.1

• Programming in Lua 2nd edition www.inf.puc-rio.br/~roberto/pil2

Page 67: Александр Гладыш — Lua

Что читать?

Рекомендую прочесть

• Lua Programming Gems lua.org/gems

• Lua Unofficial FAQ batbytes.com/luafaq

Page 68: Александр Гладыш — Lua

Что читать?

Для углублённого изучения

• The implementation of Lua 5.0 lua.org/doc/jucs05.pdf

• The evolution of Lua lua.org/doc/hopl.pdf

• A No-Frills Introduction to Lua 5.1 VM Instructionshttp://bit.ly/no-frills

Page 69: Александр Гладыш — Lua

Хотите знать больше?

• Lua.org (Lua.ru)• Lua Users Wiki

lua-users.org/wiki• Lua Mailing List

lua.org/lua-l.html• StackOverflow

stackoverflow.com/questions/tagged/Lua• IRC

#lua at irc.freenode.net

Page 70: Александр Гладыш — Lua

Вопросы[email protected]