Lua
|  | |
| Парадигма: | мульти-парадигмова: скриптова, імперативна, функціональна, об'єктно-орієнтована, прототипна | 
|---|---|
| Система типізації: | динамічна, слаба, качина | 
| Основні реалізації: | Lua, LuaJIT, LLVM-Lua, LuaCLR, Nua, Lua Alchemy | 
| Діалекти: | Metalua | 
| Вплинула на: | Io, GameMonkey, Squirrel, Falcon, Dao, MiniD | 
| Сторінка інтернет: | website | 
Lua ([лу́а], порт. місяць) — швидка і компактна скриптова мова програмування, розроблена підрозділом Tecgraf Католицького університету Ріо-де-Жанейро (Computer Graphics Technology Group of Pontifical Catholic University of Rio de Janeiro in Brazil). Є вільно-поширюваною, з відкритим сирцевим кодом на мові Сі.
За можливостями, ідеологією і реалізацією, мова найближча до JavaScript, проте Lua відрізняється могутнішими і набагато гнучкішими конструкціями, спроектованими з метою «не плодити сутності понад необхідне». Хоча Lua не містить поняття класу і об'єкта в явному вигляді, механізми об'єктно-орієнтованого програмування з підтримкою прототипів (включаючи множинне успадкування) легко реалізуються з використанням метатаблиць, які також дозволяють перевантаження операцій, тощо. Реалізована модель ООП (як і в JavaScript) — прототипна.
Lua отримала велике поширення в ролі вбудованої в інші проекти мови сценаріїв (наприклад, для визначення конфігурації або для написання розширень). Lua комбінує простий процедурний синтаксис з потужними можливостями опису даних через використання асоціативних масивів і розширюваної семантики мови. У Lua використовується динамічна типізація, мовні конструкції перетворюються на байт-код, який виконується поверх регістрової віртуальної машини з автоматичним збирачем сміття. Сам інтерпретатор оформлений у вигляді бібліотеки, легко інтегрованої в проекти на мовах Сі та Сі++. Код інтерпретатора Lua написаний на мові Сі і розповсюджується під ліцензією MIT.
Зміст
 1 Історія
 2 Реалізація
 3 Приклади коду
 4 Типи даних
 4.1 nil
 4.2 Логічні значення
 4.3 Числа
 4.4 Рядки
 4.5 Таблиці
 4.6 Функції
 4.7 Потоки
 4.8 userdata
 
 5 Використання
 5.1 Ігри
 5.2 Lua у Вікіпедії
 
 6 Виноски
 7 Посилання
Історія | 
Створення мови почалося в 1993. Команда розробників з католицького університету Ріо-де-Жанейро невелика — Роберто Єрусалимський (Roberto Ierusalimschy), Вольдемар Целес (Waldemar Celes) і Луіс Енріке (Luiz Henrique). Спочатку мова замислювалася як описова — для зручності формування великих масивів даних при рішенні завдань обчислювального експерименту і машинного моделювання. Але відтоді мова зазнала значних змін і низки серйозних архітектурних модифікацій. Сьогоднішня популярність Lua така, що Microsoft виділила розробникам грант на створення .NET-версії мови. У багатьох іграх Lua використовується як «скриптовий рушій» завдяки унікальному поєднанню швидкодії, легкості вбудовування в програми і підтримці «розширюваної семантики».
Реалізація | 
Як і багато інтерпретованих мов програмування, реалізація Lua має окремо компілятор з сирцевого коду у виконуваний байт-код і віртуальну машину для виконання згенерованого байт-коду. Причому байт-код — це не команди стекової машини, а команди якогось віртуального процесора з кількома регістрами, що підвищує ефективність виконання. У стандартній віртуальній машині Lua використовується розподіл пам'яті із прибиранням сміття (аналогічно Java або .NET).
Для завдань, критичних за часом, є JIT-компілятор Lua LuaJIT.
Lua використовує єдиний рядковий пул, що дозволяє зменшити витрати пам'яті на зберігання рядків.
Приклади коду | 
Класичну програму Hello, world! (Вітаю, світе!) можна написати так:
 print("Вітаю, світе!")
Цикл з лічильником та кроком в одиницю:
for i = 1 , 10 do
 print( i )
end
В результаті будуть виведені числа від 1 до 10.
Для зміни кроку в циклі треба вказати крок третім параметром:
for i = 1 , 10 , 2 do -- тепер крок циклу дорівнює 2
 print( i )
end
В результаті будуть виведені числа від 1, 3, 5, 7 , 9.
Підрахунок факторіалу дає приклад використання рекурсивних функцій:
function factorial(n)
 if n == 0 then
 return 1 -- Коментар в Lua починається з подвійного дефіса
 else
 return n * factorial(n - 1) -- і закінчується на кінці рядка
 end
end 
function factorial2(n) -- коротший еквівалент написаного вище
 return n==0 and 1 or n*factorial2(n - 1)
end
 
print([[multiple
 lines]]) -- [[кількарядковий вираз чи коментар треба
 поміщати в подвійні квадратні дужки]]
Типи даних | 
В Lua є вісім типів даних: nil (невизначені значення), boolean (логічні значення), number (числа), string (рядки), table (таблиці), function (функції), thread (потоки) та userdata. Дізнатись тип змінної можна за допомогою функції type().
nil | 
nil — це порожнє значення. Його головні властивості — відрізнятись від будь-якого значення та вказувати на відсутність значення, придатного для якого-небудь використання. Також nil може бути використаним як логічне значення, в такому разі він позначатиме неправду.
Логічні значення | 
Логічний тип boolean містить два значення: true (правда) та false (неправда). 
Числа | 
Числовий тип в Lua зазвичай представлений дійсними числами з плаваючою крапкою з подвійною точністю, хоча можна зібрати Lua з іншими числами, змінивши визначення в luaconf.h.
Рядки | 
Рядки в Lua можуть включати в себе будь-який восьмибітний символ. Щоб створити рядковий літерал, вміст рядка потрібно помістити в одинарні (') або подвійні (") лапки. Також можна використовувати рядки з переносами. Для цього використовуються подвійні квадратні дужки n-ного рівня (де [[ — дужки нульового рівня, [=[ — дужки першого рівня, [==[ — дужки другого рівня, і т. д.). Для прикладу, використаємо дужки третього рівня:
 a = [===[рядки
з
переносом
в
"lua"]===]
Можна помітити, що в літералах, створених таким чином, не потрібно екранувати одинарні та подвійні лапки, як це потрібно робити при інших видах запису.
Таблиці | 
Таблиці є найважливішим типом даних в Lua і є основою для типів даних користувача, таких як структури, масиви, списки, множини. Таблиця в Lua являє собою набір пар -- (Ключ, Значення). Ключем може бути будь-яке значення окрім nil.
Таблиці не мають фіксованого розміру. Тому можна додавати скільки завгодно елементів в таблицю динамічно.
Приклад таблиці: 
t = -- пуста таблиця
t['k'] = 10 -- Ключ k, значення 10
t[20] = " super " -- Ключ 20, значення " super "
t.IP = '192.168.0.1' -- Ключ IP, значення 192.168.0.1 
Тепер заповнена таблиця буде виглядати так:
t = 
 k = 10 , 
 [ 20 ] = " super ",
 IP = ' 192.168.0.1 '
Одинарні та подвійні лапки в Lua -- рівнозначні. Варто вибрати один із видів лапок при написанні коду. 
Для виводу пар -- (Ключ, Значення) з таблиці на екран скористайтесь циклом for, базовою функцією pairs() та функцією print(): 
for key, val in pairs(t) do
 print(key, val)
end
В результаті отримаємо пари: 
20    super 
k    10
IP    192.168.0.1
Таблиці можна використовувати і як звичайні масиви. Для цього варто скористатись записом t = 'a', 'b', 'c', 'd', 'e', після чого до елементів можна звертатись за індексом: print(t[2]) --виведе b. Зверніть увагу, що створені таким чином масиви, починаються з одиниці, а не з нуля, як в більшості інших мов.
Функції | 
Функції в Lua є значеннями першого класу, що означає, що функції можна передавати до інших функцій, повертати з них та використовувати замикання. Функції можуть повертати будь-яку кількість значень. Також функцію можна викликати з будь-якою кількістю параметрів: зайві будуть ігноруватись, а тим, яких не вистачає, буде присвоєно значення nil.
Потоки | 
Тип thread позначає незалежний потік виконання. Потоки Lua не варто асоціювати з потоками операційної системи, багатопоточна програма може виконуватись навіть в тих системах, які не підтримують потоки.
userdata | 
Тип userdata використовується для роботи з даними з мови C. В нього немає визначених наперед операцій, проте їх можна визначити за допомогою метатаблиць. Також значення цього типу не можуть бути ні створені, ні змінені з Lua, для цього потрібно використовувати C API.
Використання | 
Ігри | 
- Garry's Mod
- Teeworlds
- Diablo III
- S.T.A.L.K.E.R.: Shadow of Chernobyl
- S.T.A.L.K.E.R.: Clear Sky
- S.T.A.L.K.E.R.: Call of Pripyat
- World of Warcraft
- Ragnarok Online
- Multi Theft Auto
Lua у Вікіпедії | 
У січні 2012 на зустрічі розробників[1] вікі-рушія MediaWiki, котрий використовується для забезпечення роботи Вікіпедії, було прийнято рішення[2][3] про залучення мови Lua для розробки шаблонів. Використовувана на той час система шаблонів не влаштовує розробників через зайву ускладненість та низьку ефективність. Інтеграція Lua в MediaWiki почалася не раніше травня 2012, після виходу релізу MediaWiki 1.19 та міграції проекту на систему управління сирцевими текстами Git.
Шаблони дозволяють користувачам MediaWiki автоматизувати створення типового вмісту, що включається в інші сторінки, і створювати інструменти для маніпуляції даними, перетворюючи вікі-текст в якусь подобу мови програмування. Наразі шаблони для MediaWiki створюються з використанням додаткової wiki-розмітки і розширення ParserFunctions, що створює істотні обмеження на функціональність і призводить до витрат значних ресурсів при виконанні. Намір перейти до використання в шаблонах повноцінної мови програмування назрів уже давно, але виникла проблема вибору: розгорнулася палка дискусія між прихильниками Javascript/WikiScript і Lua.
У підсумку перемогла Lua, головним чином завдяки технічно простішій інтеграції в проект. Серед інших переваг було названо: ефективна робота з пам'яттю, висока продуктивність (застосовується JIT-компіляція, що робить Lua швидшою за PHP з використанням Zend), компактність і початкова орієнтація на ефективне вбудовування в сторонні застосунки. Робота над експериментальним прототипом на базі Lua почалася в 2011 році і показала, що можна істотно збільшити продуктивність системи шаблонів.
Виноски | 
 ↑ Lua scripting/Meeting 2012-01-25
 ↑ Mailing List Archive: Wikipedia: Wikitech Moving forward with Lua
 ↑ Wikipedia будет использовать Lua в качестве языка для разработки шаблонов. opennet.ru (ru).
Посилання | 
 Офіційний сайт(англ.)
 Завантажити Lua (скомпільовані файли)(англ.)
 Цикл статей про Lua в журналі Linux Format(рос.)
 Список додатків, що використовують Lua, складений авторами (англ.)
 Веб-сайт спільноти користувачів і авторів Lua(англ.)
 Lua-wiki(англ.)
 lua-l archive — офіційний список (англ.)
 Luai — альтернативний інтерфейс довідки (англ.)
 Introducing Lua // ONLamp.com (англ.)
 An Introduction to Lua // GameDev.net (англ.)
 Interview with Roberto Ierusalimschy on Lua [недоступне посилання з 07.06.2017] // Computerworld (англ.)
| 
 | 
| 
 | ||||||||||||||||||||||||||||||||||||||||
| 
 | |||||||||||||||||||||||||||||




 Портал «Програмування»
  Портал «Програмування»