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

5,380 views

Published on

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

6 Comments
9 Likes
Statistics
Notes
  • Хрень на 38-м слайде:

    local a, b, c = false, 1, 2 print(a anb b or c) --2

    По крайней мере в 5.2 и без всяких криводжитов.

    И вообще, лучше писать ((a and b) or c), а умничать на более высоком уровне.
    --
    слайд 62: верный адрес 'https://kepler-project.org/'
    --
    А также, спасибо за вклад в популяризацию этого прекрасного в своей простоте и выразительности языка.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • @Arhn Про VCClua, к сожалению, ничего не могу сказать. Рекомендую задать вопрос на stackoverflow.com.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Здравствуйте. Меня очень заинтересовала Ваша презентация. Мне очень понравился этот скриптовый язык программирования своей легкостью и пониманием, но я только начинаю его изучать и сталкнулся с некоторыми проблемами. Может Вы сможете мне помочь?
    А не получается вот что:
    я сделал таблицу (использовал VCLua StringGrid), но ни как не могу задать тип столбца (например CheckBox, DateEdit, Button и т.д.) и его редактируемость (т.е. я вывожу данные в ячейки, но ни как не могу их отредактировать).
    Так же очень интересует реализация Drag and Drop данных в ячейках. Буду Вам и всем кто сможет мне помочь безмерно благодарен если мне объяснят (здесь или bonpoc888@gmail.com) как это можно реализовать. Возможно ли это вообще? Может это как-то по другому реализуется?
    Спасибо.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Пока чинят, вот ссылка на PDF: http://bit.ly/aElNPs
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Интересно, что Download отдаёт какую-то левую презентацию. Может баг в slideshare зарепортить?
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
5,380
On SlideShare
0
From Embeds
0
Number of Embeds
139
Actions
Shares
0
Downloads
25
Comments
6
Likes
9
Embeds 0
No embeds

No notes for slide

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

  1. 1. Александр Гладыш agladysh@gmail.com
  2. 2. Lua: • мощный, • быстрый, • лёгкий, • расширяемый, • встраиваемый скриптовый язык программирования.
  3. 3. 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
  4. 4. Где можно встретить Lua? • Adobe Photoshop Lightroom • World of Warcraft и другие игры • Wireshark, Nmap... • Фотоаппараты, клавиатуры, принтеры, тв-приставки И много, много где ещё...
  5. 5. Личный опыт • Пишу на Lua с 2005-го года • Несколько серьёзных проектов, до 160 KLOC Lua • Много мелочи, библиотеки, модули, утилиты... github.com/agladysh
  6. 6. Луа хорош для • Логики, настраиваемой пользователем • Бизнес-логики • Высокоуровневой системной логики
  7. 7. Benevolent Dictators Prof. Roberto Ierusalimschy Dr. Luiz Henrique de Figueiredo Prof. Waldemar Celes
  8. 8. Даты выхода новых версий Число строк кода График из презентации Small is Beautiful: the design of Lua, Roberto Ierusalimschy
  9. 9. Photo by David Allouche (flickr.com) Баланс
  10. 10. Lua: • мощный, • быстрый, • лёгкий, • расширяемый, • встраиваемый скриптовый язык программирования.
  11. 11. Lua — скриптовый язык программирования • Виртуальная машина, исполняющая байт-код • Динамическая типизация • Сборщик мусора
  12. 12. Lua — встраиваемый • Отличный Plain C API • Великолепная портируемость
  13. 13. Lua — встраиваемый • Легко сделать Sandbox • Нет Global Interpreter Lock
  14. 14. Интеграция с другими языками ActionScript 3 Ada Basic C C++ COBOL D Delphi Erlang Haskell Java Objective-C .Net PHP Pascal Perl Python Ruby Tcl ...
  15. 15. Альтернативные реализации Java .Net LLVM Lua Parrot LuaJIT Metalua
  16. 16. Lua — расширяемый При помощи Lua C API можно легко расширять доступный из языка функционал Всё, что можно сделать на Lua, можно сделать при помощи C API
  17. 17. Lua — лёгкий • 150 КБ вся библиотека • 100 КБ без компилятора • Минимальное потребление памяти • Луа очень любят embed-щики
  18. 18. А ещё — Lua легко освоить!
  19. 19. Lua — быстрый
  20. 20. shootout.alioth.debian.org
  21. 21. LuaJIT 2 luajit.org • x86, x86_64 • Потрясающая скорость! • Полная совместимость со стандартом • Отличия в недокументированном / неопределённом поведении • Почти полная ABI-совместимость • Beta 4, достаточно стабильный для продакшена
  22. 22. Lua 5.1.4 vs. LuaJIT2 beta4 luajit.org/performance.html Логарифмическая шкала!
  23. 23. Lua 5.1.4 vs. LuaJIT2 beta4 (interp.) luajit.org/performance.html Логарифмическая шкала!
  24. 24. Lua — мощный • Мета-механизмы, а не конкретные решения • Мультипарадигменный язык
  25. 25. Lua — мощный • Множественные возвращаемые значения у функций • Полноценный lexical scoping • Функции — значения первого класса • Полноценная хвостовая рекурсия • Замыкания • Кооперативная многозадачность • Таблицы
  26. 26. Хвостовая рекурсия function factorial(x, fac) fac = fac or 1 if x == 1 then return fac else return factorial(x - 1, x * fac) end end
  27. 27. Замыкания function make_multiplier(coeff)   return function(value)     return value * coeff   end end   local x5 = make_multiplier(5) print(x5(10)) --> 50
  28. 28. Кооперативная многозадачность 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
  29. 29. Таблицы Основное (и единственное!) средство композиции данных array dictionary set list queue record ... Объекты
  30. 30. Таблицы: обычный синтаксис local t = { 1, 2, key = "value" } t[3] = "three" print(t[3], t.key) --> three, value
  31. 31. Таблицы: объектный синтаксис myobj = { a = 5 } function myobj:foo(b) print(self.a + b) end myobj:foo(37) --> 42
  32. 32. Декларативный синтаксис gui:dialog  "Message Box" {  gui:label  "Hello, world!"    {      font_size  = 20;   };   gui:button  "OK" { }; }
  33. 33. Метатаблицы • Наследование / прототипы • Перегрузка операторов
  34. 34. Тонкие места Lua
  35. 35. Осторожно! Глобальная видимость переменных по умолчанию local variable = 42 if vareable == 42 then print("Life, the universe, and everything") end Решения: • Run-time Global Environment Protection • Статическая валидация кода
  36. 36. Осторожно! nil и false — ложь Всё остальное — истина if 0 then print("Ноль — тоже true") end
  37. 37. Осторожно! "Тернарный оператор" Связка 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
  38. 38. Осторожно! Массивы индексируются с единицы 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
  39. 39. Осторожно! Определение длины таблицы 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 
  40. 40. Осторожно! Определение длины таблицы Также влияет на все функции, работающие с таблицами как с линейным массивом. unpack(), table.concat(), table.insert(), table.remove(), table.sort() и т.п. Поведение ipairs() отличается!
  41. 41. Осторожно! Только конструкции вида 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
  42. 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)
  43. 43. Кстати о строках В Lua нет нативной поддержки Unicode, но • Unicode (как и любые бинарные данные) можно спокойно хранить в строках • Есть сторонние библиотеки для работы со строками в Unicode
  44. 44. Несколько советов
  45. 45. Совет Когда пишете код на Lua — пишите его на Lua!
  46. 46. Совет Не плодите без нужды диалекты Lua Оставьте в покое синтаксис и семантику языка
  47. 47. Совет Никогда не ставьте патч, добавляющий битовые операторы! Модуль bitop — ваш друг
  48. 48. Совет Не меняйте без нужды стандартные глобальные пространства имён (string, table, ...) Заведите свои модули
  49. 49. Совет Не пользуйтесь без нужды глобальными переменными
  50. 50. Совет Пишите тесты!
  51. 51. Совет Не изобретайте сложных обвязок для ООП Lua — скорее prototype-based, множественное наследование и проч. чудеса — не нужны Duck Typing и делегирование — ваши друзья!
  52. 52. Совет Не используйте сторонние библиотеки для написания биндингов Используйте стандартный Lua C API для биндинга своего кода Используйте генераторы (например, tolua) для биндинга больших 3rd-party / legacy API
  53. 53. Совет Не используйте многоязычные генераторы биндингов (например, SWIG)
  54. 54. Совет При написании биндинга • Минимизируйте поверхность соприкосновения • Пишите на стороне C, как удобно коду на C • Потом оберните это в Lua, чтобы было удобно и там
  55. 55. Совет При дизайне системы • Максимум кода выносите в Lua • Минимум оставляйте написанным на языке со статической типизацией Любой грамотно написанный модуль на Lua можно заменить на такой же на C / C++
  56. 56. Организация приложения на Lua
  57. 57. Организация многопоточного приложения на Lua
  58. 58. Где достать библиотеки? • LuaRocks luarocks.org • Lua For Windows code.google.com/p/luaforwindows
  59. 59. Где достать библиотеки? • 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
  60. 60. Некоторые полезные библиотеки Общего назначения • LuaSocket bit.ly/luasocket • LPeg bit.ly/lua-lpeg • Alien alien.luaforge.net
  61. 61. Некоторые полезные библиотеки Web-development • Kepler Project keplerproject.org • Ещё с десяток вариантов
  62. 62. Некоторые полезные библиотеки Разработка игр • Löve2d — 2D-игры на чистом Lua love2d.org • Большинство игровых движков
  63. 63. Некоторые полезные библиотеки iPhone / iPad • Corona SDK (non-free) anscamobile.com/corona • iPhone Wax bit.ly/iphone-wax
  64. 64. IDE • Любой "программерский" редактор • Decoda (non-free, Windows-only) unknownworlds.com/decoda/ • LuaEclipse 2.0 (unstable) github.com/KINFOO/LuaEclipse
  65. 65. Что читать? Must read • Lua 5.1 Reference Manual lua.org/manual/5.1 • Programming in Lua 2nd edition www.inf.puc-rio.br/~roberto/pil2
  66. 66. Что читать? Рекомендую прочесть • Lua Programming Gems lua.org/gems • Lua Unofficial FAQ batbytes.com/luafaq
  67. 67. Что читать? Для углублённого изучения • 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
  68. 68. Хотите знать больше? • 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
  69. 69. Вопросы? agladysh@gmail.com

×