.lua
.luna
.lunaire
.anair
Lua ([лу́а], порт. місяць) — швидка і компактна скриптова мова програмування, розроблена підрозділом Tecgraf Католицького університету Ріо-де-Жанейро (Computer Graphics Technology Group of Pontifical Catholic University of Rio de Janeiro in Brazil). Інтерпретатор мови є вільно поширюваним, з відкритим початковим кодом на мові C.
За можливостями, ідеологією і реалізацією, мова найближча до JavaScript, проте Lua відрізняється могутнішими й набагато гнучкішими конструкціями, спроєктованими з метою «не плодити сутності понад необхідне». Хоча Lua не містить поняття класу і об'єкта в явному вигляді, механізми об'єктноорієнтованого програмування (ООП) з підтримкою прототипів (включаючи множинне успадкування) легко реалізуються з використанням метатаблиць, які також дозволяють перевантаження операцій тощо. Реалізована модель ООП (як і в JavaScript) — прототипна.
Lua отримала велике поширення в ролі вбудованої в інші проєкти мови сценаріїв (наприклад, для визначення конфігурації або для написання розширень). Lua комбінує простий процедурний синтаксис з потужними можливостями опису даних через використання асоціативних масивів і розширюваної семантики мови. У Lua використовується динамічна типізація, мовні конструкції перетворюються на байт-код, який виконується поверх регістрової віртуальної машини з автоматичним збирачем сміття. Сам інтерпретатор оформлений у вигляді бібліотеки, легко інтегрованої в проєкти на мовах Сі та Сі++. Код інтерпретатора Lua написаний мовою Сі й розповсюджується під ліцензією MIT.
Створення мови почалося в 1993. Команда розробників з католицького університету Ріо-де-Жанейро невелика — Роберто Єрусалимський (Roberto Ierusalimschy), Вольдемар Целес (Waldemar Celes) і Луїс Енріке (Luiz Henrique). Спочатку мова замислювалася як описова — для зручності формування великих масивів даних при рішенні завдань обчислювального експерименту і машинного моделювання. Але відтоді мова зазнала значних змін і низки серйозних архітектурних модифікацій. Сьогоднішня популярність Lua така, що Microsoft виділила розробникам грант на створення .NET-версії мови. У багатьох іграх Lua використовується як «скриптовий рушій» завдяки унікальному поєднанню швидкодії, легкості вбудовування в програми та підтримці «розширюваної семантики».
Як і багато інтерпретованих мов програмування, реалізація Lua має окремо компілятор з початкового коду у виконуваний байт-код і віртуальну машину для виконання згенерованого байт-коду. Особливістю є те, що байт-код — це команди не стекової машини, команди віртуального регістрового процесора, який більше відповідає реальним ЦПУ. Таке архітектурне рішення майже прямо транслюється на команди сучасних CPU. Це суттєво зменшує операції з перетворення. Внаслідок зменшення технологічних операцій перетворення, зростає ефективність виконання 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
boolean
number
string
table
function
thread
userdata
type()
nil — це порожнє значення. Його головні властивості — відрізнятись від будь-якого значення та вказувати на відсутність значення, придатного для якого-небудь використання. Також nil може бути використаним як логічне значення, в такому разі він позначатиме неправду.
Логічний тип boolean містить два значення: true (правда) та false (неправда).
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
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. Зверніть увагу, що створені таким чином масиви, починаються з одиниці, а не з нуля, як в більшості інших мов.
t = {'a', 'b', 'c', 'd', 'e'}
print(t[2]) --виведе b
Функції в Lua є значеннями першого класу, що означає, що функції можна передавати до інших функцій, повертати з них та використовувати замикання. Функції можуть повертати будь-яку кількість значень. Також функцію можна викликати з будь-якою кількістю параметрів: зайві будуть ігноруватись, а тим, яких не вистачає, буде присвоєно значення nil.
Тип thread позначає незалежний потік виконання. Потоки Lua не варто асоціювати з потоками операційної системи, багатопоточна програма може виконуватись навіть в тих системах, які не підтримують потоки.
Тип userdata використовується для роботи з даними з мови C. В нього немає визначених наперед операцій, проте їх можна визначити за допомогою метатаблиць. Також значення цього типу не можуть бути ні створені, ні змінені з Lua, для цього потрібно використовувати C API.
У січні 2012 на зустрічі розробників[9] вікірушія MediaWiki, який використовується для забезпечення роботи Вікіпедії, було прийнято рішення[10][11] про залучення мови Lua для розробки шаблонів. Використовувана на той час система шаблонів не влаштовувала розробників через зайву ускладненість та низьку ефективність. Інтеграція Lua в MediaWiki почалася на початку травня 2012, після виходу релізу MediaWiki 1.19 та міграції проєкту на систему управління початковими текстами Git.
Шаблони дозволяють користувачам MediaWiki автоматизувати створення типового вмісту, що включається в інші сторінки, і створювати інструменти для маніпуляції даними, перетворюючи вікі-текст в якусь подобу мови програмування. Наразі шаблони для MediaWiki створюються з використанням додаткової wiki-розмітки та розширення ParserFunctions, що створює істотні обмеження у функціональності й призводить до витрат значних ресурсів при виконанні. Намір перейти до використання в шаблонах повноцінної мови програмування назрів уже давно, але виникла проблема вибору: розгорнулася палка дискусія між прихильниками Javascript/WikiScript і Lua.
У підсумку перемогла Lua, головним чином завдяки технічно простішій інтеграції в проєкт. Серед інших переваг було названо: ефективна робота з пам'яттю, висока продуктивність (застосовується JIT-компіляція, що робить Lua швидшою за PHP з використанням Zend), компактність і початкова орієнтація на ефективне вбудовування в сторонні застосунки. Робота над експериментальним прототипом на базі Lua почалася у 2011 році й показала, що можна істотно збільшити продуктивність системи шаблонів.
Портал «Програмування»
Lokasi Pengunjung: 3.135.206.238