Lua

print("Hello, world!")

lua.gif

Lua
[1]

1 개요

1993년 개발된 프로그래밍 언어. 이름은 달을 의미하는 포르투갈어 단어라고 한다. 스크립트 언어를 하나의 목적으로 가지고 있기 때문에 굉장히 작고 가벼운 인터프리터형 언어이다. 현재 안정버전은 5.3

2 설명

태생 자체가 가벼운 스크립트 언어이며, C/C++에 접착시키기 매우 쉽다. 개발 과정에 있어서 재컴파일이나 리로딩없이 바로 설정 변화를 적용할 수 있는 점 때문에 특히 게임업계에서 많이 쓰인다. 한국에선 월드 오브 워크래프트에서 유저들이 UI를 직접 제작할 수 있게 됨으로서 일반 게이머들에게도 인지도를 얻었는데, 사실 그전에도 여러 게임에 쓰였다. 루아가 쓰인 게임들 리스트 와우에서처럼 커스텀 UI 설정 언어로도 쓰이고, RPG게임 등에서 스크립트로도 쓰인다. 제작과정에서 내부적으로 활용하는 경우도 있고, API를 유저들에게 공개하여 MOD제작 등에 쓰이기도 한다. 국내게임으론 라그나로크 온라인에서 NPC의 AI와 호문클루스의 AI, 용병의 AI에 Lua가 쓰였으며 이중 호문클루스와 용병은 유저가 직접 변경이 가능했다. 3차 직업군이 등장할 즈음에 용병의 AI를 변경하여 거의 0프레임수준의 스킬이 가능하다는게 여기저기 알려져 너도 나도 창용병 무명섬 3층 고고싱을 외친적이 있다.
게리모드에서도 루아를 지원해주고, 일부 소스게임(혹은 모드)들도 lua를 사용한다. 특이한건 GTA 4에도 Lua 스크립트 모드가 있다. GTA: San Andreas의 멀티플레이어 중 하나인 MTA: San Andreas의 서버도 Lua 언어로 작성한다. TAS 영상을 만드는 데에도 일부 사용한다.

한게임에서 제공중인 오픈 마켓형 게임 툴인 아이두게임도 기본 언어는 Lua로 이루어져있다. 초보 프로그래머들을 위해서 배려를 해준 것이라고...

하프 라이프 2의 모드격 게임인 게리 모드에서 유저들이 직접 메커니즘을 디자인할때 쓰이는 언어다. 이 언어 덕분에 상자로 만든 건물부터 투석기, 전투기, 헬리콥터, 골드버그 장치, 컴퓨터(!)까지 유저 맘대로 만들 수 있게 되었다.

아이패드로 만든 Lua개발 툴도 있다! 이름은 공개 당시 Codify, 현재 Codea이다.사이트 링크. 보면 막 패드에서 이래저래 코딩해서 만든다. [1] 그리고 패드는 개발자용 장난감이 되겠지

3 언어적 특징

3.1 가벼움

인터프리터(또는 후술할 JIT 컴파일러)의 용량이 300kb도 안 될 정도로 작고 굉장히 빠르다. 굉장히 적은 수의 데이터형만을 지원하긴 하지만 그만큼 가볍다. 다양한 프로그램에 쉽게 붙일 수 있는 이유도 용량과 속도의 부담이 적기 때문. 그러면서도 다양한 패러다임을 가지고 있는데, 절차적으로도, 객체지향적으로도, 함수형으로도 이용할 수 있다.

3.2 문법적 특징

언어의 문법이 굉장히 단순한 편이다. 다만, C 스타일의 언어들과 비교했을 때 다른 점이 많다는 것이 특징이다.

  • 루아에서는 null이 아닌 nil
  • nil, false 만 거짓이고 나머지는 true (0도 true다.)
  • 기본적인 자료형은 nil, boolean, number(double), string, function, table
  • ==의 반대 연산자로 보통은 !=, <>등을 많이 사용하는데, 루아에서는 ~=
  • 논리연산자도 타 언어에서 !, &&, ||, ^^등을 사용하는데 lua에서는 단어 그대로 not, and, or로 쓰고 xor은 존재하지 않는다.
  • ^ 가 xor 관련이 아닌 pow, 즉 제곱
  • A+=B 같은 꼴은 지원하지 않으며 무조건 A = A + B 처럼 작성해야한다.
  • 문자열 합치기는 +가 아닌 ..
  • self라는 예약어 아닌 예약어가 존재.
  • 반복제어문에 continue가 없다.
  • GOTO가 존재한다.
  • 함수를 정의하는게 아니라 함수를 만들어 변수에 대입하는 방식으로 작성이 가능. (이는 JavaScript도 동일하다.)

3.3 테이블

루아의 가장 큰 특징이자 루아의 상징은 테이블이다. 다른 언어의 배열과는 다르게 다양한 자료형을 키로 사용가능한데, 이것을 가지고 단순한 구조체, 배열 뿐만 아니라 객체, 클래스, 인터페이스 등을 다 구현해 낼 수 있다. 사실 루아의 테이블은 단순히 저장하는 것이 아니라 메타테이블과 같이 써서 테이블에 기능을 붙일 수 있기 때문이다. 그래서 루아를 잘 다룰려면 테이블과 메타테이블을 잘 다룰 수 있어야 한다. 사실 대부분 루아를 사용하는 곳에서는 그정도의 기교를 요구하지는 않는다.

3.4 함수형 프로그래밍

루아도 일단은 함수형 프로그래밍이 어느정도 가능하다는 것인데, 함수를 익명함수로 생성할 수도 있고 전달할 수도 있다.(JavaScript에서 지원하는 정도와 비슷하다.) 그리고 사실 파일로 저장해서 불러오는 스크립트 자체가 함수다. 대신 성능을 위해서 스택의 크기가 고정되어 있기 때문에 어떤 함수든지 지역변수를 200개 이상 만들 수가 없다. 대신 전역범위에 저장하는 _G라는 테이블이 존재한다.

클로저와 익명함수를 지원한다.

3.5 JIT

LuaJIT[2]는 Lua의 Just-In-Time Compiler인데, 엄청난 장점으로 타 JIT와 비교해도 우수한 성능을 보여준다. 주 비교 대상은 V8인데, 자료구조 성능을 제외하면 전반적으로 루아쪽이 성능이 더 좋다. CPython과 비교해도 적절한 성능을 보여준다.

자바스크립트와 루아는 문법과 패러다임이 90% 이상 비슷한 사촌언어격이지만 JIT 성능의 구현 측면에 있어서는 자바스크립트가 가진 문법 일부가 성능 향상에 약점으로 작용한다고 한다. [참조]

홈페이지에 따르면 인터프리터를 손수 어셈블리어로 작성했으며, 이미 상당한 수준의 최적화가 되어있다. 파이썬의 JIT 컴파일러인 PyPy가 자기 자신으로 JIT를 구현하는 것과 대조되는 부분. Lua가 그나마 단순한 언어라 이런 일이 가능한 듯하다.

이 때문인지 업데이트가 자주 되는 편은 아닌데, Lua5.3이 나오고 있는 동안에도 LuaJIT는 Lua5.1 문법이 가장 최신이다.

또한 안그래도 손쉬운 C 와의 인터페이스 작업은 LuaJIT 의 FFI (Foreign Function Interface) 를 이용하면 Low-Level C 함수들을 별다른 작업 없이 직접적으로 사용할 수 있다. 이 FFI 방식으로 인해 스크립트 - 네이티브 코드간 호출규약을 맞추기 위한 별도의 작업이 사실상 필요가 없어지고, C 자료형을 직접 사용할 수 있게 되며 호출 성능은 네이티브에 견줄만큼 빨라지기 때문에, 일단 JIT 를 사용하게 되면 기존 루아 바인딩 코드를 사용할 일이 극히 적어진다. 이 FFI 방식은 이후 파이썬의 CFFI 라이브러리에 많은 영감을 주었다. (node.js 의 node-ffi 도 상당한 영향을 받은 것으로 추정된다.)

3.6 파이썬과 비교

비슷한 컨셉의 파이썬과 많이 비교가 되는데, '배터리가 포함된'[3] 파이썬은 어느정도 단독으로 프로그램을 만들 수 있는 환경인 반면, 루아는 기본 기능만을 포함하고 있어 단독으로 응용프로그램을 만들기는 어렵다. 물론 그만큼 가볍다는 이야기이도 하다.

3.7 JavaScript와 비교

굉장히 유사한 면이 많은 두 언어다. 둘 다 JIT도 있다는 것도 유사한 점이다. 그래서 JavaScript에 있는 것을 Lua로 옮기는 경우도 있는데 예로 node.js를 Lua로 옮긴 Luvit이라던가...

4 여담

최근에는 Corona sdk라는 게 나와서 lua만 배워서 게임 하나 뚝딱 만들어 내는 게 가능해졌다. 2015년 12월 현재 ios, 안드로이드 모두 지원된다.

Cytus의 챕터 6에서 Lua 소스코드가 등장한다. 설마 게임 통째로 Lua로 만든건 아니겠지

모든 생물의 공통 조상Last Universe Ancestor 로 LUA라는 약칭을 갖고 있다. 자세한건 항목 참조

Love2d 라는 C++(SDL)에 접착시켜 만든 게임 개발 프레임워크가 Lua를 사용해 코딩한다. Not Tetris 2, Not Pacman, 포탈 마리오 등 꽤나 흥행한 게임들을 탄생시켰지만 그닥 인지도가 높지 않다.. 한국에선 커뮤니티 조차 존재하지 않는다

피니엔진이 Lua를 기반으로 만들어졌다. 정확하게는 cocos 2d-x의 Lua 모듈을 통해 개발되었고, 자체 스크립트인 LNX 스크립트 또한 컴파일 과정을 통해 Lua 코드로 변환한 뒤 사용된다.

스텝매니아에서도 Lua를 사용하여 기믹패턴을 만들 수 있다. 영문 설명 링크

자막 제작용 소프트웨어인 Aegisub에서도 Lua스크립트를 응용해 자동화 기능을 사용할 수 있다.

Lua를 Java로 만든 Luaj를 이용해 자바에서 직접 Lua 스크립트를 실행시킬 수 있다! (단점은 관련 정보가 적다는 것)
  1. 정확히는 Lua를 기반으로 사용하지만 앱내에서 개별적으로 함수나 API등을 제공한다.
  2. [2]
  3. 기본으로 포함된 라이브러리가 기능이 풍부해 다른 외부 모듈이 필요없다는 뜻