루아
1. 개요
1. 개요
루아는 1993년에 발표된 경량의 스크립트 언어이다. 브라질의 폰티피컬 가톨릭 대학교 리우데자네이루 연구진인 로베르투 이에루살림스키, 와우데르 세자르스, 루이스 엔리케 데 피게이레도에 의해 설계되었다. 이 언어는 C++, CLU, Modula, Scheme, SNOBOL 등 여러 언어의 영향을 받아 개발되었으며, 명령형 프로그래밍, 함수형 프로그래밍, 객체 지향 프로그래밍을 지원하는 멀티 패러다임 언어이다.
주요 설계 목표는 임베딩이 쉽고 확장성이 높은 언어를 만드는 것이었다. 이에 따라 인터프리터는 매우 작고 빠르며, C 언어로 작성된 호스트 프로그램에 쉽게 통합될 수 있도록 만들어졌다. 이러한 특성 덕분에 루아는 게임 개발, 임베디드 시스템, 자동화 스크립트 등 자원이 제한된 환경이나 성능이 중요한 환경에서 널리 사용된다. 언어의 라이선스는 MIT 라이선스이며, 파일 확장자는 .lua를 사용한다. 최신 안정판은 5.4.6[2]이다.
2. 특징
2. 특징
루아는 가볍고 빠른 스크립트 언어로 설계되었다. C 언어로 작성된 인터프리터는 매우 작은 크기로, 임베디드 시스템이나 게임 엔진과 같은 호스트 프로그램에 쉽게 내장(임베딩)될 수 있다. 이는 루아의 가장 큰 특징 중 하나이다. 또한 가비지 컬렉션이 자동으로 수행되어 메모리 관리를 편리하게 해준다.
이 언어는 멀티 패러다임을 지원한다. 기본적으로 절차적 프로그래밍과 명령형 프로그래밍 스타일을 따르지만, 함수형 프로그래밍의 특징도 가지고 있다. 객체 지향 프로그래밍은 언어 자체의 문법이 아닌, 테이블과 메타테이블이라는 유연한 데이터 구조를 이용해 구현할 수 있어 높은 자유도를 제공한다.
루아의 문법은 간결하고 배우기 쉬운 것이 특징이다. C나 파스칼과 유사한 구문을 사용하지만, 세미콜론과 같은 불필요한 요소를 최소화했다. 동적 타입 언어로, 변수에 별도의 데이터 타입 선언 없이 값을 할당할 수 있다. 강력한 기능을 가진 테이블은 배열, 해시 테이블, 객체, 모듈 등 다양한 용도로 사용되는 핵심 데이터 구조이다.
표준 라이브러리는 의도적으로 최소한의 기능만을 제공하며, 파일 입출력이나 네트워크 프로그래밍과 같은 복잡한 기능은 C 언어로 작성된 외부 라이브러리를 통해 확장하는 방식을 선호한다. 이러한 설계 철학 덕분에 루아는 핵심 엔진은 매우 작게 유지하면서도, 필요에 따라 무한히 확장 가능한 언어가 되었다.
3. 문법
3. 문법
3.1. 변수와 데이터 타입
3.1. 변수와 데이터 타입
루아는 동적 타이핑을 채택한 언어로, 변수 선언 시 데이터 타입을 명시할 필요가 없다. 변수는 단순히 이름으로 선언되며, 그 변수에 할당되는 값에 따라 타입이 결정된다. 이는 정적 타이핑 언어와 대비되는 특징이다.
루아의 기본 데이터 타입은 총 8가지이다. 주요 타입으로는 nil, boolean, number, string, function, userdata, thread, 그리고 table이 있다. nil은 값이 없음을 나타내는 타입이며, boolean은 참(true)과 거짓(false)의 논리값을 가진다. number는 정수와 실수를 구분하지 않는 배정밀도 부동소수점 숫자를, string은 불변의 문자 시퀀스를 나타낸다.
function은 일급 객체로서 변수에 할당되거나 다른 함수의 인자 및 반환값으로 사용될 수 있다. userdata는 호스트 언어(주로 C나 C++)에서 정의된 데이터를 루아 코드가 투명하게 참조할 수 있도록 하는 타입이다. thread는 코루틴을 구현하는 독립적인 실행 스레드를 의미한다.
가장 중요하고 강력한 타입은 table이다. 이는 연관 배열이자 배열의 역할을 하는 루아의 유일한 자료 구조이다. table은 해시 테이블로 구현되어 있으며, 키와 값의 쌍으로 데이터를 저장한다. 이를 통해 리스트, 레코드, 객체 지향 프로그래밍의 클래스와 객체, 심지어 모듈과 패키지 시스템까지 구현하는 데 사용된다.
3.2. 제어 구조
3.2. 제어 구조
루아의 제어 구조는 명령형 프로그래밍의 전형적인 흐름 제어를 제공하면서도 간결하고 유연한 구문을 특징으로 한다. 기본적인 조건 분기에는 if, elseif, else를 사용하며, 조건식은 괄호로 묶지 않는다. 반복문에는 while과 repeat...until이 있다. while은 조건이 참인 동안 본문을 실행하는 전형적인 구조이며, repeat...until은 본문을 최소 한 번 실행한 후 조건이 거짓일 때까지 반복하는 후검사 구조이다.
루아에서 가장 강력하고 특징적인 반복 제어 구조는 for 루프이다. 이는 수치형 for와 제네릭 for로 나뉜다. 수치형 for는 시작값, 종료값, 증감값을 지정하여 숫자를 세며 반복한다. 제네릭 for는 반복자 함수와 함께 사용되며, 주로 테이블의 모든 키-값 쌍을 순회하는 데 활용된다. pairs()나 ipairs()와 같은 반복자 함수와 결합하여 컬렉션을 쉽게 탐색할 수 있다.
모든 제어 구조는 명시적인 end 키워드로 블록의 끝을 표시한다. break 문을 사용하면 while, repeat, for 루프 내에서 즉시 반복을 종료하고 탈출할 수 있다. 그러나 C나 Java와 같은 언어에 있는 continue 문은 존재하지 않는다. 대신 중첩된 if 블록을 사용하거나 루프 로직을 재구성하여 유사한 흐름을 구현해야 한다. 이러한 단순하면서도 일관된 설계는 루아를 배우기 쉽고 코드를 읽기 쉽게 만드는 요소 중 하나이다.
3.3. 함수
3.3. 함수
루아에서 함수는 일급 객체이며, 이는 함수가 변수에 할당되고, 다른 함수의 인자로 전달되며, 다른 함수의 반환값으로 사용될 수 있음을 의미한다. 이러한 특성은 함수형 프로그래밍 스타일을 구현하는 데 핵심적이다. 함수는 function 키워드로 정의되며, 명시적인 return 문이 없을 경우 nil을 반환한다. 또한, 함수는 다중 반환값을 지원하여 여러 값을 한 번에 반환할 수 있다.
함수 정의는 이름을 붙이거나 익명으로 할 수 있다. 익명 함수는 특히 콜백이나 고차 함수의 인자로 자주 사용된다. 루아의 함수는 클로저를 완벽히 지원하여, 함수가 자신이 생성된 렉시컬 스코프의 지역 변수에 접근하고 이를 "기억"할 수 있게 한다. 이는 강력한 캡슐화와 상태 보존 메커니즘을 제공한다.
함수 호출 시 인자는 부족하면 nil로 채워지고, 초과하면 무시되는 유연한 특성을 가진다. 또한, ... 문법을 통한 가변 인자를 지원하여 임의 개수의 인자를 처리할 수 있다. 이러한 설계는 루아가 다양한 응용 프로그램에 임베딩되거나 스크립팅 언어로 사용될 때 필요한 적응성을 높여준다.
3.4. 테이블
3.4. 테이블
루아에서 테이블은 유일한 자료 구조이며, 배열, 연관 배열, 객체, 모듈 등 다양한 용도로 사용되는 범용 컨테이너이다. 테이블은 중괄호 {}를 사용하여 생성하며, 내부에 키와 값의 쌍을 저장한다. 키는 숫자나 문자열을 포함한 대부분의 데이터 타입이 될 수 있고, 값은 함수를 포함한 모든 타입이 가능하다. 이는 리스트나 해시 테이블과 같은 복잡한 구조를 단일한 테이블 개념으로 구현할 수 있게 한다.
테이블의 요소에 접근하는 방법은 두 가지가 있다. 점(.) 연산자를 사용한 테이블명.키 방식과 대괄호([])를 사용한 테이블명["키"] 방식이 있다. 특히 대괄호 방식은 키가 문자열이나 변수일 때 유용하다. 숫자 인덱스로 접근하는 배열 형태의 사용도 가능한데, 루아의 배열은 인덱스가 1부터 시작하는 것이 특징이다. 이는 많은 스크립트 언어와 차별화되는 점이다.
테이블은 메타테이블이라는 강력한 기능을 통해 객체 지향 프로그래밍을 지원한다. 메타테이블은 원본 테이블의 연산자 동작이나 접근 방식을 변경할 수 있는 별도의 테이블로, 연산자 오버로딩과 같은 메타프로그래밍이 가능하게 한다. 또한, 테이블은 네임스페이스와 모듈 시스템의 기초가 되어, 관련된 변수와 함수를 하나의 테이블에 그룹화하여 관리하는 데 널리 사용된다.
4. 표준 라이브러리
4. 표준 라이브러리
루아는 비교적 작은 핵심 언어를 유지하면서도 풍부한 기능을 제공하기 위해 표준 라이브러리를 통해 다양한 기본 기능을 제공한다. 이 표준 라이브러리는 핵심 라이브러리와 C 언어로 구현된 추가 모듈들로 구성되어 있으며, 인터프리터나 호스트 애플리케이션에 내장되어 사용된다.
표준 라이브러리의 주요 모듈로는 기본적인 수학 연산과 난수 생성을 담당하는 math, 문자열 조작 함수를 제공하는 string, 운영체제 기능 및 파일 입출력을 위한 io와 os, 테이블 조작을 위한 table, 그리고 디버깅을 지원하는 debug 모듈 등이 있다. 특히 coroutine 모듈은 협동형 멀티태스킹을 구현하는 코루틴 기능을 제공하여 복잡한 제어 흐름을 관리하는 데 유용하다.
이러한 라이브러리 함수들은 네임스페이스 역할을 하는 전역 테이블을 통해 접근한다. 예를 들어, string.len(s)과 같이 모듈 이름을 접두사로 사용하여 함수를 호출한다. 표준 라이브러리의 설계 철학은 간결성과 효율성에 중점을 두어, 자주 사용되는 기능만을 포함하고 특정 플랫폼에 과도하게 의존하지 않도록 만들어졌다. 이로 인해 루아는 다양한 임베디드 시스템과 게임 엔진에 쉽게 통합될 수 있다.
표준 라이브러리의 기능은 기본적이지만, 사용자는 필요에 따라 C 언어나 루아 자체로 작성된 외부 모듈을 통해 이를 쉽게 확장할 수 있다. 많은 서드파티 라이브러리들이 네트워킹, GUI, 데이터베이스 접근 등 표준 라이브러리에서 다루지 않는 영역을 채우고 있다.
5. 주요 구현 및 활용
5. 주요 구현 및 활용
5.1. 임베딩과 확장
5.1. 임베딩과 확장
루아는 C와 C++ 같은 시스템 프로그래밍 언어로 작성된 호스트 프로그램에 임베딩되도록 설계된 스크립트 언어이다. 이는 루아의 가장 중요한 특징 중 하나로, 호스트 프로그램에 스크립팅 기능을 추가하거나 애플리케이션의 설정 및 동작을 제어하는 구성 언어로 사용되는 것을 목표로 한다. 이를 위해 루아는 간결한 API를 제공하며, 이 API를 통해 호스트 프로그램은 루아 가상 머신을 생성하고, 스크립트를 로드 및 실행하며, 루아 코드와 C 함수 간의 양방향 데이터 교환을 수행할 수 있다.
루아의 확장성은 C API를 통해 새로운 함수와 데이터 타입을 루아에 추가할 수 있는 능력에서 비롯된다. 개발자는 C로 작성된 함수를 루아가 호출할 수 있는 형태로 등록하여, 루아 스크립트 내에서 마치 네이티브 함수처럼 사용할 수 있게 한다. 또한, 사용자 데이터 타입을 정의하여 C 구조체나 객체를 루아에서 안전하게 조작할 수 있도록 지원한다. 이러한 설계 덕분에 루아는 성능이 중요한 부분은 C로, 논리와 설정은 루아로 작성하는 하이브리드 아키텍처 구현에 매우 적합하다.
임베딩 과정은 일반적으로 루아 인터프리터를 애플리케이션에 정적으로 또는 동적으로 링크하는 것으로 시작한다. 이후 애플리케이션은 루아 상태를 생성하고, 필요한 C 라이브러리를 로드한 후, 루아 스크립트 파일이나 문자열을 실행한다. 루아 코드는 호스트 프로그램이 제공하는 확장 함수들을 호출하여 시스템의 핵심 기능을 제어할 수 있다. 반대로, C 코드도 루아 전역 변수를 설정하거나 루아 함수를 호출하여 스크립트의 동작에 영향을 줄 수 있다.
이러한 강력한 임베딩과 확장 기능은 루아를 게임 개발, 임베디드 시스템, 네트워킹 장비 등 다양한 분야에서 선호되는 스크립팅 솔루션으로 자리매김하게 했다. 복잡한 애플리케이션을 효율적인 C/C++ 모듈과 유연한 루아 스크립트의 조합으로 구성함으로써 개발 생산성과 런타임 성능을 동시에 확보할 수 있다.
5.2. 대표적인 사용 사례
5.2. 대표적인 사용 사례
루아는 가벼운 스크립트 언어로서, 특히 C나 C++와 같은 시스템 프로그래밍 언어로 작성된 호스트 애플리케이션에 임베딩되어 확장 언어로 널리 사용된다. 이는 루아의 설계 목적이기도 하다. 가장 잘 알려진 사용 사례는 게임 개발 분야로, 월드 오브 워크래프트, 와우와 같은 대형 MMORPG를 비롯해 로블록스의 게임 로직, 시민 케인 시리즈, 그림 팡타지 등 수많은 게임에서 스크립트 언어로 채택되었다. 게임 내 사용자 인터페이스(UI) 구성, 인공지능(AI) 행동 정의, 레벨 디자인 및 모드 제작 등 다양한 영역에서 활용된다.
게임 외에도 네트워크 장비 및 임베디드 시스템 분야에서도 두각을 나타낸다. 예를 들어, 시스코 시스템즈의 네트워크 운영 체제(IOS)와 화이트박스의 스위치에서 구성 자동화 및 프로그래밍 가능성을 제공하는 데 사용된다. 또한 미디어위키 소프트웨어, 즉 위키백과를 구동하는 플랫폼에서 템플릿과 확장 기능의 로직을 처리하는 스크립트 엔진으로 루아가 내장되어 있다.
이처럼 루아는 호스트 프로그램의 핵심 성능에는 영향을 주지 않으면서도 유연한 동적 타이핑과 강력한 테이블 구조를 통해 복잡한 설정이나 로직을 구현해야 하는 광범위한 소프트웨어의 선호받는 임베디드 스크립팅 솔루션으로 자리 잡았다.
6. 버전 역사
6. 버전 역사
루아는 1993년에 처음 공개된 이후 꾸준히 발전해 왔다. 주요 버전은 5.x 시리즈로, 2003년에 발표된 루아 5.0은 새로운 가상 머신과 향상된 성능을 도입하며 중요한 이정표가 되었다. 이후 5.1(2006년), 5.2(2011년), 5.3(2015년), 5.4(2020년) 버전이 출시되며 점진적인 개선이 이루어졌다.
각 주요 업데이트는 새로운 언어 기능, 성능 최적화, 가비지 컬렉션 알고리즘 개선, 그리고 표준 라이브러리의 확장을 포함한다. 예를 들어, 루아 5.3은 정수 타입을 공식적으로 도입했고, 루아 5.4는 가비지 컬렉터의 점진적 모드와 새로운 경고 시스템을 추가했다. 이러한 변화는 루아가 가볍고 효율적으로 유지되면서도 현대적인 프로그래밍 요구사항을 충족할 수 있도록 설계되었다.
현재의 최신 안정판은 루아 5.4.6이다. 이 버전은 2023년 1월 19일에 릴리스되었으며, 5.4 시리즈 내에서의 버그 수정과 안정성 개선이 주를 이룬다. 루아 개발팀은 하위 호환성을 중시하며 신중한 접근 방식을 유지하고 있어, 새로운 버전에서도 기존 코드베이스가 큰 수정 없이 동작하도록 한다.
주요 버전 | 발표 연도 | 주요 특징 또는 변경 사항 |
|---|---|---|
1.0 | 1993년 | 최초 공개 |
5.0 | 2003년 | 새로운 레지스터 기반 가상 머신 도입, 성능 대폭 향상 |
5.1 | 2006년 | 모듈 시스템, 새로운 가비지 컬렉터 메타메서드 추가 |
5.2 | 2011년 | 환경 * |
5.3 | 2015년 | 64비트 정수 타입 공식 지원, 비트 연산자 통합 |
5.4 | 2020년 | 가비지 컬렉터 점진적 모드, 변수 속성 문법, 경고 시스템 |
5.4.6 | 2023년 | 5.4 시리즈의 최신 안정판, 버그 수정 및 소소한 개선 |
