Lua паўстала ў 1993 годзе як мова для пашырэння прыкладнога ПЗ для задавальнення попыту на наладжванне, які ўзрастаў у той час. Яна забяспечвала асноўныя магчымасці большасці працэдурных моў праграмавання, але больш складаныя або прадметна-спецыфічныя магчымасці не былі ўключаны; хутчэй, яна ўключала механізмы для пашырэння мовы, што дазваляе праграмістам рэалізоўваць такія функцыі. Паколькі Lua задумвалася як агульная ўбудаваная мова пашырэнняў, праекціроўшчыкі Lua сканцэнтраваліся на паляпшэнні яе хуткасці, партатыўнасці, пашыральнасці і прастаты выкарыстання пры напісанні праграм.
З 1977 па 1992 год у Бразіліі дзейнічала палітыка жорсткіх гандлёвых бар'ераў (так званых рынкавых рэзерваў) для камп'ютэрнага абсталявання і праграмнага забеспячэння. У такой атмасферы кліенты Tecgraf не маглі сабе дазволіць ні палітычна, ні фінансава купляць індывідуальнае праграмнае забеспячэнне з-за мяжы. Гэтыя прычыны падштурхнулі Tecgraf да распрацоўкі неабходных асноўных інструментаў з нуля.[5]
Папярэднікамі Lua былі мовы апісання/канфігурацыі даных SOL (мова простых аб'ектаў, англ.: Simple Object Language) і DEL (мова ўводу даных, англ.: data-entry language)[6]. Яны былі незалежна адна ад адной распрацаваны ў Tecgraf у 1992–1993 гадах, каб дадаць некаторую гнуткасць у два розныя праекты (абодва былі інтэрактыўнымі графічнымі праграмамі для інжынерных прыкладных праграм у кампаніі Petrobras). У SOL і DEL не хапала якіх-небудзь структур кіравання патокам, і Petrobras адчувала ўсё большую патрэбу ў тым, каб дадаць да іх поўную магутнасць праграмавання.
У «Эвалюцыі Lua» (The Evolution of Lua) аўтары мовы пісалі:[5]
«У 1993, адзіным сапраўдным сапернікам быў Tcl, які быў выразна зпраектаваны каб быць убудаваным у прыкладное ПЗ. Тым не меней, Tcl меў незвычны сінтаксіс, не мог прапанаваць добрай падтрымкі апісання даных і мог запускацца толькі на Unix-платформах. Мы не разглядалі LISP або Scheme з прычыны іх недружалюбнага сінтаксіса. Python быў яшчэ ў зачатку. У свабоднай зрабі-сам атмасферы, якая пазней запанавала ў Tecgraf, было даволі натуральным паспрабаваць распрацаваць нашу асабістую сцэнарную мову ... З-за таго, што большая частка патэнцыйных карыстальнікаў не былі бы прафесійнымі праграмістамі, мова павінна была пазбягаць таямнічага сінтаксіса і семантыкі. Пры прыўнясенні новай мовы ў жыццё мы павінны былі зыходзіць з яе партатыўнасці, бо кліенты Tecgraf мелі вельмі разнастайны набор камп’ютарных платформ. І, нарэшце, паколькі мы чакалі, што іншым прадуктам Tecgraf спатрэбіцца ўбудаванне сцэнарнай мовы, новая мова павінна была прытрымлівацца прыкладу SOL і пастаўляцца як бібліятэка з API для C».
Арыгінальны тэкст(англ.)
«In 1993, the only real contender was Tcl, which had been explicitly designed to be embedded into applications. However, Tcl had unfamiliar syntax, did not offer good support for data description, and ran only on Unix platforms. We did not consider LISP or Scheme because of their unfriendly syntax. Python was still in its infancy. In the free, do-it-yourself atmosphere that then reigned in Tecgraf, it was quite natural that we should try to develop our own scripting language ... Because many potential users of the language were not professional programmers, the language should avoid cryptic syntax and semantics. The implementation of the new language should be highly portable, because Tecgraf's clients had a very diverse collection of computer platforms. Finally, since we expected that other Tecgraf products would also need to embed a scripting language, the new language should follow the example of SOL and be provided as a library with a C API».
Lua 1.0 была распрацавана такім чынам, што яе канструктары аб'ектаў, у той час крыху адрозніваючыся ад цяперашняга лёгкага і гнуткага стылю, уключылі сінтаксіс апісання даных SOL (адсюль назва Lua: Sol азначае «Сонца» на партугальскай мове, а Lua азначае «Месяц»). Сінтаксіс Lua для структур кіравання ў асноўным быў запазычаны з Modula (if, while, repeat/until), але таксама быў пераняты ўплыў з CLU (шматлікія прызначэнні і шматлікія вяртанні з выклікаў функцый, як больш простая альтэрнатыва спасылачным параметрам або яўным паказальнікам), C++ («выдатная ідэя дазволіць аб’яўляць лакальную пераменную толькі там, дзе яна нам патрэбна»[5]), SNOBOL і AWK (асацыятыўныя масівы). У артыкуле, апублікаваным у часопісе Dr. Dobb's Journal, стваральнікі Lua таксама сцвярджаюць, што LISP і Scheme з іх адзіным усюдыісным механізмам структуры даных (спіс) аказалі вялікі ўплыў на іх рашэнне распрацаваць табліцу ў якасці асноўнай структуры даных Lua.[7]
З цягам часу семантыка Lua падвяргалася ўсё большаму ўплыву Scheme[5], асабліва з увядзеннем ананімных функцый і поўнага лексічнай вобласці. У новых версіях Lua было дададзена некалькі функцый.
Каментарый у Lua пачынаецца з падвойнага злучка і працягваецца да канца радка, падобна да Ada, Eiffel, Haskell, SQL і VHDL. Шматрадковы тэкст і каментарыі ўпрыгожваюцца падвойнымі квадратнымі дужкамі.
Функцыя фактарыяла рэалізавана як функцыя ў наступным прыкладзе:
Matheson, Ash. An Introduction to Lua(нявызн.)(недаступная спасылка). GameDev.net (29 красавіка 2003). Архівавана з першакрыніцы 18 December 2012. Праверана 3 January 2013.
Fieldhouse, Keith. Introducing Lua(нявызн.)(недаступная спасылка). ONLamp.com. O'Reilly Media (16 лютага 2006). Архівавана з першакрыніцы 12 сакавіка 2006. Праверана 16 лістапада 2022.
Streicher, Martin. Embeddable scripting with Lua(нявызн.)(недаступная спасылка). developerWorks. IBM (28 красавіка 2006). Архівавана з першакрыніцы 2 July 2009. Праверана 7 July 2018.