|
|
루아에서는 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도 동일하다.)
루아의 가장 큰 특징이자 루아의 상징은 테이블이다. 다른 언어의 배열과는 다르게 다양한 자료형을 키로 사용가능한데, 이것을 가지고 단순한 구조체, 배열 뿐만 아니라 객체, 클래스, 인터페이스 등을 다 구현해 낼 수 있다. 사실 루아의 테이블은 단순히 저장하는 것이 아니라 메타테이블과 같이 써서 테이블에 기능을 붙일 수 있기 때문이다. 그래서 루아를 잘 다룰려면 테이블과 메타테이블을 잘 다룰 수 있어야 한다. 와우 애드온에선 아주 자주 쓴다.
루아도 일단은 함수형 프로그래밍이 어느정도 된다는 것인데, 함수를 익명함수로 생성할 수도 있고 전달할 수도 있다.(JavaScript에서 지원하는 정도와 비슷하다.) 그리고 사실 파일로 저장해서 불러오는 스크립트 자체가 함수다. 대신 성능을 위해서 스택의 크기가 고정되어 있기 때문에 어떤 함수든지 지역변수를 200개 이상 만들 수가 없다. 대신 전역범위에 저장하는 _G라는 테이블이 존재한다.
클로저와 익명함수를 지원한다.
LuaJIT[2]는 Lua의 Just-In-Time Compiler인데, 엄청난 장점으로 타 JIT와 비교해도 더 우수한 성능을 보여준다. 주 비교 대상은 V8인데, 자료구조 성능을 제외하면 전반적으로 루아쪽이 성능이 더 좋다. 파이썬, 루비와 비교하면 수십배 정도가 더 빠르다.
자바스크립트와 루아는 문법과 패러다임이 90% 이상 비슷한 사촌언어격이지만 JIT 성능의 구현 측면에 있어서는 자바스크립트가 가진 문법 일부가 성능 향상에 약점으로 작용한다고 한다. [참조] 또한 메모리 사용량에 있어서 LuaJIT 가 더 나은 최적화를 보여주고 있다. 따라서 Node.js 를 LuaJIT 기반으로 다시 작성한 Luvit 이라는 프로젝트가 활성화 되었다.
홈페이지에 따르면 인터프리터를 손수 어셈블리어로 작성했으며, 이미 상당한 수준의 최적화가 되어있다고 한다. 파이썬의 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 도 상당한 영향을 받은 것으로 추정된다.)
네이티브에 견줄만큼 속도가 빠르고, 메모리 사용량이 매우 적기 때문에 최근 Nginx 에 LuaJIT 포함시켜서 커스터마이징을 한 OpenResty 웹서버가 인기를 끌고 있다. CDN 서비스로 유명한 Cloudflare 와 알렉사 Top 13 규모의 세계에서 가장 큰 C2C 상거래 서비스 (지마켓/옥션을 생각하면 된다) 인 TaoBao 에서 주-웹서버로 사용하고 있으며 두 회사의 개발자들이 OpenResty 개발을 주도하고 있다.
(Cloudflare 의 CDN 서비스는 사실 Nginx 에 LuaJIT 로 코드를 올려 커스터마이징한 서비스 들이다. 그래서 타사와 달리 진정한 CDN 서비스가 아니라는 비평도 있다.)
알파고로 유명한 DeepMind 사가 알파고의 기반인 Q-Learning 을 구현할때 사용된 Torch 머신러닝 미들웨어도 LuaJIT 로 작성되어있다. (DeepMind 사의 구인공고는 그래서 C/C++ 과 Lua 스크립트가 필수역량으로 적혀있다.)
비슷한 컨셉의 파이썬과 비교가 많이 되는데, '배터리가 포함된'[3] 파이썬은 어느정도 단독으로 프로그램을 만들 수 있는 환경인 반면, 루아는 기본 기능만을 포함하고 있어 단독으로 응용프로그램을 만들기는 어렵다. 물론 그만큼 가볍다는 이야기이도 하다.
나무위키