Lua

Lua
Парадигма мульти-парадигмова: скриптова, імперативна, функціональна, об'єктно-орієнтована, прототипна
Дата появи 1993[1]
Творці Роберто Єрусалимський
Розробник Роберто Єрусалимський[2]
Останній реліз
Система типізації динамічна, слаба, качина
Основні реалізації Lua, LuaJIT, LLVM-Lua, LuaCLR, Nua, Lua Alchemy
Діалекти Metalua
Під впливом від C++, CLU, Simple Object Languaged, DELd, Snobol, Модула, Modula-2d і Scheme
Вплинула на Io[en], GameMonkey, Squirrel, Falcon, MiniD
Мова реалізації C[3]
Операційна система кросплатформова програма[4]
Ліцензія MIT[5][6]
Звичайні розширення файлів .lua[7][8], .luna, .lunaire або .anair
Репозиторій вихідного коду github.com/lua/lua
Вебсайт lua.org

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

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

Виноски

  1. Lua: about
  2. https://www.lua.org/authors.html
  3. The lua Open Source Project on Open Hub: Languages Page — 2006.
    d:Track:Q124688
  4. https://www.lua.org/about.html
  5. https://www.lua.org/license.html
  6. The lua Open Source Project on Open Hub: Licenses Page — 2006.
    d:Track:Q124688
  7. Lua 5.1 Reference Manual — 2019.
  8. A Look at the Design of Lua[New York]: Association for Computing Machinery, 2018. — ISSN 0001-0782; 1557-7317
    d:Track:Q1120519
  9. Lua scripting/Meeting 2012-01-25. Архів оригіналу за 26 травня 2012. Процитовано 3 лютого 2012.
  10. Mailing List Archive: Wikipedia: Wikitech Moving forward with Lua. Архів оригіналу за 4 лютого 2012. Процитовано 3 лютого 2012.
  11. Wikipedia будет использовать Lua в качестве языка для разработки шаблонов. opennet.ru (рос.). Архів оригіналу за 2 лютого 2012. Процитовано 3 лютого 2012.

Посилання

Lua
у сестринських Вікіпроєктах
П: Портал «Програмування»
m: Lua на Мета-вікі?
mw: Lua на MediaWiki?
CMNS: Файли у Вікісховищі?
  • Офіційний сайт [Архівовано 2 жовтня 2019 у Wayback Machine.](англ.)
  • Завантажити 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)(англ.). Ви можете допомогти, розширивши поточну статтю за допомогою перекладу з англійської.
  • Дивитись автоперекладену версію статті з мови «англійська».
  • Перекладач повинен розуміти, що відповідальність за кінцевий вміст статті у Вікіпедії несе саме автор редагувань. Онлайн-переклад надається лише як корисний інструмент перегляду вмісту зрозумілою мовою. Не використовуйте невичитаний і невідкоригований машинний переклад у статтях української Вікіпедії!
  • Машинний переклад Google є корисною відправною точкою для перекладу, але перекладачам необхідно виправляти помилки та підтверджувати точність перекладу, а не просто скопіювати машинний переклад до української Вікіпедії.
  • Не перекладайте текст, який видається недостовірним або неякісним. Якщо можливо, перевірте текст за посиланнями, поданими в іншомовній статті.
  • Докладні рекомендації: див. Вікіпедія:Переклад.
Перегляд цього шаблону
  Тематичні сайти
Quora · Zhihu
Словники та енциклопедії
Велика данська енциклопедія
Довідкові видання
Французька Вікідія · Fandom (англ.)
Нормативний контроль
BNF: 166522948 · Freebase: /m/0chpd · GND: 7547043-3 · J9U: 987007563918605171 · LCCN: sh2004007514
  • п
  • о
  • р
Низькорівневі
Високорівневі
Загального
призначення
Серверні
Запитів до баз
даних[суперечливо 1]
Розмітки та векторної
графіки[суперечливо 1]
Синхронні[en]
  • Lustre[en]
Символьних та
чисельних обчислень
Квантових обчислень
Логічні
  • Mercury[en]
  • Prolog
Академічні
Езотеричні
  1. а б Немає загальноприйнятого рішення, чи вважати усі ці мови саме мовами програмування
  • п
  • о
  • р
Загальне
Історія
ОС на базі ВПЗ
BSD · Apple Darwin · FreeDOS · FreeBSD · OpenBSD · FreeNAS · GNU · Haiku · Hurd · Inferno · Linux · Mach · MINIX · OpenSolaris · Plan 9 · ReactOS
Розробка ВПЗ[en]
Eclipse · FreeBASIC · Free Pascal · GCC · Java · libJIT[ru] · LLVM · Lua · Open64 · Perl · PHP · Python · ROSE[en] · Ruby · Tcl
Менеджери
вікон XWS
Blackbox Compiz EDE Enlightenment Fluxbox GNOME JWM IceWM KDE Openbox ROX[en] Window Maker[en] Xfce
Організації
Фонд вільного ПЗ (FSF) (європейський[en] індійський[en] латиноамериканський[en]) • Apache Software Foundation · Blender Foundation[en] · Eclipse Foundation · freedesktop.org · GNOME Foundation · Проєкт GNU · Google Code · Linux Foundation · Mozilla Foundation · Open Source Initiative · SourceForge · The Document Foundation · Xiph.Org · XMPP Standards Foundation[en] · X.Org Foundation
Ліцензії
Проблеми
Двійковий блоб · Технічні засоби захисту авторських прав · Вільні та відкриті графічні драйвери[en] · Ліцензійна проліферація · Iceweasel · Безпека відкритого ПЗ[en] · Власницьке програмне забезпечення · Конфлікт SCO—Linux · Програмні патенти · Тивоїзація · Trusted Computing · Апаратне обмеження[es] · Вірусна ліцензія
Інше
Визначення вільного ПЗ · Визначення Open Source · Альтернативні назви[en] · Рух · Вільне та відкрите ПЗ Microsoft Open Specification Promise[en] · Порівняння відкритих та закритих кодів[en] · Revolution OS · Собор і базар

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