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

Yury Yurevich
Yury YurevichProduct Architect at oDesk
Александр Гладыш
 agladysh@gmail.com
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
Луа хорош для
• Логики, настраиваемой пользователем
• Бизнес-логики
• Высокоуровневой системной логики
Александр Гладыш — Lua
Benevolent Dictators




Prof. Roberto Ierusalimschy




                     Dr. Luiz Henrique de Figueiredo



                                                       Prof. Waldemar Celes
Даты выхода новых версий



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




График из презентации 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 2
luajit.org

• x86, x86_64
• Потрясающая скорость!
• Полная совместимость со стандартом
• Отличия в недокументированном /
  неопределённом поведении
• Почти полная ABI-совместимость
• Beta 4, достаточно стабильный для
  продакшена
Lua 5.1.4 vs. LuaJIT2 beta4
      luajit.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
  end
end
 
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 = 42
if 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, 42
   print(foo and bar or baz) --> 1
   bar = false
   print(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 
Осторожно!

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

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

         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])
end
local 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
Где достать библиотеки?

• LuaRocks
  luarocks.org

• Lua For Windows
  code.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
Некоторые полезные библиотеки

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

• LuaSocket
  bit.ly/luasocket
• LPeg
  bit.ly/lua-lpeg
• Alien
  alien.luaforge.net
Некоторые полезные библиотеки

Web-development

• Kepler Project
  keplerproject.org
• Ещё с десяток вариантов
Некоторые полезные библиотеки

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

• Löve2d — 2D-игры на чистом Lua
  love2d.org
• Большинство игровых движков
Некоторые полезные библиотеки

iPhone / iPad

• Corona SDK (non-free)
  anscamobile.com/corona
• iPhone Wax
  bit.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 Instructions
  http://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
Вопросы?
 agladysh@gmail.com
1 of 70

More Related Content

What's hot(19)

Go для python-программистовGo для python-программистов
Go для python-программистов
Konstantin Cherkasov4.6K views
Введение в Python и DjangoВведение в Python и Django
Введение в Python и Django
Taras Lyapun3.8K views
Functional ProgramingFunctional Programing
Functional Programing
Max Arshinov212 views
Javascript 1Javascript 1
Javascript 1
Andrey Dolinin513 views

Viewers also liked(20)

Contenidos temáticos Contenidos temáticos
Contenidos temáticos
Kelly Johana Ramos Perez297 views
Making Rajasthan Green using Weather Modificatin Technologies Making Rajasthan Green using Weather Modificatin Technologies
Making Rajasthan Green using Weather Modificatin Technologies
Center for Ecological Audit,Social Inclusion and Governance457 views
Arte quimbayaArte quimbaya
Arte quimbaya
ladymami1.8K views
TestTest
Test
youthfulelite3925203 views
KẾ HOẠCH HỌC TẬP (TUẦN 38)KẾ HOẠCH HỌC TẬP (TUẦN 38)
KẾ HOẠCH HỌC TẬP (TUẦN 38)
Trường Cao đẳng Y tế Điện Biên341 views
Webinar2003Webinar2003
Webinar2003
Natalia Odegova4.6K views
SomatprodSomatprod
Somatprod
Carlos306 views
Gabarito vestibular  2_diaGabarito vestibular  2_dia
Gabarito vestibular 2_dia
pepontocom652 views
Netcat - 101 Swiss Army KnifeNetcat - 101 Swiss Army Knife
Netcat - 101 Swiss Army Knife
n|u - The Open Security Community1.9K views
Qualificação (Curta) Julho 2009Qualificação (Curta) Julho 2009
Qualificação (Curta) Julho 2009
Rodrigo Senra322 views
1313
13
Nacho Cisternas161 views
Kghmi default slideKghmi default slide
Kghmi default slide
KGHM267 views
Android SQLiteAndroid SQLite
Android SQLite
Vengat Vasanth368 views
U.S. History Ch. !2U.S. History Ch. !2
U.S. History Ch. !2
Oroville High School696 views

Similar to Александр Гладыш — Lua(20)

Scripting languagesScripting languages
Scripting languages
Lev Panov777 views
SPA инструментыSPA инструменты
SPA инструменты
Roman Dvornov1.8K views
Интегрированная среда разработки для функционального языка RefalИнтегрированная среда разработки для функционального языка Refal
Интегрированная среда разработки для функционального языка Refal
Спецсеминар "Искусственный Интеллект" кафедры АЯ ВМК МГУ638 views
 The basic design of the PHP language The basic design of the PHP language
The basic design of the PHP language
Vladimir Burdaev1.9K views
Локальное окружение на DockerЛокальное окружение на Docker
Локальное окружение на Docker
Михаил Бакулин337 views
C++ STL & Qt. Занятие 11.C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.
Igor Shkulipa349 views
C++ STL & Qt. Занятие 09.C++ STL & Qt. Занятие 09.
C++ STL & Qt. Занятие 09.
Igor Shkulipa176 views
Tarantool, .net, newsqlTarantool, .net, newsql
Tarantool, .net, newsql
Anatoly Popov86 views
About PythonAbout Python
About Python
Yury Yurevich890 views

More from Yury Yurevich(11)

ekb.py: KISS REST APIekb.py: KISS REST API
ekb.py: KISS REST API
Yury Yurevich1.7K views
ekb.py: Mini Zen of Pythonekb.py: Mini Zen of Python
ekb.py: Mini Zen of Python
Yury Yurevich626 views
PyCon UA 2011: Test InfectedPyCon UA 2011: Test Infected
PyCon UA 2011: Test Infected
Yury Yurevich652 views
Decorators' recipesDecorators' recipes
Decorators' recipes
Yury Yurevich847 views
About (unit) testingAbout (unit) testing
About (unit) testing
Yury Yurevich430 views
SQLAlchemy SeminarSQLAlchemy Seminar
SQLAlchemy Seminar
Yury Yurevich1.6K views

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