Lua: розьніца паміж вэрсіямі
Змесціва выдалена Змесціва дададзена
Няма апісаньня зьменаў |
Няма апісаньня зьменаў |
||
Радок 1:
{{Мова праграмаваньня|назва=Lua|лёга=[[File:Lua-Logo.svg|128px]]|парадыгма=[[Шматпарадыгмавая мова праграмаваньня|Шматпарадыгмавая]]: [[скрыптовая мова|скрыптовая]], [[Імпэратыўнае праграмаваньне|імпэратыўная]] ([[Працэдурнае праграмаваньне|працэдурная]], [[Прататыпнае праграмаваньне|прататыпная]], [[Аб'ектна-арыентаванае праграмаваньне|аб'ектна-арыентаваная]]), [[Функцыянальнае праграмаваньне|функцыянаяльная]], [[Мэтапраграмаваньне|падтрымлівае мэтапраграмаваньне]], [[Рэфлектыўнае праграмаваньне|рэфлектыўная]]|дата=1993|аўтар=Раберту Ерусалімскі<br />Вальдэмар Салес<br />Луіс Энрыке дэ Фігуэйрэда|вэрсія_стабрэліз=|дата_стабрэліз=|тыпізацыя=[[Дынамічная тыпізацыя|Дынамічная]], [[Моцная і слабая тыпізацыя|слабая]], [[Качыная тыпізацыя|качыная]]|рэалізацыі=[//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-->
▲[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
З 1977 па 1992 год у Бразілія праводзіла палітыку жорсткіх [[Гандлёвы бар'ер|гандлёвых бар'ераў]] (так званых рынкавых рэзерваў) у дачыненьні да кампутарнага
Папярэднікамі Lua былі мовы ''SOL'' (Simple Object Language - простая аб'ектная мова) і ''DEL'' (Data-Entry Language - мова
<!-- {{cite journal| last1 = Ierusalimschy | first1 = R. | author1-link = Roberto Ierusalimschy| last2 = Figueiredo | first2 = L. H.| last3 = Celes | first3 = W. | contribution = The evolution of an extension language: a history of Lua| contribution-url = https://www.lua.org/history.html| title = Proc. of V Brazilian Symposium on Prog. Lang.| year = 2001| pages = B–14–B–28}} --></ref> Яны былі незалежна распрацаваны ў Tecgraf у 1992–1993 гадах, каб дадаць некаторую гнуткасць у два розныя праекты (абодва былі інтэрактыўнымі графічнымі праграмамі для кампаніі Petrobras). У SOL і DEL не хапала структур кіравання патокам, і Petrobras адчувала ўсё большую патрэбу ў тым, каб дадаць да іх поўную магутнасць праграмаваньня.
Lua 1.0 быў распрацаваны такім чынам, што яго канструктары аб'ектаў, якія ў той час крыху
== Асаблівасьці ==
Lua звычайна апісваюць як
Увогуле, Lua імкнецца прадастаўляць простыя, гнуткія [[Мэтад (праграмаваньне)|мета-функцыі]], якія можна пашыраць па меры неабходнасці, а не набор функцый, характэрны для адной парадыгмы праграмавання. У выніку базавая мова выкарыстоўвае невялікі аб'ём памяці; скампіляваны [[інтэрпрэтатар]] займае толькі каля 247 [[Кілябайт|kB]]<ref name=luaabout />.
Як мова з [[Дынамічная тыпізацыя|дынамічнай тыпізацыяй]], прызначаная для выкарыстання ў якасці [[Скрыптовая мова|мовы сцэнарыяў]], Lua досыць кампактная, каб змясціцца на розных хост-платформах. Яна падтрымлівае толькі невялікую колькасць простых тыпаў даных, такіх як [[Булевы тып даных|булевыя]] значэнні, лічбы (па змаўчанні з плаваючай кропкай падвойнай дакладнасці і 64-бітныя [[Цэлы лік|цэлыя]]) і [[Радок (тып даных)|радкі]]. Тыповыя структуры даных, такія як [[Масіў (структура даных)|масівы]], [[Сэт (структура даных)|сэты]], [[Сьпіс|сьпісы]] і [[Запіс (структура даных)|запісы]], могуць быць прадстаўлены з дапамогай адзінай уласнай структуры даных Lua, табліцы, якая па сутнасці з'яўляецца гетэрагенным [[Асацыятыўны масіў|асацыятыўным масівам]].
Радок 27:
=== Сынтаксіс ===
Клясычная [["Hello, World!" праграма]] можа быць запісана наступным чынам, з дужкамі або без:<ref>{{cite web | url=https://www.lua.org/pil/1.html | title=Programming in Lua : 1}}</ref>
<syntaxhighlight lang="lua">
Радок 218:
</syntaxhighlight>
Табліца часта ўжываецца як структура (або [[Запіс (структура даных)|запіс]]), выкарыстоўваючы [[Радок (тып даных)|радкі]] ў якасці ключоў. Паколькі такое выкарыстанне вельмі распаўсюджана, Lua мае спецыяльны сынтаксіс для доступу да такіх палёў.<ref>{{cite web|url=https://www.lua.org/manual/5.1/manual.html#2.3|title=Lua 5.1 Reference Manual|access-date=2014-02-27|year=2014}}</ref>
<syntaxhighlight lang="lua">
Радок 271:
</syntaxhighlight>
Памер табліцы <code>t</code> вызначаецца як любы цэлы індэкс <code>n</code> такі што <code>t[n]</code> не <code>nil</code> і <code>t[n+1]</code> роўны <code>nil</code>; акрамя таго, калі <code>t[1]</code> <code>nil</code>, <code>n</code> можа быць роўным нулю. Для рэгулярнага масіву з ненулявымі значэннямі ад 1 да дадзенага <code>n</code> яго памер дакладна роўны <code>n</code>, індэксу яго апошняга значэння. Калі масіў мае "дзіркі" (нулявыя значэнні паміж іншымі значэннямі, выдатнымі ад нуля), то <code>#t</code> можа быць любым з індэксаў, які непасрэдна папярэднічае <code>nil</code> значэнню (гэта значыць, ён можа разглядаць любое такое нулявое значэнне як канец масіву).<ref>{{cite web|url=https://www.lua.org/manual/5.1/manual.html#2.5.5|title=Lua 5.1 Reference Manual|access-date=2012-10-16|year=2012}}</ref>
<syntaxhighlight lang="lua">
Радок 304:
</syntaxhighlight>
Выкарыстанне хэш-табліцы для эмуляцыі масіву звычайна павольней, чым выкарыстанне фактычнага масіву; аднак табліцы Lua аптымізаваны для выкарыстання ў якасці масіваў, каб пазбегнуць гэтай праблемы.<ref name=lobject_h_array>{{cite web|url=https://www.lua.org/source/5.1/lobject.h.html#array|title=Lua 5.1 Source Code|access-date=2011-03-24|year=2006}}</ref>
=== Мэтатабліцы ===
Радок 398:
==== Спадкаваньне ====
Спадкаваньне у Lua таксама магчыма з дапамогай мэтатабліц.<ref>{{cite book|title=Programming in Lua, 4th Edition|page=165|author=Roberto Ierusalimschy}}</ref> У наступным прыкладзе апэрацыя памнажэньня вэктара на канстанту рэалізаваная ў вытворнай клясе.
<syntaxhighlight lang="lua">
Радок 448:
</syntaxhighlight>
Lua таксама падтрымлівае [[множнае спадкаваньне]]; <code>__index</code> можа быць функцыяй або табліцай.<ref>{{Cite web|title=Programming in Lua : 16.3|url=https://www.lua.org/pil/16.3.html|access-date=2021-09-16|website=Lua}}</ref> [[Перагрузка апэратара]] таксама можа быць зроблена; мэтатабліцы Lua могуць мець такія элементы, як <code>__add</code>, <code>__sub</code> і гэтак далей.<ref>{{Cite web|title= Metamethods Tutorial|url=http://lua-users.org/wiki/MetamethodsTutorial|access-date=2021-09-16|website=lua-users wiki |url-status=dead |archive-url=https://web.archive.org/web/20210916182214/http://lua-users.org/wiki/MetamethodsTutorial |archive-date= Sep 16, 2021 }}</ref>
== Рэалізацыя ==
Праграма на Lua не [[Інтэрпрэтуемая мова|інтэрпрэтуецца]] непасрэдна з тэкставага файла, а [[Кампілятар|кампілююцца]] ў байт-код, які потым запускаецца на [[Віртуальная машына|віртуальнай машыне]] Lua. Увесь працэс звычайна нябачны для карыстальніка і выконваецца падчас працы. Кампіляцыя можа быць выкананы загадзя, каб паскорыць загрузку або, прыбраўшы кампілятар, паменшыць аб'ём памяці хост-асяроддзя. Кампіляцыя магчыма таксама ўнутры праграмы на Lua з выкарыстаньнем функцыі <code>dump</code> з бібліятэкі радкоў альбо адной з функцый <code>load/loadstring/loadfile</code>.<ref name="luaspe" /><ref name="luaabout" />
У адрозненьне ад большасьці віртуальных машын (якія звычайна [[Стэкавыя машына|стэкавыя]]), віртуальная машына Lua [[Рэгістравая машына|рэгістравая]] і больш нагадвае рэальную апаратную канструкцыю. Рэгістравая архітэктура пазбягае празмернага капіравання значэнняў і памяншае агульную колькасць інструкцый на функцыю. Віртуальная машына Lua 5 з'яўляецца адной з першых чыста рэгістравых віртуальных машын, якія атрымалі шырокае прымяненне.<ref name=lua5impl>{{cite journal| last1 = Ierusalimschy | first1 = R. | last2 = Figueiredo | first2 = L. H. | last3 = Celes | first3 = W. | title = The implementation of Lua 5.0| journal = J. Of Universal Comp. Sci.| volume = 11| issue = 7| pages = 1159–1176| year = 2005| url = http://www.jucs.org/jucs_11_7/the_implementation_of_lua/jucs_11_7_1159_1176_defigueiredo.html |doi=10.3217/jucs-011-07-1159 |doi-access=free }}</ref>
Наступны прыклад - гэта байт-код функцыі фактарыялу, рэалізаванай [[#Прыклад факторыял|вышэй]] (згодна з кампілятарам <code>luac</code> 5.1):<ref name=luavm51instr>{{cite web| author = Kein-Hong Man| title = A No-Frills Introduction to Lua 5.1 VM Instructions| year = 2006| url = https://talk.pokitto.com/uploads/default/original/2X/7/716c67a0b5b1636cbc4dc1fec232ca2536cb74d1.pdf}}</ref>
function <factorial.lua:1,7> (9 instructions, 36 bytes at 0x8063c60)
Радок 472:
== C API ==
Lua была распрацавана з мэтай убудавання ў іншыя праграмы, дзеля гэтага яна распаўсюджваецца разам з [[C (мова праграмаваньня)|C]] [[API]]. Які складаецца з дзвюх частак: ядро Lua і дапаможнай бібліятэкі Lua.<ref name="luarefman">{{cite web| url = https://www.lua.org/manual/5.2/| title = Lua 5.2 Reference Manual| publisher = Lua.org| access-date = 2012-10-23}}</ref> Апошняя складаецца ў асноўным з макрасаў прэпрацэсара, якія дапамагаюць са складанымі таблічнымі аперацыямі.
Lua C API заснаваны на [[Стэк|стэку]]. Lua забяспечвае функцыі для праштурхоўвання і выцягвання большасці простых тыпаў даных C (цэлыя лікі, плывучыя і г.д.) у стэк і са стэка, а таксама функцыі для маніпулявання табліцамі праз стэк. Стэк Lua некалькі адрозніваецца ад традыцыйнага стэка; напрыклад, яго можна непасрэдна праіндэксаваць. Адмоўныя індэксы паказваюць зрушэнні ад вяршыні стэка. Напрыклад, −1 з'яўляецца верхнім (апошняе значэнне), у той час як дадатныя індэксы паказваюць зрушэнні ад ніжняга (самае старое значэнне). Маршалінг даных паміж функцыямі C і Lua таксама выконваецца з дапамогай стэка. Каб выклікаць функцыю Lua, аргументы замяшчаюцца ў стэк, а затым <code>lua_call</code> выкарыстоўваецца для выкліку Lua функцыі. Пры напісанні функцыі C для непасрэднага выкліку з Lua аргументы счытваюцца са стэка.
Радок 531:
</syntaxhighlight>
C API таксама забяспечвае некаторыя спецыяльныя табліцы, размешчаныя ў розных "псеўдаіндэксах" у стэку Lua. У <code>LUA_GLOBALSINDEX</code> да Lua 5.2<ref name="Changes in the API, Lua 5.2 manual">{{cite web| url = https://www.lua.org/manual/5.2/manual.html#8.3 |first1=Roberto |last1=Ierusalimschy |first2=Luiz Henrique |last2=de Figueiredo |first3=Waldemar |last3=Celes | title = Changes in the API | work = Lua 5.2 Reference Manual| publisher = Lua.org| access-date = 2014-05-09}}</ref> знаходзілася глабальная табліца <code>_G</code>, якая з'яўляецца асноўнай [[Прастора імёнаў|прасторай імёнаў]]. Існуе таксама рэестр, размешчаны ў <code>LUA_REGISTRYINDEX</code>, дзе праграмы на C могуць захоўваць даныя Lua для пазнейшага выкарыстання.
=== Модулі ===
Акрамя стандартных бібліятэчных (асноўных) модуляў, можна пісаць пашырэнні з дапамогай Lua API. Скрыпты Lua могуць загружаць модулі пашырэння з дапамогай <code>require</code>,<ref name="luarefman" /> гэтак жа, як стандартныя модулі самой Lua, або з дапамогай <code>package.loadlib</code>.<ref>{{Cite web |title=Lua 5.4 Reference Manual |url=https://www.lua.org/manual/5.4/manual.html#pdf-package.loadlib |first1=Roberto |last1=Ierusalimschy |first2=Luiz Henrique |last2=de Figueiredo |first3=Waldemar |last3=Celes |access-date=2022-06-01 |website=Lua}}</ref> Калі бібліятэка C загружаецца праз <code>require('foo')</code> Lua выклікае функцыю <code>luaopen_foo</code>, якая дзейнічае як любая функцыя C, якую можна выклікаць з Lua, і звычайна вяртае табліцу, запоўненую мэтодамі. Модулі Lua, вядомыя пад назвай ''rocks,'' даступная праз сістэму кіравання пакетамі LuaRocks.<ref>{{cite web| url = https://luarocks.org/| title = LuaRocks| publisher = luarocks.org | access-date=2009-05-24}}</ref>
== Выкарыстанне ==
Lua шырока выкарыстоўваецца ў якасці [[Скрыптовая мова|мовы сцэнарыяў]] у [[Распрацоўка відэагульняў|распрацоўцы відэагульняў]], галоўным чынам дзякуючы сваёй лёгкасці ўбудавання, хуткаму выкананню і кароткаму працэсу навучання.<ref>{{cite web|url=https://stackoverflow.com/questions/38338/why-is-lua-considered-a-game-language |title=Why is Lua considered a game language? |website=Stack Overflow |access-date=2017-04-22 |url-status=dead |archive-url=https://web.archive.org/web/20130820131611/http://stackoverflow.com/questions/38338/why-is-lua-considered-a-game-language |archive-date=20 August 2013 }}</ref> Сярод вядомых гульняў, якія выкарыстоўваюць Lua, ''[[Roblox]]'',<ref>{{Cite web|title=Why Lua''u''?|url=https://luau-lang.org/why.html|access-date=2022-03-23|website=Luau|language=en-US}}</ref> ''[[Garry's Mod]]'', ''[[World of Warcraft]]'', ''[[Payday 2]]'', ''[[Phantasy Star Online 2]]'', ''[[Dota 2]]'', ''[[Crysis]]''<ref>{{cite web |url = https://crymp.net/thread?id=347 |title = Introduction to Crysis server-side modding |access-date = 23 March 2022}}</ref> і многія іншыя. Некаторыя гульні маюць мадыфікацыі, якія падтрымліваюць Lua, напрыклад, ComputerCraft для ''[[Minecraft]]''. Акрамя таго, Lua таксама выкарыстоўваецца ў праграмным забеспячэнні, не звязаным з відэагульнямі, такім як [[Adobe Lightroom]], [[Moho]], [[iClone]], [[Aerospike]] і пэўным сістэмным праграмным забеспячэнні ў [[FreeBSD]] і [[NetBSD]], а таксама выкарыстоўваецца ў якасці шаблоннай мовы сцэнарыяў на [[МэдыяВікі]] з выкарыстаннем пашырэння Scribunto.<ref>{{Cite web|title=Lua Functions|url=https://wow.gamepedia.com/Lua_functions|access-date=2021-03-01|website=wow.gamepedia.com|language=en-US}}</ref>
У 2003 годзе апытанне, праведзенае GameDev.net, паказала, што Lua была самай папулярнай мовай сцэнарыяў для праграмавання гульняў. 12 студзеня 2012 года Lua быў абвешчаны пераможцам прэміі Front Line Award 2011 ад часопіса ''Game Developer'' у катэгорыі «Сродкі праграмавання».
Радок 550:
== Зьнешнія спасылкі ==
* [//www.lua.org Афіцыйная старонка]
* [https://luarocks.org/ Lua Rocks -
[[Катэгорыя:Мовы праграмаваньня]]
[[Катэгорыя:
[[Катэгорыя:Аб'ектна-арыентаваныя мовы праграмаваньня]]
[[Катэгорыя:Дынамічна тыпізуемыя мовы праграмаваньня]]
|