Upload
yury-yurevich
View
5.659
Download
3
Embed Size (px)
DESCRIPTION
Александр Гладыш рассказывает о достоинствах, особенностях и недостатках Lua, предупреждает о типичных ошибках начинающих Lua-программистов.
Citation preview
Александр Гладыш[email protected]
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
Где можно встретить Lua?
• Adobe Photoshop Lightroom• World of Warcraft и другие игры• Wireshark, Nmap...• Фотоаппараты, клавиатуры, принтеры,
тв-приставки
И много, много где ещё...
Личный опыт
• Пишу на Lua с 2005-го года• Несколько серьёзных проектов, до 160 KLOC Lua• Много мелочи, библиотеки, модули, утилиты...
github.com/agladysh
Луа хорош для
• Логики, настраиваемой пользователем• Бизнес-логики• Высокоуровневой системной логики
Prof. Roberto Ierusalimschy
Prof. Waldemar Celes
Benevolent Dictators
Dr. Luiz Henrique de Figueiredo
Даты выхода новых версий
Число строк кода
График из презентации Small is Beautiful: the design of Lua, Roberto Ierusalimschy
Баланс
Photo by David Allouche (flickr.com)
Lua:
• мощный,• быстрый,• лёгкий,• расширяемый,• встраиваемый
скриптовый язык программирования.
Lua — скриптовый язык программирования
• Виртуальная машина,исполняющая байт-код
• Динамическая типизация• Сборщик мусора
Lua — встраиваемый
• Отличный Plain C API• Великолепная портируемость
Lua — встраиваемый
• Легко сделать Sandbox• Нет Global Interpreter Lock
Интеграция с другими языками
ActionScript 3 Ada Basic C C++ COBOL D Delphi
Erlang Haskell Java Objective-C .Net PHP Pascal
Perl Python Ruby Tcl. . .
Альтернативные реализации
Java .Net LLVM Lua Parrot
LuaJIT
Metalua
Lua — расширяемый
При помощи Lua C API можно легко расширять доступный из
языка функционал
Всё, что можно сделать на Lua, можно сделать при помощи
C API
Lua — лёгкий
• 150 КБ вся библиотека• 100 КБ без компилятора• Минимальное потребление памяти• Луа очень любят embed-щики
А ещё — Lua легко освоить!
Lua — быстрый
shootout.alioth.debian.org
LuaJIT 2luajit.org
• x86, x86_64• Потрясающая скорость!• Полная совместимость со стандартом• Отличия в недокументированном /
неопределённом поведении• Почти полная ABI-совместимость• Beta 4, достаточно стабильный для
продакшена
Lua 5.1.4 vs. LuaJIT2 beta4luajit.org/performance.html
Логарифмическая шкала!
Lua 5.1.4 vs. LuaJIT2 beta4 (interp.)luajit.org/performance.html
Логарифмическая шкала!
Lua — мощный
• Мета-механизмы,а не конкретные решения
• Мультипарадигменный язык
Lua — мощный
• Множественные возвращаемые значения у функций
• Полноценный lexical scoping• Функции — значения
первого класса• Полноценная хвостовая рекурсия• Замыкания• Кооперативная многозадачность• Таблицы
Хвостовая рекурсия
function factorial(x, fac) fac = fac or 1 if x == 1 then return fac else return factorial(x - 1, x * fac) end end
Замыкания
function make_multiplier(coeff) return function(value) return value * coeff endend local x5 = make_multiplier(5)print(x5(10)) --> 50
Кооперативная многозадачность
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
Таблицы
Основное (и единственное!) средство композиции данных
array dictionary set list queue record
...
Объекты
Таблицы: обычный синтаксис
local t = { 1, 2, key = "value" }
t[3] = "three"
print(t[3], t.key) --> three, value
Таблицы: объектный синтаксис
myobj = { a = 5 } function myobj:foo(b) print(self.a + b)end myobj:foo(37) --> 42
Декларативный синтаксис
gui:dialog "Message Box"{ gui:label "Hello, world!" { font_size = 20; }; gui:button "OK" { };}
Метатаблицы
• Наследование / прототипы
• Перегрузка операторов
Тонкие места Lua
Осторожно!
Глобальная видимость переменных по умолчанию
local variable = 42if vareable == 42 then print("Life, the universe, and everything")end
Решения:
• Run-time Global Environment Protection• Статическая валидация кода
Осторожно!
nil и false — ложьВсё остальное — истина
if 0 then print("Ноль — тоже true")end
Осторожно!
"Тернарный оператор"
Связка 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
Осторожно!
Массивы индексируются с единицы
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
Осторожно!
Определение длины таблицы
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).
Осторожно!
Определение длины таблицы
Также влияет на все функции, работающие с таблицами как с линейным массивом.
unpack(), table.concat(), table.insert(), table.remove(), table.sort() и т.п.
Поведение ipairs() отличается!
Осторожно!
Только конструкции вида 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
Осторожно!
Константные строки
-- Медленно: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)
Кстати о строках
В Lua нет нативной поддержки Unicode, но
• Unicode (как и любые бинарные данные)можно спокойно хранить в строках
• Есть сторонние библиотеки для работы со строками в Unicode
Несколько советов
Совет
Когда пишете код на Lua — пишите его на Lua!
Совет
Не плодите без нужды диалекты Lua
Оставьте в покое синтаксис и семантику языка
Совет
Никогда не ставьте патч, добавляющий битовые
операторы!
Модуль bitop — ваш друг
Совет
Не меняйте без нужды стандартные глобальные
пространства имён (string, table, ...)
Заведите свои модули
Совет
Не пользуйтесь без нужды глобальными переменными
Совет
Пишите тесты!
Совет
Не изобретайте сложных обвязок для ООП
Lua — скорее prototype-based,множественное наследование и
проч. чудеса — не нужны
Duck Typing и делегирование — ваши друзья!
Совет
Не используйте сторонние библиотеки для написания
биндингов
Используйте стандартный Lua C API для биндинга своего
кода
Используйте генераторы (например, tolua)
для биндинга больших 3rd-party / legacy API
Совет
Не используйте многоязычные генераторы биндингов
(например, SWIG)
Совет
При написании биндинга
• Минимизируйте поверхность соприкосновения
• Пишите на стороне C, как удобно коду на C
• Потом оберните это в Lua, чтобы было удобно и там
Совет
При дизайне системы
• Максимум кодавыносите в Lua
• Минимум оставляйте написанным на языке со статической типизацией
Любой грамотно написанный модуль на Lua можно заменить
на такой же на C / C++
Организация приложения на Lua
Организация многопоточного приложения на Lua
Где достать библиотеки?
• LuaRocksluarocks.org
• Lua For Windowscode.google.com/p/luaforwindows
Где достать библиотеки?
• 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
Некоторые полезные библиотеки
Общего назначения
• LuaSocketbit.ly/luasocket
• LPegbit.ly/lua-lpeg
• Alienalien.luaforge.net
Некоторые полезные библиотеки
Web-development
• Kepler Projectkeplerproject.org
• Ещё с десяток вариантов
Некоторые полезные библиотеки
Разработка игр
• Löve2d — 2D-игры на чистом Lualove2d.org
• Большинство игровых движков
Некоторые полезные библиотеки
iPhone / iPad
• Corona SDK (non-free)anscamobile.com/corona
• iPhone Waxbit.ly/iphone-wax
IDE
• Любой "программерский" редактор• Decoda (non-free, Windows-only)
unknownworlds.com/decoda/• LuaEclipse 2.0 (unstable)
github.com/KINFOO/LuaEclipse
Что читать?
Must read
• Lua 5.1 Reference Manual lua.org/manual/5.1
• Programming in Lua 2nd edition www.inf.puc-rio.br/~roberto/pil2
Что читать?
Рекомендую прочесть
• Lua Programming Gems lua.org/gems
• Lua Unofficial FAQ batbytes.com/luafaq
Что читать?
Для углублённого изучения
• 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
Хотите знать больше?
• 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
Вопросы[email protected]