Lua

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук
Lua
Lua-logo-nolabel.svg
Парадигма: мульти-парадигмова: скриптова, імперативна, функціональна, об'єктно-орієнтована, прототипна
Дата появи: 1993
Творці: Roberto Ierusalimschy
Waldemar Celes
Luiz Henrique de Figueiredo
Останній реліз: 5.2 (16 грудня 2011; 1074 дні тому)
Система типізації: динамічна, слаба, качина
Основні реалізації: Lua, LuaJIT, LLVM-Lua, LuaCLR, Nua, Lua Alchemy
Діалекти: Metalua
Під впливом від: Scheme, SNOBOL, Modula, CLU, C++
Вплинула на: Io, GameMonkey, Squirrel, Falcon, Dao, MiniD
ОС: Крос-платформовий
Ліцензія: Ліцензія MIT
Сторінка інтернет: www.lua.org

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.

Історія[ред.ред. код]

Створення мови почалося в 1993. Команда розробників з католицького університету Ріо-де-Жанейро невелика — Роберто Єрусалимський (Roberto Ierusalimschy), Вольдемар Целес (Waldemar Celes) і Луіс Енріке (Luiz Henrique). Спочатку мова замислювалася як описова — для зручності формування великих масивів даних при рішенні завдань обчислювального експерименту і машинного моделювання. Але відтоді мова зазнала значних змін і низку серйозних архітектурних модифікацій. Сьогоднішня популярність Lua така, що Microsoft виділила розробникам грант на створення .NET-версії мови. У багатьох іграх Lua використовується як «скриптовий рушій» завдяки унікальному поєднанню швидкодії, легкості вбудовування в програми і підтримці «розширюваної семантики».

Реалізація[ред.ред. код]

Як і багато інтерпретованих мов програмування, реалізація Lua має окремо компілятор з сирцевого коду у виконуваний байт-код і віртуальну машину для виконання згенерованого байт-коду. Причому байт-код — це не команди стекової машини, а команди якогось віртуального процесора з кількома регістрами, що підвищує ефективність виконання. У стандартній віртуальній машині Lua використовується розподіл пам'яті із прибиранням сміття (аналогічно Java або .NET).

Для завдань, критичних за часом, є JIT компілятор Lua LuaJIT.

Lua використовує єдиний рядковий пул, що дозволяє зменшити витрати пам'яті на зберігання рядків.

Приклади коду[ред.ред. код]

Класичну програму Вітаю, світе! можна написати так:

 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 і являються основою для типів даних користувача, таких як структури, масиви, списки, множини. Таблиця в 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

Використання[ред.ред. код]

Ігри[ред.ред. код]

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 році і показала, що можна істотно збільшити продуктивність системи шаблонів.

Виноски[ред.ред. код]

Посилання[ред.ред. код]