Lua: розьніца паміж вэрсіямі
Змесціва выдалена Змесціва дададзена
Няма апісаньня зьменаў |
Няма апісаньня зьменаў |
||
Радок 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 годзе
З 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 падвяргалася ўсё большаму ўплыву Scheme , асабліва з увядзеннем ананімных функцый і поўнага лексічнага ахопу . У новых версіях Lua было дададзена некалькі функцый.
Радок 22:
Увогуле, Lua імкнецца прадастаўляць простыя, гнуткія [[Мэтад (праграмаваньне)|мета-функцыі]], якія можна пашыраць па меры неабходнасці, а не набор функцый, характэрны для адной парадыгмы праграмавання. У выніку базавая мова выкарыстоўвае невялікі аб'ём памяці; скампіляваны [[інтэрпрэтатар]] займае толькі каля 247 [[Кілябайт|kB]] .
Як мова з [[Дынамічная тыпізацыя|дынамічнай тыпізацыяй]], прызначаная для выкарыстання ў якасці [[Скрыптовая мова|мовы сцэнарыяў]], Lua досыць кампактная, каб змясціцца на розных хост-платформах. Яна падтрымлівае толькі невялікую колькасць простых тыпаў даных, такіх як [[Булевы тып даных|булевыя]] значэнні, лічбы (па змаўчанні з плаваючай кропкай падвойнай дакладнасці і 64-бітныя [[Цэлы лік|цэлыя]]) і [[Радок (тып даных)|радкі]]. Тыповыя структуры даных, такія як [[Масіў (структура даных)|масівы]], [[Сэт (структура даных)|сэты]], [[
Lua рэалізуе невялікі набор пашыраных функцый, такіх як [[Першаклясная функцыя|першаклясныя функцыі]], [[Зборка смецьця (машыннае праграмаваньне)|зборка смецьця]], [[Замыканне (інфарматыка)|замыканьні]], правільныя [[Хваставы выклік|хваставыя выклікі]], [[Пераўтварэньне тыпу даных|пераўтварэньне]] (аўтаматычнае пераўтварэнне паміж радковымі і лікавымі значэннямі падчас выканання), [[Карутына|карутыны]] (кааператыўная шматзадачнасць) і [[Дынамічная загрузка|дынамічная загрузка модуляў]].
Радок 41:
</syntaxhighlight>
[[
<syntaxhighlight lang="lua">
-- аднарадковы
--[[
шматрадковы
камэнтар
]]
</syntaxhighlight>
{{anchor|Прыклад факторыял}}У наступным прыкладзе рэалізавана функцыя вылічэньня [[Фактарыял|фактарыялу]]:
<syntaxhighlight lang="lua">
Радок 166:
</syntaxhighlight>
Любыя будучыя выклікі <code>print</code> цяпер будуць накіроўвацца праз новую функцыю, з-за [[
Lua таксама падтрымлівае [[Замыканьне (інфарматыка)|замыканні]], як паказана ніжэй:
Радок 230:
</syntaxhighlight>
Табліца можа падысьці у якасьці [[Прастора імёнаў|прасторы імёнаў]], калі захоўваць у ёй функцыі.
<syntaxhighlight lang="lua">
Радок 277:
ExampleTable =
{
}
Радок 331:
=== Аб'ектна-арыентаванае праграмаванне ===
Нягледзячы на тое, што Lua не мае ўбудаванай канцэпцыі [[Кляса (праграмаваньне)|клясаў]], [[Аб’ектна-арыентаванае праграмаваньне|аб'ектна-арыентаванае праграмаванне]] можа эмулявацца з дапамогай функцый і табліц. Аб'ект фармуецца шляхам размяшчэння
У гэтым выпадку такога паняцця як «кляса» не існуе; хутчэй, гэта падобна да [[Прататыпнае праграмаваньне|прататыпнага ўспадкоўваньня]], як у [[Self]] або [[JavaScript]]. Новыя аб'екты ствараюцца альбо [[Фабрычны мэтад|фабрычным мэтадам]] (які стварае новыя аб'екты з нуля), альбо шляхам кланаваньня існуючага аб'екта.
Радок 375:
-- Канструктар клясы Vector
function Vector:new(x, y, z)
--[[ Так як мэтад створаны пры дапамозе двукроп'я,
"self" няяўна перадаецца як першы аргумэнт. ]]
Радок 395 ⟶ 396:
</syntaxhighlight>
====
<syntaxhighlight lang="lua">
Радок 406 ⟶ 407:
--- канструктар клясы Vector
function Vector:new(x, y, z)
--[[ Тут self спасылаецца на тую клясу, мэтод якой выклікаецца.
У вытворнай клясе self будзе гэтай самай вытворнай клясай,
у клясе Vector self будзе Vector. ]]
end
Радок 417 ⟶ 418:
end
local VectorMult = {}
VectorMult.__index = VectorMult
-- пазначаем VectorMult нашчадкам клясы Vector
setmetatable(VectorMult, Vector)
function VectorMult:multiply(value)
end
-- ствараем новы вэктар
local vec = VectorMult:new(0, 1, 0)
-- выклікаем мэтод, друкуе 1
print(vec:magnitude())
-- звяртаемся да поля y, друкуе 1
print(vec.y)
-- памнажаем усе складаныя вэктару на 2
vec:multiply(2)
-- зноў звяртаемся да поля y, атрымоўваем 2
print(vec.y)
</syntaxhighlight>
Lua таксама падтрымлівае [[
== Рэалізацыя ==
У адрозненьне ад большасьці віртуальных машын (якія звычайна [[Стэкавыя машына|стэкавыя]]), віртуальная машына Lua [[Рэгістравая машына|рэгістравая]] і больш нагадвае рэальную апаратную канструкцыю. Рэгістравая архітэктура пазбягае празмернага капіравання значэнняў і памяншае агульную колькасць інструкцый на функцыю. Віртуальная машына Lua 5 з'яўляецца адной з першых чыста рэгістравых віртуальных машын, якія атрымалі шырокае прымяненне.
Наступны прыклад - гэта байт-код функцыі фактарыялу, рэалізаванай [[#Прыклад факторыял|вышэй]] (згодна з кампілятарам <code>luac</code> 5.1):
function <factorial.lua:1,7> (9 instructions, 36 bytes at 0x8063c60)
1 param, 6 slots, 0 upvalues, 6 locals, 2 constants, 0 functions
1 [2] LOADK 1 -1 ; 1
4 [3] LOADK 4 -1 ; 1
9 [7] RETURN 0 1
== C API ==
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:
<syntaxhighlight lang="c">
#include <stdio.h>
// галоўная бібліятэка Lua (lua_*)
#include <lua.h>
// дапаможная бібліятэка Lua (luaL_*)
#include <lauxlib.h>
int main(void)
{
// пачынае працу з Lua
lua_State *L = luaL_newstate();
// загадваем Lua выканаць радок коду, які стварае функцыю foo
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 0;
}
</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 для пазнейшага выкарыстання.
=== Модулі ===
Акрамя стандартных бібліятэчных (асноўных) модуляў, можна пісаць пашырэнні з дапамогай 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 шырока выкарыстоўваецца ў якасці [[Скрыптовая мова|мовы сцэнарыяў]] у [[Распрацоўка відэагульняў|распрацоўцы відэагульняў]], галоўным чынам дзякуючы сваёй лёгкасці ўбудавання, хуткаму выкананню і кароткаму працэсу навучання. Сярод вядомых гульняў, якія выкарыстоўваюць 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]
[[Катэгорыя:Скрыптовыя мовы]]
[[Катэгорыя:Мовы праграмаваньня]]
[[Катэгорыя:Аб'ектна-арыентаваныя мовы праграммаваньня]]
[[Катэгорыя:Дынамічна тыпізуемыя мовы праграмаваньня]]
|