Your SlideShare is downloading. ×
Александр Гладыш — Lua
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

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

4,484
views

Published on

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

Александр Гладыш рассказывает о достоинствах, особенностях и недостатках 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
4,484
On Slideshare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
21
Comments
6
Likes
9
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

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