(Go: >> BACK << -|- >> HOME <<)

Змесціва выдалена Змесціва дададзена
Няма апісаньня зьменаў
Няма апісаньня зьменаў
Радок 1:
{{Мова праграмаваньня|назва=Lua|лёга=[[File:Lua-Logo.svg|128px]]|парадыгма=[[Multi-paradigm]]: [[scripting language|scripting]], [[imperative programming|imperative]] ([[procedural programming|procedural]], [[prototype-based programming|prototype-based]], [[object-oriented programming|object-oriented]]), [[functional programming|functional]], [[metaprogramming|meta]], [[reflective programming|reflective]]|дата={{Start date and age|df=yes|1993}}|аўтар=[[Roberto Ierusalimschy]]<br /> Waldemar Celes<br /> Luiz Henrique de Figueiredo|вэрсія_стабрэліз={{wikidata|property|reference|edit| Q207316 |P348}}|дата_стабрэліз={{start date and age|{{wikidata|qualifier| Q207316 |P348|P577}}}}|тыпізацыя=[[Dynamic typing|Dynamic]], [[Strong and weak typing|weak]], [[Duck typing|duck]]|рэалізацыі=[//www.lua.org/download.html Lua], [[LuaJIT]], [//eliasdaler.github.io/luavela/ LuaVela],
 
[https://www.moonsharp.org/ MoonSharp], [//luvit.io Luvit], [//www.luart.org LuaRT], [https://luau-lang.org Lua''u'']|дыялекты=[http://metalua.luaforge.net/ Metalua<!--{{dead link |date=July 2018}}-->], [http://idle.thomaslauer.com Idle], [https://www.nongnu.org/gsl-shell/ GSL Shell]|уплыў_ад=[[C++]], [[CLU (programming language)|CLU]], [[Modula-2|Modula]], [[Scheme (programming language)|Scheme]], [[SNOBOL]]|уплыў_на=[[GameMonkey Script|GameMonkey]]<!--2003-->, [[Io (programming language)|Io]]<!--2002-->, [[JavaScript]]{{Citation needed|date=November 2022}}, [[Julia (programming language)|Julia]]<!--2012-->, MiniD<!--2006-->, [[Red (programming language)|Red]], [[Ring_(programming_language)|Ring]],<ref name="The Ring programming language and other languages">{{cite web |url=http://ring-lang.sourceforge.net/doc1.6/introduction.html#ring-and-other-languages |title=The Ring programming language and other languages |author=Ring Team |date=5 December 2017 |work=ring-lang.net |access-date=5 December 2017 |archive-date=25 December 2018 |archive-url=https://web.archive.org/web/20181225175312/http://ring-lang.sourceforge.net/doc1.6/introduction.html#ring-and-other-languages |url-status=dead }}</ref> [[Ruby (programming language)|Ruby]],{{Citation needed|date=November 2022}} [[Squirrel (programming language)|Squirrel]]<!--2003-->, MoonScript<!--2011-->, [[C--]]|АС=[[Cross-platform]]|ліцэнзія=[[MIT License]]|сайт={{official URL}}}}
 
 
'''Lua''' (ад [[Партугальская мова|партугальскага]]: lua [ ˈlu(w)ɐ ] "луэ", што значыць [[Месяц (спадарожнік)|Месяц]] ) — [[Высокаўзроўневая мова праграмаваньня|высокаўзроўневая]] [[Шматпарадыгмавая мова праграмаваньня|шматпарадыгмавая]] [[Скрыптовая мова|скрыптовая]] [[мова праграмаваньня]]. Lua з'яўляецца [[Кросплатформеннае праграмнае забеспячэньне|кросплатформеннай]], паколькі [[інтэрпрэтатар]] скампіляванага [[Байт-код|байт-кода]] напісаны на [[ANSI C]], і Lua мае адносна простае C [[API]] для ўбудавання яго ў дадаткі.
 
== Гісторыя ==
Lua быў створаны ў 1993 годзе РабертаРаберту Ерусалімскім, Луісам ГэнрыкеЭнрыке дэ Фігуэйрэда і Вальдэмарам Салесам, членамі Tecgraf (Computer Graphics Technology Group - групы тэхналогій камп'ютэрнай графікі) у Папскім каталіцкім універсітэце Рыа-дэ-Жанэйра ў Бразіліі .
 
З 1977 па 1992 год у Бразілія праводзіла палітыку жорсткіх [[Гандлёвы бар'ер|гандлёвых бар'ераў]] (так званых рынкавых рэзерваў) у дачыненьні да кампутарнага абсталявання і праграмнага забеспячэння, мяркуючы, што Бразілія можа і павінна вырабляць іх сама. З-за чаго кліенты Tecgraf не маглі дазволіць сабе, ні палітычна, ні фінансава, купляць індывідуальнае праграмнае забеспячэнне з-за мяжы; згодна з рынкавым рэзервам, кліенты павінны былі б прайсці праз складаны бюракратычны працэс, каб даказаць, што іх патрэбы не могуць быць задаволены бразільскімі кампаніямі. Гэта вымусіла Tecgraf да стварэння неабходных інструмэнтаў з нуля.
Радок 11:
Папярэднікамі Lua былі мовы ''SOL'' (Simple Object Language - простая аб'ектная мова) і ''DEL'' (Data-Entry Language - мова ўвода даных). Яны былі незалежна распрацаваны ў Tecgraf у 1992–1993 гадах, каб дадаць некаторую гнуткасць у два розныя праекты (абодва былі інтэрактыўнымі графічнымі праграмамі для кампаніі Petrobras ). У SOL і DEL не хапала структур кіравання патокам, і Petrobras адчувала ўсё большую патрэбу ў тым, каб дадаць да іх поўную магутнасць праграмавання.
 
Lua 1.0 быў распрацаваны такім чынам, што яго канструктары аб'ектаў, якія ў той час крыху адрозніваліся ад цяперашняга лёгкага і гнуткага стылю, уключалі сінтаксіс апісання дадзеных SOL (адсюль назва Lua: ''Sol'' азначае «Сонца» на партугальскай мове, а ''Lua'' азначае «Месяц»). [[Сынтаксіс (мова праграмаваньня)|СынтаксісСынтакс]] Lua для структур кіравання ў асноўным быў запазычаны з [[Modula]] ( <code>if</code>, <code>while</code>, <code>repeat</code> / <code>until</code> ), але таксама паспытаў уплыў [[CLU]] (множныя прызначэнні і множныя вяртанні з функцый, як больш простая альтэрнатыва [[Спасылачны параметар|спасылачным параметрам]] або яўным [[Указальнік (машыннае праграмаваньне)|указальнікам]]), [[C++]] ("выдатная ідэя дазволіць [[Лакальная зменная|лакальнай зменнай]] быць аб'яўленай толькі там, дзе яна патрэбна" ), [[SNOBOL]] і [[AWK]] ( [[Асацыятыўны масіў|асацыятыўныя масівы]] ). У артыкуле, апублікаваным у ''часопісе Dr. Dobb's Journal'', стваральнікі Lua таксама сцвярджаюць, што [[LISP]] і [[Scheme]] з іх адзінай універсальнай структурай даных ([[Спіс (структура даных)|спісам]]) аказалі вялікі ўплыў на іх рашэнне выкарыстаць табліцу ў якасці асноўнай структуры даных Lua.
 
З цягам часу семантыка Lua падвяргалася ўсё большаму ўплыву Scheme , асабліва з увядзеннем ананімных функцый і поўнага лексічнага ахопу . У новых версіях Lua было дададзена некалькі функцый.
Радок 22:
Увогуле, Lua імкнецца прадастаўляць простыя, гнуткія [[Мэтад (праграмаваньне)|мета-функцыі]], якія можна пашыраць па меры неабходнасці, а не набор функцый, характэрны для адной парадыгмы праграмавання. У выніку базавая мова выкарыстоўвае невялікі аб'ём памяці; скампіляваны [[інтэрпрэтатар]] займае толькі каля 247&nbsp;[[Кілябайт|kB]] .
 
Як мова з [[Дынамічная тыпізацыя|дынамічнай тыпізацыяй]], прызначаная для выкарыстання ў якасці [[Скрыптовая мова|мовы сцэнарыяў]], Lua досыць кампактная, каб змясціцца на розных хост-платформах. Яна падтрымлівае толькі невялікую колькасць простых тыпаў даных, такіх як [[Булевы тып даных|булевыя]] значэнні, лічбы (па змаўчанні з плаваючай кропкай падвойнай дакладнасці і 64-бітныя [[Цэлы лік|цэлыя]]) і [[Радок (тып даных)|радкі]]. Тыповыя структуры даных, такія як [[Масіў (структура даных)|масівы]], [[Сэт (структура даных)|сэты]], [[Спіс (структура даных)Сьпіс|спісысьпісы]] і [[Запіс (структура даных)|запісы]], могуць быць прадстаўлены з дапамогай адзінай уласнай структуры даных Lua, табліцы, якая па сутнасці з'яўляецца гетэрагенным [[Асацыятыўны масіў|асацыятыўным масівам]].
 
Lua рэалізуе невялікі набор пашыраных функцый, такіх як [[Першаклясная функцыя|першаклясныя функцыі]], [[Зборка смецьця (машыннае праграмаваньне)|зборка смецьця]], [[Замыканне (інфарматыка)|замыканьні]], правільныя [[Хваставы выклік|хваставыя выклікі]], [[Пераўтварэньне тыпу даных|пераўтварэньне]] (аўтаматычнае пераўтварэнне паміж радковымі і лікавымі значэннямі падчас выканання), [[Карутына|карутыны]] (кааператыўная шматзадачнасць) і [[Дынамічная загрузка|дынамічная загрузка модуляў]].
Радок 41:
</syntaxhighlight>
 
[[КаментарыйКамэнтар (машыннае праграмаваньне)|КаментарыйКамэнтар]] у Lua пачынаецца з падвойнага злучка і працягваецца да канца радка, падобна да [[Ada]], [[Eiffel]], [[Haskell]], [[Slovnaft|SQL]] і [[VHDL]]. Шматрадковыя радкі і каментарыікамэнтары абмежаваныя падвойнымі квадратнымі дужкамі.
 
<syntaxhighlight lang="lua">
 
-- аднарадковы каментарыйкамэнтар
 
--[[
шматрадковы
камэнтар
каментарый
]]
 
</syntaxhighlight>
 
{{anchor|Прыклад факторыял}}У наступным прыкладзе рэалізавана функцыя вылічэньня [[Фактарыял|фактарыялу]]:
 
<syntaxhighlight lang="lua">
Радок 166:
</syntaxhighlight>
 
Любыя будучыя выклікі <code>print</code> цяпер будуць накіроўвацца праз новую функцыю, з-за [[ЛяксычныЛексычны ахоп|ляксычнагалексычнага ахопу]] Lua старая функцыя <code>print</code> будзе даступная толькі цераз новаю змененую <code>print</code>.
 
Lua таксама падтрымлівае [[Замыканьне (інфарматыка)|замыканні]], як паказана ніжэй:
Радок 230:
</syntaxhighlight>
 
Табліца можа падысьці у якасьці [[Прастора імёнаў|прасторы імёнаў]], калі захоўваць у ёй функцыі.
 
<syntaxhighlight lang="lua">
Радок 277:
ExampleTable =
{
{1, 2, 3, 4},
{5, 6, 7, 8}
}
 
Радок 331:
=== Аб'ектна-арыентаванае праграмаванне ===
 
Нягледзячы на тое, што Lua не мае ўбудаванай канцэпцыі [[Кляса (праграмаваньне)|клясаў]], [[Аб’ектна-арыентаванае праграмаваньне|аб'ектна-арыентаванае праграмаванне]] можа эмулявацца з дапамогай функцый і табліц. Аб'ект фармуецца шляхам размяшчэння метадаўмэтодаў і палёў у табліцы. [[УспадкоўваньнеСпадкаваньне (аб'ектна-арыентаванае праграмаваньне)|УспадкоўваньнеСпадкаваньне]] (як адзінкавае, так і множнае) можа быць рэалізавана з дапамогай метатабліц, дэлегуючы неіснуючыя метады і палі бацькоўскаму аб'екту.
 
У гэтым выпадку такога паняцця як «кляса» не існуе; хутчэй, гэта падобна да [[Прататыпнае праграмаваньне|прататыпнага ўспадкоўваньня]], як у [[Self]] або [[JavaScript]]. Новыя аб'екты ствараюцца альбо [[Фабрычны мэтад|фабрычным мэтадам]] (які стварае новыя аб'екты з нуля), альбо шляхам кланаваньня існуючага аб'екта.
Радок 375:
-- Канструктар клясы Vector
function Vector:new(x, y, z)
 
--[[ Так як мэтад створаны пры дапамозе двукроп'я,
"self" няяўна перадаецца як першы аргумэнт. ]]
Радок 395 ⟶ 396:
</syntaxhighlight>
 
==== УспадкоўваньнеСпадкаваньне ====
 
УспадкоўваньнеСпадкаваньне у Lua таксама магчыма з дапамогай мэтатабліц. У наступным прыкладзе мыапэрацыя рэалізуемпамнажэньня аперацыю памнажэння вектаравэктара на канстанту рэалізаваная ў вытворнымвытворнай класеклясе.
 
<syntaxhighlight lang="lua">
Радок 406 ⟶ 407:
--- канструктар клясы Vector
function Vector:new(x, y, z)
--[[ Here, self refers to whatever class's "new"
--[[ Тут self спасылаецца на тую клясу, мэтод якой выклікаецца.
-- method we call. In a derived class, self will
У вытворнай клясе self будзе гэтай самай вытворнай клясай,
-- be the derived class; in the Vector class, self
у клясе Vector self будзе Vector. ]]
-- will be Vector ]]
return setmetatable({ x = x, y = y, z = z }, self)
end
 
Радок 417 ⟶ 418:
end
 
-- Example of class inheritance
local VectorMult = {}
VectorMult.__index = VectorMult
 
setmetatable(VectorMult, Vector) -- Make VectorMult a child of Vector
-- пазначаем VectorMult нашчадкам клясы Vector
setmetatable(VectorMult, Vector)
 
function VectorMult:multiply(value)
self.x = self.x * value
self.y = self.y * value
self.z = self.z * value
return self
end
 
-- ствараем новы вэктар
local vec = VectorMult:new(0, 1, 0) -- Create a vector
local vec = VectorMult:new(0, 1, 0)
print(vec:magnitude()) -- Call a method (output: 1)
 
print(vec.y) -- Access a member variable (output: 1)
-- выклікаем мэтод, друкуе 1
vec:multiply(2) -- Multiply all components of vector by 2
print(vec:magnitude())
print(vec.y) -- Access member again (output: 2)
 
-- звяртаемся да поля y, друкуе 1
print(vec.y)
 
-- памнажаем усе складаныя вэктару на 2
vec:multiply(2)
 
-- зноў звяртаемся да поля y, атрымоўваем 2
print(vec.y)
 
</syntaxhighlight>
 
Lua таксама падтрымлівае [[Множнае успадкоўваньне|множнае ўспадкоўваньнеспадкаваньне]]; <code>__index</code> можа быць функцыяй або табліцай. [[Перагрузка аператараапэратара]] таксама можа быць зроблена; мэтатабліцы Lua могуць мець такія элементы, як <code>__add</code>, <code>__sub</code> і гэтак далей.
 
== Рэалізацыя ==
 
ПраграмыПраграма на Lua не інтэрпрэтуюцца[[Інтэрпрэтуемая мова|інтэрпрэтуецца]] непасрэдна з тэкставага файла, а [[Кампілятар|кампілююцца]] ў байт-код, які потым запускаецца на [[Віртуальная машына|віртуальнай машыне]] Lua. ПрацэсУвесь кампіляцыіпрацэс звычайна нябачны для карыстальніка і выконваецца падчас выканання,працы. асабліва калі выкарыстоўваецца JIT-кампілятар, але ёнКампіляцыя можа быць выкананы загадзя, каб паскорыць загрузку або, прыбраўшы кампілятар, паменшыць аб'ём памяці хост-асяроддзя. Кампіляцыя у байт-код магчыма таксама ўнутры праграмы на Lua, выкарыстоўваючыз функцыювыкарыстаньнем функцыі <code>dump</code> з бібліятэкі радкоў альбо функцыіадной з функцый <code>load/loadstring/loadfile</code>.
 
У адрозненьне ад большасьці віртуальных машын (якія звычайна [[Стэкавыя машына|стэкавыя]]), віртуальная машына Lua [[Рэгістравая машына|рэгістравая]] і больш нагадвае рэальную апаратную канструкцыю. Рэгістравая архітэктура пазбягае празмернага капіравання значэнняў і памяншае агульную колькасць інструкцый на функцыю. Віртуальная машына Lua 5 з'яўляецца адной з першых чыста рэгістравых віртуальных машын, якія атрымалі шырокае прымяненне.
Lua версіі 5.3.4 рэалізавана прыкладна ў 24 000 радках кода C.
 
Наступны прыклад - гэта байт-код функцыі фактарыялу, рэалізаванай [[#Прыклад факторыял|вышэй]] (згодна з кампілятарам <code>luac</code> 5.1):
У адрозненне ад большасці віртуальных машын (якія звычайна стэкавыя), віртуальная машына Lua рэгістравая і таму больш нагадвае рэальную апаратную канструкцыю. Рэгістравая архітэктура пазбягае празмернага капіравання значэнняў і памяншае агульную колькасць інструкцый на функцыю. Віртуальная машына Lua 5 з'яўляецца адной з першых чыста рэгістравых віртуальных машын, якія атрымалі шырокае прымяненне.
 
function <factorial.lua:1,7> (9 instructions, 36 bytes at 0x8063c60)
Наступны прыклад - гэта байт-код функцыі фактарыялу, вызначанай вышэй (згодна з кампілятарам <code>luac</code> 5.1):
1 param, 6 slots, 0 upvalues, 6 locals, 2 constants, 0 functions
функцыя <factorial.lua:1,7> (9 інструкцый, 36 байтаў у 0x8063c60)
1 [2] LOADK 1 -1 ; 1
1 параметр, 6 слотаў, 0 павышаючых значэнняў, 6 мясцовых, 2 канстанты, 0 функцый
1 [2 [3] LOADK НАГРУЗКА 1 -1 2 -2 ; 12
2 3 [3] MOVE НАГРУЗКА 2 -2 ; 2 3 0
4 [3] LOADK 4 -1 ; 1
3 [3] ПЕРАХОД 3 0
4 5 [3] FORPREP НАГРУЗКА 4 2 -1 ; 1to 7
5 6 [34] MUL FORPREP 2 1 ; да 7 1 1 5
6 7 [43] FORLOOP MUL 1 2 1-2 ; 5to 6
7 8 [36] RETURN FORLOOP 2 - 1 2 ; да 6
9 [7] RETURN 0 1
8 [6] ВЯРТАННЕ 1 2
9 [7] ВЯРТАННЕ 0 1
 
== C API ==
Lua была распрацавана з мэтай убудавання ў іншыя праграмы, дзеля гэтага яна распаўсюджваецца разам з C API. Які складаецца з дзвюх частак: ядро Lua і дапаможнай бібліятэкі Lua. Апошняя складаецца ў асноўным з макрасаў прэпрацэсара, якія дапамагаюць са складанымі таблічнымі аперацыямі.
 
Lua была распрацавана з мэтай убудавання ў іншыя праграмы, дзеля гэтага яна распаўсюджваецца разам з [[C (мова праграмаваньня)|C]] [[API]]. Які складаецца з дзвюх частак: ядро Lua і дапаможнай бібліятэкі Lua. Апошняя складаецца ў асноўным з макрасаў прэпрацэсара, якія дапамагаюць са складанымі таблічнымі аперацыямі.
Lua C API заснаваны на стэку . Lua забяспечвае функцыі для праштурхоўвання і выцягвання большасці простых тыпаў даных C (цэлыя лікі, плывучыя і г.д.) у стэк і са стэка, а таксама функцыі для маніпулявання табліцамі праз стэк. Стэк Lua некалькі адрозніваецца ад традыцыйнага стэка; напрыклад, яго можна непасрэдна праіндэксаваць. Адмоўныя індэксы паказваюць зрушэнні ад вяршыні стэка. Напрыклад, −1 з'яўляецца верхнім (апошняе значэнне), у той час як дадатныя індэксы паказваюць зрушэнні ад ніжняга (самае старое значэнне). Маршалінг даных паміж функцыямі C і Lua таксама выконваецца з дапамогай стэка. Каб выклікаць функцыю Lua, аргументы замяшчаюцца ў стэк, а затым <code>lua_call</code> выкарыстоўваецца для выкліку Lua функцыі. Пры напісанні функцыі C для непасрэднага выкліку з Lua аргументы счытваюцца са стэка.
 
Lua C API заснаваны на [[Стэк|стэку]]. Lua забяспечвае функцыі для праштурхоўвання і выцягвання большасці простых тыпаў даных C (цэлыя лікі, плывучыя і г.д.) у стэк і са стэка, а таксама функцыі для маніпулявання табліцамі праз стэк. Стэк Lua некалькі адрозніваецца ад традыцыйнага стэка; напрыклад, яго можна непасрэдна праіндэксаваць. Адмоўныя індэксы паказваюць зрушэнні ад вяршыні стэка. Напрыклад, −1 з'яўляецца верхнім (апошняе значэнне), у той час як дадатныя індэксы паказваюць зрушэнні ад ніжняга (самае старое значэнне). Маршалінг даных паміж функцыямі C і Lua таксама выконваецца з дапамогай стэка. Каб выклікаць функцыю Lua, аргументы замяшчаюцца ў стэк, а затым <code>lua_call</code> выкарыстоўваецца для выкліку Lua функцыі. Пры напісанні функцыі C для непасрэднага выкліку з Lua аргументы счытваюцца са стэка.
 
Вось прыклад выкліку функцыі Lua з C:
 
<syntaxhighlight lang="c">
 
Вось прыклад выкліку функцыі Lua з C:<syntaxhighlight lang="c">
#include <stdio.h>
 
#include <lua.h> // Lua main library (lua_*)
// галоўная бібліятэка Lua (lua_*)
#include <lauxlib.h> // Lua auxiliary library (luaL_*)
#include <lua.h>
 
// дапаможная бібліятэка Lua (luaL_*)
#include <lauxlib.h>
 
int main(void)
{
// пачынае працу з Lua
// create a Lua state
lua_State *L = luaL_newstate();
 
// загадваем Lua выканаць радок коду, які стварае функцыю foo
// load and execute a string
if (luaL_dostring(L, "function foo (x,y) return x+y end")) {
lua_close(L);
return -1;
}
 
// захоўваем адрас функцыі foo і лікі 5 і 3 у стэку Lua
lua_getglobal(L, "foo");
lua_pushinteger(L, 5);
lua_pushinteger(L, 3);
 
// выклікаем функцыю foo з 2 аргумэнтамі і адным зваротным значэньнем
lua_call(L, 2, 1);
 
// друкуем тое, што знаходзіцца на вяршыні стэку
printf("Result: %d\n", lua_tointeger(L, -1));
 
// вяртаем стэк у першапачатковы стан
lua_pop(L, 1);
 
// завяршаем працу з Lua
lua_close(L);
return -1;
}
 
return 0;
// push value of global "foo" (the function defined above)
// to the stack, followed by integers 5 and 3
lua_getglobal(L, "foo");
lua_pushinteger(L, 5);
lua_pushinteger(L, 3);
lua_call(L, 2, 1); // call a function with two arguments and one return value
printf("Result: %d\n", lua_tointeger(L, -1)); // print integer value of item at stack top
lua_pop(L, 1); // return stack to original state
lua_close(L); // close Lua state
return 0;
}
 
</syntaxhighlight>Запуск гэтага прыкладу дае:<syntaxhighlight lang="console">
</syntaxhighlight>
 
Запуск гэтага прыкладу дае:
 
<syntaxhighlight lang="console">
 
$ cc -o example example.c -llua
$ ./example
Result: 8
</syntaxhighlight>C API таксама забяспечвае некаторыя спецыяльныя табліцы, размешчаныя ў розных "псеўдаіндэксах" у стэку Lua. У <code>LUA_GLOBALSINDEX</code> да Lua 5.2 знаходзілася глабальная табліца <code>_G</code>, якая з'яўляецца асноўнай прасторай імёнаў. Існуе таксама рэестр, размешчаны ў <code>LUA_REGISTRYINDEX</code>, дзе праграмы на C могуць захоўваць даныя Lua для пазнейшага выкарыстання.
 
</syntaxhighlight>
=== Модулі ===
Акрамя стандартных бібліятэчных (асноўных) модуляў, можна пісаць пашырэнні з дапамогай Lua API. Скрыпты Lua могуць загружаць модулі пашырэння з дапамогай <code>require</code>, гэтак жа, як стандартныя модулі самой Lua, або з дапамогай <code>package.loadlib</code> . Калі бібліятэка C загружаецца праз require ( 'foo' ) Lua выклікае функцыю <code>luaopen_foo</code>, якая дзейнічае як любая функцыя C, якую можна выклікаць з Lua, і звычайна вяртае табліцу, запоўненую метадамі. Модулі Lua, вядомыя пад назвай ''rocks,'' даступная праз сістэму кіравання пакетамі LuaRocks .
 
C API таксама забяспечвае некаторыя спецыяльныя табліцы, размешчаныя ў розных "псеўдаіндэксах" у стэку Lua. У <code>LUA_GLOBALSINDEX</code> да Lua 5.2 знаходзілася глабальная табліца <code>_G</code>, якая з'яўляецца асноўнай [[Прастора імёнаў|прасторай імёнаў]]. Існуе таксама рэестр, размешчаны ў <code>LUA_REGISTRYINDEX</code>, дзе праграмы на C могуць захоўваць даныя Lua для пазнейшага выкарыстання.
== Выкарыстанне ==
Lua шырока выкарыстоўваецца ў якасці мовы сцэнарыяў у распрацоўцы відэагульняў, галоўным чынам дзякуючы сваёй лёгкасці ўбудавання, хуткаму выкананню і кароткаму працэсу навучання . Сярод вядомых гульняў, якія выкарыстоўваюць Lua, ''Roblox'', ''Garry's Mod'', ''World of Warcraft'', ''Payday 2'', ''Phantasy Star Online 2'', ''Dota 2'', ''Crysis'' і многія іншыя. Некаторыя гульні маюць мадыфікацыі, якія падтрымліваюць Lua, напрыклад, ComputerCraft для ''Minecraft'' . Акрамя таго, Lua таксама выкарыстоўваецца ў праграмным забеспячэнні, не звязаным з відэагульнямі, такім як Adobe Lightroom, Moho, iClone, Aerospike і пэўным сістэмным праграмным забеспячэнні ў FreeBSD і NetBSD, а таксама выкарыстоўваецца ў якасці шаблоннай мовы сцэнарыяў на MediaWiki з выкарыстаннем пашырэння Scribunto.
 
=== Модулі ===
У 2003 годзе апытанне, праведзенае GameDev.net, паказала, што Lua была самай папулярнай мовай сцэнарыяў для праграмавання гульняў. 12 студзеня 2012 года Lua быў абвешчаны пераможцам прэміі Front Line Award 2011 ад часопіса ''Game Developer'' у катэгорыі «Сродкі праграмавання».
 
Акрамя стандартных бібліятэчных (асноўных) модуляў, можна пісаць пашырэнні з дапамогай Lua API. Скрыпты Lua могуць загружаць модулі пашырэння з дапамогай <code>require</code>, гэтак жа, як стандартныя модулі самой Lua, або з дапамогай <code>package.loadlib</code>. Калі бібліятэка C загружаецца праз <code>require('foo')</code> Lua выклікае функцыю <code>luaopen_foo</code>, якая дзейнічае як любая функцыя C, якую можна выклікаць з Lua, і звычайна вяртае табліцу, запоўненую мэтодамі. Модулі Lua, вядомыя пад назвай ''rocks,'' даступная праз сістэму кіравання пакетамі LuaRocks.
Вялікая колькасць негульнявых дадаткаў таксама выкарыстоўвае Lua у якасці мовы сцэнарыяў. Напрыклад, LuaTeX, Redis, ScyllaDB, Neovim, Nginx і Wireshark.
 
== Выкарыстанне ==
Дзякуючы пашырэнню Scribunto, Lua даступны як мова сцэнарыяў на баку сервера ў праграмным забеспячэнні MediaWiki, якое працуе ў Вікіпедыі і іншых вікі.
 
Lua шырока выкарыстоўваецца ў якасці [[Скрыптовая мова|мовы сцэнарыяў]] у [[Распрацоўка відэагульняў|распрацоўцы відэагульняў]], галоўным чынам дзякуючы сваёй лёгкасці ўбудавання, хуткаму выкананню і кароткаму працэсу навучання. Сярод вядомых гульняў, якія выкарыстоўваюць Lua, ''[[Roblox]]'', ''[[Garry's Mod]]'', ''[[World of Warcraft]]'', ''[[Payday 2]]'', ''[[Phantasy Star Online 2]]'', ''[[Dota 2]]'', ''[[Crysis]]'' і многія іншыя. Некаторыя гульні маюць мадыфікацыі, якія падтрымліваюць Lua, напрыклад, ComputerCraft для ''[[Minecraft]]''. Акрамя таго, Lua таксама выкарыстоўваецца ў праграмным забеспячэнні, не звязаным з відэагульнямі, такім як [[Adobe Lightroom]], [[Moho]], [[iClone]], [[Aerospike]] і пэўным сістэмным праграмным забеспячэнні ў [[FreeBSD]] і [[NetBSD]], а таксама выкарыстоўваецца ў якасці шаблоннай мовы сцэнарыяў на [[МэдыяВікі]] з выкарыстаннем пашырэння Scribunto.
*
 
У 2003 годзе апытанне, праведзенае GameDev.net, паказала, што Lua была самай папулярнай мовай сцэнарыяў для праграмавання гульняў. 12 студзеня 2012 года Lua быў абвешчаны пераможцам прэміі Front Line Award 2011 ад часопіса ''Game Developer'' у катэгорыі «Сродкі праграмавання».
*
 
Вялікая колькасць негульнявых дадаткаў таксама выкарыстоўвае Lua у якасці мовы сцэнарыяў. Напрыклад, [[LuaTeX]], [[Redis]], [[ScyllaDB]], [[Neovim]], [[Nginx]] і [[Wireshark]].
== Спасылкі ==
 
== Крыніцы ==
{{reflist|30em}}
 
== Зьнешнія спасылкі ==
== Дадатковае чытанне ==
 
* {{Official website}}
* [https://luarocks.org/ Lua Rocks - Package manager]
 
<nowiki>
[[Катэгорыя:Скрыптовыя мовы]]
[[Катэгорыя:Мовы праграмаваньня]]
[[Катэгорыя:Аб'ектна-арыентаваныя мовы праграммаваньня]]
[[Катэгорыя:Дынамічна тыпізуемыя мовы праграмаваньня]]
[[Катэгорыя:Старонкі з недагледжанымі перакладамі]]</nowiki>