Lua
















Lua
Lua-logo-nolabel.svg

Парадигма:
мульти-парадигмова: скриптова, імперативна, функціональна, об'єктно-орієнтована, прототипна

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



Виноски |




  1. Lua scripting/Meeting 2012-01-25


  2. Mailing List Archive: Wikipedia: Wikitech Moving forward with Lua


  3. 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 (англ.)







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




Popular posts from this blog

Save data to MySQL database using ExtJS and PHP [closed]2019 Community Moderator ElectionHow can I prevent SQL injection in PHP?Which MySQL data type to use for storing boolean valuesPHP: Delete an element from an arrayHow do I connect to a MySQL Database in Python?Should I use the datetime or timestamp data type in MySQL?How to get a list of MySQL user accountsHow Do You Parse and Process HTML/XML in PHP?Reference — What does this symbol mean in PHP?How does PHP 'foreach' actually work?Why shouldn't I use mysql_* functions in PHP?

Compiling GNU Global with universal-ctags support Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 23, 2019 at 23:30 UTC (7:30pm US/Eastern) Data science time! April 2019 and salary with experience The Ask Question Wizard is Live!Tags for Emacs: Relationship between etags, ebrowse, cscope, GNU Global and exuberant ctagsVim and Ctags tips and trickscscope or ctags why choose one over the other?scons and ctagsctags cannot open option file “.ctags”Adding tag scopes in universal-ctagsShould I use Universal-ctags?Universal ctags on WindowsHow do I install GNU Global with universal ctags support using Homebrew?Universal ctags with emacsHow to highlight ctags generated by Universal Ctags in Vim?

Add ONERROR event to image from jsp tldHow to add an image to a JPanel?Saving image from PHP URLHTML img scalingCheck if an image is loaded (no errors) with jQueryHow to force an <img> to take up width, even if the image is not loadedHow do I populate hidden form field with a value set in Spring ControllerStyling Raw elements Generated from JSP tagds with Jquery MobileLimit resizing of images with explicitly set width and height attributeserror TLD use in a jsp fileJsp tld files cannot be resolved