[[분류:프로그래밍 언어]][[분류:스크립트 언어]] [include(틀:프로그래밍 언어)] [[파일:Lua 로고.svg|width=300&align=right]] [목차] [clearfix] == 개요 == {{{#!syntax lua print("Hello, world!") -- print "Hello, world!" 도 허용된다. | 해당 부분을 실행하면 OutPut에 Hello, world!가 출력된다. }}} [[http://www.lua.org/|홈페이지]] 1993년에 개발된 [[프로그래밍 언어]]. [[브라질]] [[리우데자네이루]]의 교황청대학교에서 호베르투 예루잘링스키[* Roberto Ierusalimschy. 1960년생으로 컴퓨터과학자이며 상단의 리우 교황청 대학과 [[스탠포드 대학]]에서 부교수로 역임한 적이 있다. ~~위키백과에선 성씨를 이에루잘림[[스시]](...)라고 표기하고 있다~~] 및 2명이 공동제작했으며 이름도 [[달]]을 의미하는 [[포르투갈어]] 단어에서 따왔다. 스크립트 언어를 하나의 목적으로 가지고 있기 때문에 굉장히 작고 가벼운 인터프리터형 언어이다. 현재 안정버전은 5.4이다. 태생 자체가 [[C언어|C]]/[[C++]] 프로그램 내부에 포함(embed)시키기 매우 쉬운 깔끔한 문법의 가벼운 스크립트 언어를 목표로 개발되었다. 교황청대학교 컴퓨터 그래픽 기술 연구소(Tecgraf)에서 내부적으로 개발해서 사용하던 기존의 데이터 처리용 스크립팅 언어 SOL과 DEL의 한계를 극복할 더 강력한 언어가 요구되었다고 한다.[* 출처: The evolution of Lua] == 언어적 특징 == === 가벼움 === 인터프리터(또는 후술한 JIT 컴파일러)의 용량이 일백 수십KB[* 상대적으로 덩치가 큰 LuaJIT조차 300KB 정도 된다.] 정도로 작고 굉장히 빠르다. 그 흔한 정수도 없을 정도로[* 5.3버전에 정수가 추가되었다. 이때문에 Lua 커뮤니티 파편화가 진행중이다. 아래 참고.] 굉장히 적은 수의 데이터형만을 지원하긴 하지만 그만큼 가볍다. 다양한 프로그램에 쉽게 붙일 수 있는 이유도 용량과 속도의 부담이 적기 때문. 그러면서도 다양한 패러다임을 가지고 있는데, 절차적으로도, 객체지향적으로도, 함수형으로도 이용할 수 있다. === 문법적 특징 === 언어의 문법이 굉장히 단순한 편이다. 다만, [[C언어]] 스타일의 언어들과 비교했을 때 다른 점이 많다는 것이 특징이다. * 기본적인 자료형은 {{{nil, boolean, number, string, function, table, userdata, thread}}}로 8가지가 있다. * 널 값을 타언어에서는 {{{null}}}로 쓰지만 Lua에서는 {{{nil}}}로 써야 한다. * 진리값은 {{{boolean}}} 타입일때 {{{true}}}는 참, {{{false}}}는 거짓이다. {{{boolean}}} 타입이 아닐 경우 {{{nil}}}이 거짓이고 나머지는 모두 참이다. 그래서 C언어와는 달리 {{{0}}}도 참이다. 쉽게 말해 {{{false}}}와 {{{nil}}}만 거짓이다. * {{{==}}}의 반대 연산자로 보통은 {{{!=}}}, {{{<>}}}등을 많이 사용하는데, Lua에서는 {{{~=}}}를 쓴다. * 논리연산자도 타 언어에서 {{{!, &&, ||}}} 등을 사용하는데 lua에서는 단어 그대로 {{{not, and, or}}}로 쓴다. * bitwise 연산자는 Lua 5.3에서 추가되었다. {{{&, |, ~(이항 비트 XOR), >>, <<, ~(단항 비트 NOT)}}} * {{{^}}}가 {{{xor}}} 관련이 아닌 {{{pow}}}, 즉 거듭제곱이다. * {{{A+=B}}} 같은 복합 대입 연산자는 지원하지 않으며 무조건 {{{A = A + B}}}처럼 작성해야 한다.[* [[Roblox Studio]]의 luau와 같이 복합 대입 연산자를 지원하는 경우에는 {{{A += 1}}}처럼 쓸 수 있다.] * 문자열 합치기는 {{{A..B}}}이다. * {{{self}}}라는 예약어 아닌 예약어가 존재한다.예약어(reserved keywords)로 분류되지는 않지만, 콜론을 사용한 함수 호출시에 self 변수를 다른 OOP 언어에서 제공하는 this나 self 변수처럼 함수 안에서 사용이 가능하다. * 반복 제어문에 {{{continue}}}가 없지만 대신 [[GOTO|{{{goto}}}]]가 있어서 비슷하게 만들어낼 수 있다.[* [[Roblox Studio]]에서는 {{{continue}}}가 존재한다.] * 인덱스가 1부터 시작한다. * 함수가 일급객체다. 예컨대, 함수를 만들어 변수에 대입하는 방식으로 작성이 가능하다. {{{function(argument) return argument end}}} 같이 한 줄로 쓸 수 있다. * 기본 자료형에 {{{thread}}} 타입이 있으나, 실제로는 {{{coroutine}}}이다. * 문자열 패턴 매칭이라는, [[정규 표현식]]과 유사한 기능을 지원한다. 다만, 정규 표현식과 다르고 기능도 훨씬 단순하다. Lua 창시자가 직접 만든 라이브러리 [[http://www.inf.puc-rio.br/~roberto/lpeg/|LPeg]]가 사실상 표준 패턴 매칭 라이브러리다. * 다른 언어들과는 달리 삼항 조건 연산자 {{{(condition ? exprIfTrue : exprIfFalse)}}} 를 지원하지 않는다. {{{condition and exprIfTrue or exprIfFalse}}} 표현으로 대체 가능하다. 정확히는 {{{exprIfTrue}}}가 참이라는 보장이 있어야 대체 가능하다. * Lua에서는 주석을 {{{--Hello, World!}}} 처럼 {{{--(문자)}}} 형식으로 적는다 * {{{--(문자)}}}형식 주석은 한 줄에만 적용되어서 주석을 여러줄 쓰려면 {{{--[[문자]]--}}} 이런식으로 적는다 === 테이블 === 다른 언어의 배열과는 다르게 다양한 자료형을 키로 사용가능한데, 이것을 가지고 단순한 구조체, 배열 뿐만 아니라 객체, 클래스, 인터페이스 등을 다 구현해 낼 수 있다. 사실 Lua의 테이블은 단순히 저장하는 것이 아니라 메타테이블과 같이 써서 테이블에 기능을 붙일 수 있기 때문이다. 그래서 Lua를 잘 다루려면 테이블과 메타테이블을 잘 다룰 수 있어야 한다. === [[함수형 언어|함수형 프로그래밍]] === Lua도 일단은 함수형 프로그래밍이 어느정도 된다. 함수를 [[익명함수]]로 생성할 수도 있고 전달할 수도 있다([[JavaScript]]에서 지원하는 정도와 비슷하다). 그리고 사실 파일로 저장해서 불러오는 스크립트 '''자체'''가 함수다. 대신 성능을 위해서 스택의 크기가 고정되어 있기 때문에 어떤 함수든지 지역변수를 255개 이상 만들 수가 없다. 대신 전역범위에 저장하는 _G라는 테이블이 존재한다. [[클로저#s-8]]와 익명함수를 지원한다.[* 엄밀히 말하면 Lua에는 [[클로저#s-8]]만 존재하고, 나머지는 syntactic sugar.] 다만 함수형 프로그래밍에서 흔히 쓰이는 {{{map}}}, {{{filter}}}, {{{reduce}}} 등의 함수가 기본적으로 제공되지는 않는다. == [[파편화]] == 중요한 Lua 커뮤니티 파편화가 시작되었다. Lua 5.3버전이 64비트 부동소수점 타입[* 요즘 [[C언어|C]]/[[C++]]의 double은 대개 IEEE754표준 64비트 부동소수점 타입.]을 명확히 지원하기 위해서 정수형 타입을 도입한 것이 기존의 Lua코드와 호환성 문제를 일으키게 된 것이다.[* 기본 숫자 타입은 여전히 number 뿐이다. math.type()을 통해서 서브 타입을 확인해야만 64비트 부동소수점 타입인 경우에는 ~~double이라고 할 것이지 헷갈리게~~ float, 정수형인 경우에는 integer라고 구분되어 표시된다.] 게다가 LuaJIT을 개발하고 사실상 혼자 유지보수하던 Mike Pall이 앞의 정수형 문제와 기타 몇 가지 이유를 더 들어 5.3 버전을 공개적으로 크게 비판하고 LuaJIT은 Lua 5.1까지만 지원하고 자신은 더이상 개발에 관여하지 않겠다고 선언해서 문제가 매우 복잡해졌다.[* 이후에 사람들이 대체 maintainer를 [[https://news.ycombinator.com/item?id=9981802|공개모집]]했으나 적당한 사람을 찾는데 실패했다.] 때문에 LuaJIT에 의존해 성능 향상을 꾀하던 대다수의 Lua 라이브러리가 Lua 5.1까지만 지원하고 후속 개발이 진행되지 않는 사태에 이르렀다. 현재 Lua 커뮤니티는 순정 인터프리터로도 충분한 상황의 개발자와, LuaJIT과 기타 라이브러리가 꼭 필요한 개발자들로 양분되어버렸다. [[Python|파이썬]]이 파이썬2와 파이썬3로 나뉘어 파편화가 진행되었던 것과 비견된다.[* 2008년 파이썬3가 발표된 이후에, 파이썬 커뮤니티의 파편화가 성공적으로 봉합되기까지 10년 남짓한 긴 시간이 소요되었다.] Lua가 임베딩용 언어라는 특징과 맞물려 (파이썬의 경우보다도) 파편화가 더 고착화될 가능성도 있는데, 어차피 임베딩이 주 목적인 언어이므로 JIT가 지원되는 5.1만으로도 충분하다는 입장도 있다. 어차피 임베딩 환경에 의존하는 상황에서는 필요한 기능이 환경 자체에서 주어지므로 Lua 수준의 기능 추가는 불필요하며, 오히려 문법이 고정되어 버리는 편이 하위호환성에 더 낫다는 이유.[[https://github.com/neovim/neovim/wiki/FAQ#why-embed-lua-instead-of-x|#]] ==== [[http://luajit.org/|LuaJIT]] ==== Lua의 [[JIT]] [[컴파일러]]며, 여타 프로그래밍 언어의 JIT보다 더 우수한 성능을 보여준다. 주로 [[JavaScript|V8]]와 비교되는데, 자료구조 성능을 제외하면 전반적으로 Lua 쪽이 성능이 더 좋다. [[Python]], [[Ruby]]와 비교해도 수십배 정도가 더 빠르다. [[JavaScript]]와 Lua는 문법과 패러다임이 90% 이상 비슷한 사촌언어격이지만 JIT 성능의 구현 측면에 있어서는 JavaScript가 가진 문법 일부가 성능 향상에 약점으로 작용한다고 한다. 참조 또한 메모리 사용량에 있어서 LuaJIT이 더 나은 최적화를 보여주고 있다. 따라서 [[Node.js]]를 LuaJIT 기반으로 다시 작성한 Luvit이라는 프로젝트가 활성화되었다. 홈페이지에 따르면 인터프리터를 손수 [[어셈블리어]]로 작성했으며, 이미 상당한 수준의 최적화가 되어있다고 한다. [[Python]]의 JIT 컴파일러인 [[PyPy]]가 자기 자신으로 JIT을 구현하는 것과 대조되는 부분. Lua가 그나마 단순한 언어라 이런 일이 되는 듯하다. 또한, 안 그래도 손쉬운 [[C언어]]와의 인터페이스 작업은 LuaJIT의 FFI(Foreign Function Interface)를 이용하면 [[로우 레벨#s-3|Low-Level]] C언어 함수들을 별다른 작업 없이 직접적으로 사용할 수 있다. 이 FFI 방식으로 인해 스크립트 - 네이티브 코드 간 호출규약을 맞추기 위한 별도의 작업이 사실상 필요가 없어지고, C 자료형을 직접 사용할 수 있게 되며 호출 성능은 네이티브에 견줄만큼 빨라지기 때문에, 일단 JIT을 사용하게 되면 기존 Lua 바인딩 코드를 사용할 일이 극히 적어진다. 이 FFI 방식은 이후 [[Python]]의 CFFI 라이브러리에 많은 영감을 주었다([[Node.js]]의 node-ffi도 상당한 영향을 받은 것으로 추정된다). 네이티브에 견줄만큼 속도가 빠르고, 메모리 사용량이 매우 적기 때문에 최근 [[NGINX]]에 LuaJIT을 포함시켜서 커스터마이징을 한 OpenResty 웹 서버가 인기를 끌고 있다. CDN 서비스로 유명한 [[Cloudflare]]와 알렉사 Top 13 규모의 세계에서 가장 큰 C2C 상거래 서비스(지마켓/옥션을 생각하면 된다)인 [[타오바오]]에서 주-웹서버로 사용하고 있으며 두 회사의 개발자들이 OpenResty 개발을 주도하고 있다(단 [[Cloudflare]]의 CDN 서비스는 사실 [[NGINX]]에 LuaJIT으로 코드를 올려 커스터마이징한 서비스들이다. 그래서 타사와 달리 진정한 CDN 서비스가 아니라는 비평도 있다). 알파고로 유명한 [[구글 딥마인드]]가 알파고의 기반인 Q-Learning을 구현할 때 사용된 Torch 머신러닝 미들웨어도 LuaJIT으로 작성되어 있다(딥마인드 사의 구인공고는 그래서 [[C언어|C]]/[[C++]]와 Lua 스크립트가 필수역량으로 적혀있다). == 파생 언어 == C/C++ 언어와 함께 사용하기 편하다는 확실한 장점으로 인해 여러 가지 파생 언어가 나와 있다. * [[https://luau-lang.org/|luau]]: [[Roblox]]에서 만든 언어. Lua 5.1을 기반으로 [[https://luau-lang.org/compatibility|이후 추가된 여러 가지 기능이 추가]]되었으며, 타입 시스템과 복합 연산자(*=, += 등)를 지원한다. * [[https://ravilang.github.io/|ravi]]: Lua 5.3에 JIT 컴파일과 타입 기능을 제공하는 언어. * [[https://github.com/teal-language/tl|teal]]: Lua에 타입을 추가한 언어. * [[https://terralang.org/|terra]]: 타입 시스템이 추가되었으며, 메타 프로그래밍에 중점을 두었다고 한다. * [[https://nelua.io/|Nelua]]: Lua의 문법을 기반으로 한 시스템 프로그래밍 언어. C를 거쳐 기계어로 컴파일된다. 이 외에도 다른 언어에서 Lua로 트랜스파일되는 언어/도구들도 존재한다. * [[https://typescripttolua.github.io/|typescript to lua]]: TypeScript를 Lua로. * [[https://moonscript.org/|moonscript]] * [[https://fennel-lang.org/|fennel]]: [[LISP]] 문법을 차용하였다. == 다른 언어들과 비교 == === [[Python]]과의 비교 === [[Python|파이썬]]과 자주 비교가 되는데, 두 언어의 초기 개발 목표의 차이가 현재의 두 언어가 갖는 거의 모든 차이의 원인이라고 볼 수 있다. 파이썬은 깨끗한 문법의 고급(high-level) 범용(general) 프로그래밍언어가 개발 목표였고 부수적으로 다른 언어와의 쉬운 접착(glue) 기능이 제공되는 반면에, Lua는 [[C언어|C]]/[[C++]] 프로그램에 내포(embed)되는 것을 기본 사용례로 가정하고 개발되었고 부수적으로 고급(high-level) 범용(general) 프로그래밍 언어로도 사용할 수 있는 것이다. 즉, 인터프리트형 스크립트 언어라는 공통점을 제외하면 강조하고 있는 점이 거의 정반대이다. 그리고 파이썬이 접착(gluing)이 쉬운 언어이지 내포(embedding)가 쉬운 언어는 아니라는 점도 주목할 만하다. 따라서 [[Python|파이썬]] 커뮤니티에서 잘 쓰이는 표현대로 '배터리가 포함된'[* 기본으로 포함된 라이브러리가 기능이 풍부해 다른 외부 모듈이 필요없다는 뜻.] 파이썬은 어느정도 단독으로 프로그램을 만들 수 있는 환경인 반면, Lua는 기본중의 기본 기능만을 포함하고 있어 단독으로 응용프로그램을 만들려면 손에 꼽히는 외부 라이브러리[* 주로 [[https://luarocks.org|LuaRocks]]에서 구할 수 있다.]를 포함하고도 이것저것 직접 구현해야 하는 어려움이 있다. 너무 없어 불편하니 배터리가 포함된 LuaDist나 Lua for Windows같은 프로젝트도 있다. 물론 관점을 바꾸어서 [[C언어|C]]/[[C++]] 프로그램에 내포할 때를 가정하면, [[Python|파이썬]]은 기본으로 import되는 라이브러리[* embedding 상황에서는 잘 쓰이지 않는 것들도 기본 라이브러리에 많이 들어있다.]가 많아 메모리 사용량이 큰데 비해 사실상 아무것도 없어 극도로 가볍고 빠른 것이 Lua의 장점이라고 하겠다.[* [[Python|파이썬]] 개발자가 작성한 다음의 [[https://eev.ee/blog/2016/04/30/embedding-lua-vs-python/|논의]]를 참고. embedding이라는 분야만 한정했을 때 Lua가 더 직관적임을 설명하고 embedding 목적으로 파이썬을 꼭 써야 한다면 생각해볼 수 있는 대안을 제안하고 있다.] 그리고 [[Python|파이썬]] 커뮤니티에서도 Lua와 비교해서 embedding 기능쪽으로 부족함을 인지하고, 최근 영역 확장을 시도하고 있다. 파이썬이 스크립트용으로 내포된 유명한 프로그램으로는 3dx Max, Blender가 있다. ~~둘 다 그 자체로 덩치 큰 프로그램~~[* Lua를 직접 언급하며 [[Python|파이썬]]도 이쪽으로 좀 더 잘 할 수 있지 않을까 논의하는 영상: [[https://youtu.be/d1a4Jbjc-vU?t=1215|The Future of Python]]] === [[JavaScript]]와의 비교 === 자주 비교되는 [[Python|파이썬]]보다는 오히려 [[JavaScript]]가 프로그램 언어 차원에서 Lua와 굉장히 유사한 면이 많다.[* Lua는 깔끔한 문법의 JavaScript라는 댓글이 레딧 등 인터넷 게시판에 가끔 보일 정도.] 그래서 JavaScript에 있는 것을 Lua로 옮기는 경우도 있는데 예로 [[Node.js]]를 Lua로 옮긴 Luvit등이 있다. 하지만 [[JavaScript]]가 웹 인터페이스 개발의 필수요소가 된 이후에 구글등의 대기업들이 큰 돈과 인력을 동원해서 JIT 컴파일러 개발 및 기타 라이브러리 개발에 힘을 쏟아부었기 때문에, 언어 자체의 유사성이 큰 것과는 별개로 두 언어의 인기도나 개발자 수등에서 이제 비교할 수 없을 정도로 큰 격차가 생긴 것도 사실이다. 유사한 두 언어가 웹 인터페이스에는 [[JavaScript]], 게임에는 Lua라는 식으로 각자의 영역을 하나씩 차지하고 있는 셈인데, 2020년을 전후해서 JavaScript를 Lua처럼 게임용 스크립트 언어로 사용하려는 몇몇 시도들도 존재한다.~~영역 침범~~ == 용도 == * Lua를 내포할 경우에 [[C언어|C]]/[[C++]] 프로그램 개발 과정에서 리컴파일이나 리로딩없이 바로 설정 변화를 적용할 수 있게 되는 점 때문에 특히 게임업계에서 많이 쓰인다. * 개발의 편의를 위해서 Lua를 내부적으로 활용하는 일 이외에도, 아예 게임 코드를 Lua로 작성하는 경우도 있다. 예를 들면 RPG 게임 등에서 개별 NPC의 AI나 기타 행동 정의를 위한 스크립트로도 쓰이고 있다. * API를 유저들에게 공개하여 [[MOD#s-4|MOD]] 제작이나 게임의 커스텀 UI 설정 스크립트 언어로 쓰이기도 한다. === 실제 사용 예 === ==== 게임 ==== [[https://en.wikipedia.org/wiki/Category:Lua_(programming_language)-scripted_video_games|Lua가 쓰인 게임 목록]] * 고전 게임인 [[원숭이 섬 시리즈]]의 개발 언어가 2000년에 [[SCUMM]]에서 Lua로 변경되면서, 게임 내에 자주 등장하는 술집인 SCUMM bar가 Lua bar로 개명된 것은 유명한 개그이다. '''Lua가 프로그래머들, 특히 게임 프로그래머들 사이에서 인기를 끌게 된 시작점이다.''' * 2004년에는 [[월드 오브 워크래프트]]에서 Lua를 통해 유저들이 UI를 직접 제작할 수 있게 되면서 일반 게이머들에게도 인지도를 얻었다. '''Lua가 국내외의 일반 게이머들에게 널리 알려지게 된 시작점이다.''' 월드 오브 워크래프트의 커다란 성공 덕분에, Lua를 월드 오브 워크래프트 전용 스크립트 언어로 [[https://www.quora.com/Whats-the-use-of-Lua-programming-language-other-than-scripting-for-World-of-Warcraft|착각]]한 국내외의 게이머가 매우 많다. 여기에 쓰인 Lua의 버전은 5.1이다. * [[라그나로크 온라인]]에서 NPC의 AI와 호문클루스의 AI, 용병의 AI에 Lua가 쓰였으며, 이 가운데 호문클루스와 용병은 유저가 직접 변경이 가능했다. 3차 직업군이 등장할 즈음에 용병의 AI를 변경하여 거의 0프레임 수준의 스킬이 가능하다는 게 여기저기 알려져 너도 나도 창용병 무명섬 3층 고고싱을 외친 적이 있다. * [[게리 모드]]에서도 Lua를 지원하고, 일부 [[소스 엔진]] 기반 게임(또는 모드)들도 Lua를 사용한다. * [[Grand Theft Auto IV]]에도 Lua 스크립트 모드가 있다. [[Grand Theft Auto: San Andreas]]의 멀티플레이어의 하나인 MTA: San Andreas의 서버를 작성한 언어다. [[Tool-Assisted Speedrun|TAS]] 영상을 만드는 데에도 일부 사용한다. 또한 유저 스크립트 제작에도 lua 언어가 사용된다. * 한게임에서 제공 중인 오픈 마켓형 게임 툴인 아이두게임의 기본 언어. 초보 프로그래머들을 위해서 배려를 해준 것이라고. * [[로블록스]](Roblox)의 모든 게임이 이 루아 기반으로 돌아간다.[* 참고로 Roblox는 Lua 5.1 기반으로 만든 Luau를 사용 중이다.] 여담으로 로블록스의 핵(스크립트)은 게임 내 시스템을 변형시켜야 하기 때문에 이것도 루아로 작성된다. Roblox의 게임 개발 엔진인 Roblox Studio에서의 개발도 마찬가지. * 2015년에는 [[http://coronalabs.com/|Corona sdk]]라는 게 나온 덕분에 Lua만 배워서 게임 하나 뚝딱 만들어 내는 게 가능해졌다. 2015년 12월 기준으로 iOS, 안드로이드 모두 지원된다. * [[https://love2d.org/|Love2d]]라는 [[C++]]([[SDL]])에 접착시켜 만든 게임 개발 프레임워크가 Lua를 사용해 코딩한다. [[Not Tetris 2]], [[Not Pacman]], 포탈 마리오 등 꽤나 흥행한 게임들을 탄생시켰지만 인지도가 그닥 높지 않다. ~~한국에는 커뮤니티조차 없다~~ * [[피니엔진]]이 cocos 2d-x의 Lua 모듈을 통해 개발되었다. 자체 스크립트인 LNX 스크립트 또한 컴파일 과정을 통해 Lua 코드로 변환한 뒤 사용된다. * [[스텝매니아]]에서도 Lua를 사용하여 기믹 패턴을 만들 수 있다. 기존의 [[XML]]방식의 스크립트에서 간소화한 것. [[https://quietly-turning.github.io/Lua-For-SM5/|영문 설명 링크]] * 게임 [[크루세이더 킹즈]]에도 쓰였다. * 스타크래프트1 유즈맵 편집기인 SCM draft 2의 플러그인 TEP의 기반 언어다. * [[네코랜드 스튜디오]]의 스크립트로 Lua를 사용한다. * [[The Powder Toy]]의 스크립트와 MOD는 Lua로 작성된다. * [[심시티 4]]의 일부 특수 건물 기능이나 운전 미션은 Lua 스크립트로 작성되어 있다. 그러나 플러그인 dat 파일 안에 저장되어 있어 열거나 편집하려면 별도의 에디터가 필요하다. * [[Command: Modern Air / Naval Operations]]에서 시나리오를 제작할 때 여러 방면으로 사용한다. 예를 들면 헬기나 수송기에서 병력을 내리는 것도 수송작전이 정식으로 패치되기 전까지는 정상적인 방법으로 불가능했기 때문에 시나리오 제작자가 Lua 스크립트를 이용해야 했다. * [[스타크래프트]] 리마스터 맵 에디터에서 유즈맵 제작시 SCM Draft로 작업할 때 트리거의 노가다를 획기적으로 줄여주는 플러그인을 사용할 수 있는데 이것이 Lua 언어로 작성된다. * [[https://www.cheatengine.org/|Cheat Engine]] 스크립트 제작에 사용된다. * [[게임가디언]]의 스크립트 파일로 쓴다. * [[https://www.minetest.net/|minetest]]에서 API를 lua로 제공하고 있다. * [[메이플스토리]]에서도 [[https://career.nexon.com/user/recruit/notice/noticeView?joinCorp=NX&reNo=20200071|사용한다.]] 다만 실제 내부 개발은 C++ 기반으로 진행되고, 기획 단계에서의 구현을 lua로 작성한다. * [[카스온라인]]에서 스튜디오 맵 제작시 lua가 사용되기도 한다. 직접 코드를 넣을 수 있어 능력자가 작정하고 만든다면 아예 새로운 게임을 만드는 수준으로 맵을 제작하는 게 가능하다. * Stormworks에서 커스텀 UI 제작, 미션 맵 제작뿐만 아니라 복잡한 제어 로직을 lua를 이용해 구현할 수 있다. * [[가디언 테일즈]]에서도 클라이언트 데이터를 확인하면 다수의 lua 스크립트를 확인할 수 있다. 실제로 구인 사이트에서 우대사항에 lua가 있다. 스테이지 내부 로직을 실제 개발에 사용하는 것으로 추정. * [[엘소드]]와 [[그랜드체이스]]는 같은 [[KOG|회사]]에서 나온 만큼 데이터 스크립트가 Lua로 작성된다. * [[시드 마이어의 문명]]의 맵 생성 스크립트는 Lua로 작성되어 있다. ==== 일반 응용 소프트웨어 ==== * [[다빈치 리졸브]]에서 내부 스크립트 언어로 사용된다. 특히 모션그래픽 워크벤치인 Fusion에서 많이 이용된다. * [[SmartThings]]에서는 Lua 스크립트를 응용해 사물인터넷(IoT) 드라이버를 구축하는 데에 쓸 수 있다. * 자막 제작용 소프트웨어인 [[Aegisub]]에서도 Lua 스크립트를 응용해 자동화 기능을 사용할 수 있다. * [[https://www.wireshark.org/|Wireshark]] 플러그인 제작에 사용된다. * [[https://nmap.org/|Nmap]]은 port 스캔에 활용되는 프로그램이며, NSE(Nmap Scripting Engine)로 코드를 작성할 때 Lua가 사용된다. * Scribunto 확장 기능을 설치하면 [[미디어위키]]에서 lua로 틀을 만들 수 있다. * 텍스트 에디터 [[https://neovim.io|Neovim]]은 Lua 스크립트 지원을 전면에 내세우며 기존의 [[vim]]과 차별화를 꾀하면서 인기를 얻고 있다. * Lua를 [[Java]]로 만든 [[http://www.luaj.org/luaj/3.0/README.html|Luaj]]를 이용해 자바에서 직접 Lua 5.1 스크립트를 실행시킬 수 있다! 단점은 관련 정보가 적다는 것. Lua 5.3을 Java에 심기 위해 만든 [[https://github.com/mjanicek/rembulan|Rembulan]]도 있다. * Ti-nSpire 계산기의 프로그래밍 언어다. [[공학용 계산기]]는 복수 프로그래밍 언어를 지원하는 경우가 많은데, [[텍사스 인스트루먼트|Ti사]] 제품의 경우 Lua, [[C언어]], Ti-BASIC 등의 언어를 지원한다. Lua의 경우 컴퓨터로 프로그래밍해서 nSpire으로 보내는 방법으로 프로그래밍한다. * [[아이패드]]로 코딩해서 만든 Lua 개발 툴도 있다. 이름은 공개 당시 Codify, 현재 [[http://twolivesleft.com/Codea/|Codea]]이다. 정확히는 Lua를 기반으로 사용하지만 앱내에서 개별적으로 함수나 API 등을 제공한다. * [[https://github.com/Hammerspoon/hammerspoon|Hammerspoon]] MacOS 환경에서 매크로를 제작하여 설정한 단축키로 편리하게 사용이 가능하다. 해당 프로그램에서 사용되는 설정 파일을 lua로 작성해야 한다. * [[Rust(프로그래밍 언어)|Rust]]로 제작된 터미널 에뮬레이터인 [[https://github.com/wez/wezterm|wezterm]] 에서 config 파일을 lua로 작성한다. * 로지텍 일부 게이밍 프로파일러 버전과 로지텍 게이밍 소프트웨어에 키보드 스크립트 언어로 쓰였다. ==== 기타 ==== * [[위키미디어 재단]]을 비롯한 [[미디어위키]] 엔진을 사용하는 위키에서 [[https://ko.wikipedia.org/wiki/위키백과:루아|모듈]]을 제작할 때 사용하는 언어이다. 미디어위키의 확장 기능 중 하나인 [[https://www.mediawiki.org/wiki/Extension:Scribunto|Scribunto]]를 설치하면 사용할 수 있다. 루아 코드는 {{{모듈}}}이라는 이름공간에 저장된다. [[리브레 위키]]에 루아를 간단히 강의하는 [[https://librewiki.net/wiki/시리즈:쉽게 배우는 프로그래밍 입문/Lua|문서]]도 있으니 배워 보고 싶다면 참고하자.