Lua
Інструкції у Вікіпідручнику
-
Медіафайли у Вікісховищі
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([[кілька рядків]]) -- [[багаторядковий вираз чи коментар треба розміщувати в подвійні квадратні дужки]]
Керування потоком
В Lua є один тип умовного тесту: if then end
із необов’язковими конструкціями else
і elseif then
.
Загальний оператор if then end
вимагає всіх трьох ключових слів:
if <умова> then --statement body end
Ключове слово else
може бути доданим із супровідним блоком інструкцій для керування виконання при виконанні, коли if
повертає false
:
if умова then --statement body else --statement body end
Виконанням також можна керувати за кількома умовами за допомогою ключових слів elseif then
.:
if умова then --statement body elseif умова then --statement body else -- необов’зково --optional default statement body end
Lua має чотири типи умовних циклів: цикл while
, цикл repeat
(схожий на цикл do while
), нумеровий циклfor
і загальний цикл for
.
--умова = true while умова do --statements end repeat --statements until умова for i = first, last, delta do --дельта може бути від’ємною, що дозволяє циклу for відраховувати вниз або вгору --statements --example: print(i) end
Цей загальний цикл for
буде обходити таблицю _G
, використовуючи стандартну функцію ітератора pairs
, доки вона не поверне nil
:
for key, value in pairs(_G) do print(key, value) end
Цикли також можуть бути вкладеними (розміщеними всередині іншого циклу).
local grid = { { 11, 12, 13 }, { 21, 22, 23 }, { 31, 32, 33 } } for y, row in pairs(grid) do for x, value in pairs(row) do print(x, y, value) end end
Типи даних
В 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.
Використання
Lua у Вікіпедії
У січні 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 році й показала, що можна істотно збільшити продуктивність системи шаблонів.
Виноски
- ↑ Lua: about
- ↑ The lua Open Source Project on Open Hub: Languages Page — 2006.d:Track:Q124688
- ↑ https://www.lua.org/about.html
- ↑ https://www.lua.org/license.html
- ↑ The lua Open Source Project on Open Hub: Licenses Page — 2006.d:Track:Q124688
- ↑ Lua 5.1 Reference Manual — 2019.
- ↑ A Look at the Design of Lua — [New York]: Association for Computing Machinery, 2018. — ISSN 0001-0782; 1557-7317d:Track:Q1120519
- ↑ Lua scripting/Meeting 2012-01-25. Архів оригіналу за 26 травня 2012. Процитовано 3 лютого 2012.
- ↑ Mailing List Archive: Wikipedia: Wikitech Moving forward with Lua. Архів оригіналу за 4 лютого 2012. Процитовано 3 лютого 2012.
- ↑ Wikipedia будет использовать Lua в качестве языка для разработки шаблонов. opennet.ru (рос.). Архів оригіналу за 2 лютого 2012. Процитовано 3 лютого 2012.
Посилання
Lua у сестринських Вікіпроєктах | |
![]() | Портал «Програмування» |
---|---|
![]() | Lua на Мета-вікі? |
![]() | Lua на MediaWiki? |
![]() | Файли у Вікісховищі? |
- Офіційний сайт (англ.)
- Завантажити Lua (скомпільовані файли) [Архівовано 31 травня 2017 у Wayback Machine.](англ.)
- Цикл статей про Lua в журналі Linux Format [Архівовано 20 жовтня 2017 у Wayback Machine.](рос.)
- Список додатків, що використовують Lua, складений авторами (англ.)
- Вебсайт спільноти користувачів і авторів Lua [Архівовано 16 грудня 2010 у Wayback Machine.](англ.)
- Lua-wiki [Архівовано 11 жовтня 2008 у Wayback Machine.](англ.)
- lua-l archive [Архівовано 4 листопада 2008 у Wayback Machine.] — офіційний список (англ.)
- Luai [Архівовано 8 вересня 2008 у Wayback Machine.] — альтернативний інтерфейс довідки (англ.)
- Introducing Lua // ONLamp.com (англ.)
- An Introduction to Lua // GameDev.net (англ.)
- Interview with Roberto Ierusalimschy on Lua [недоступне посилання з 07.06.2017] // Computerworld (англ.)
В іншому мовному розділі є повніша стаття Lua (programming language)(англ.). Ви можете допомогти, розширивши поточну статтю за допомогою перекладу з англійської.
|
|