루아 (프로그래밍 언어)
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
루아(Lua)는 1993년 브라질의 가톨릭 대학교 연구진에 의해 개발된 확장 가능하고 이식성이 뛰어난 스크립팅 언어이다. C 언어와의 통합을 염두에 두고 설계되었으며, 작고 간단하면서도 다중 패러다임 프로그래밍을 지원하는 특징을 가진다. 루아는 게임 개발, 임베디드 시스템, 웹 애플리케이션 등 다양한 분야에서 활용되며, LuaJIT, Luau, MoonScript 등 파생 언어와 기술도 존재한다. C/C++와의 연동을 위한 API를 제공하며, C/C++ 코드에서 루아 코드를 호출하거나, 루아 스크립트에서 C/C++ 함수를 호출하는 것이 가능하다.
더 읽어볼만한 페이지
- 브라질의 발명품 - Boo (프로그래밍 언어)
Boo는 파이썬과 유사한 문법을 가져 간결하고 가독성이 높은 코드 작성이 가능하며, 제너레이터를 활용한 피보나치 수열 생성 등의 기능을 제공하는 프로그래밍 언어이다. - 브라질의 발명품 - 배니싱 스프레이
배니싱 스프레이는 축구 경기에서 프리킥 시 공격과 수비 간 거리를 표시하는 스프레이로, 액화 부탄을 사용하여 물, 계면활성제 등으로 이루어진 폼을 분사하며 시간이 지나면 사라지는 특징을 가지고 있고, 2014년 FIFA 월드컵을 통해 널리 알려진 후 현재 전 세계 축구 리그에서 득점 기회 증가와 경기 지연 감소에 활용되고 있다. - 1993년 개발된 프로그래밍 언어 - 비주얼 베이직 포 애플리케이션
비주얼 베이직 포 애플리케이션(VBA)은 마이크로소프트 오피스 제품군 등에서 매크로 생성 및 자동화 작업을 위해 사용되는 프로그래밍 언어로서, 여러 응용 프로그램에서 자동화 솔루션 구축, 오피스 프로그램 기능 확장, 사용자 정의 함수 제작, 다른 응용 프로그램과의 통합 등에 활용되며 보안 문제도 포함한다. - 1993년 개발된 프로그래밍 언어 - 비펀지
비펀지는 1993년 크리스 프레시에가 만든 자기 수정 능력을 강조하는 2차원 격자 구조의 스택 기반 난해한 프로그래밍 언어이다. - 프로토타입 기반 프로그래밍 언어 - LPC (프로그래밍 언어)
LPC는 1989년 Lars Pensjö가 개발한 객체 지향 프로그래밍 언어로, C와 유사한 문법을 가지며 MUD 게임 개발에 주로 사용된다. - 프로토타입 기반 프로그래밍 언어 - 커피스크립트
커피스크립트는 자바스크립트 작성을 간소화하기 위해 고안된, 간결하고 표현력이 풍부한 문법을 가진 프로그래밍 언어로서, 자바스크립트로 컴파일되며, 셀프 호스팅 컴파일러, 소스 맵, 문학적 프로그래밍을 지원한다.
루아 (프로그래밍 언어) - [IT 관련 정보]에 관한 문서 | |
---|---|
기본 정보 | |
![]() | |
설계자 | 호베르투 이에루잘림스시 Waldemar Celes Luiz Henrique de Figueiredo |
발표 연도 | 1993년 |
최신 안정화 버전 | 5.4.6 |
최신 안정화 버전 발표일 | 2023년 5월 2일 |
타이핑 | 동적 타이핑, 강타입, 덕 타이핑 |
구현체 | https://www.lua.org/download.html https://luajit.org/ https://github.com/neopallium/llvm-lua https://github.com/lua-alchemy/lua-alchemy https://www.moonsharp.org/ |
프로그래밍 언어 | ANSI C |
방언 | https://www.nongnu.org/gsl-shell/ https://luau-lang.org |
영향을 받은 언어 | C++ CLU Modula 스킴 SNOBOL |
영향을 준 언어 | GameMonkey Io 자바스크립트 Julia Red 링(Ring) Ruby Squirrel C-- Luau |
운영 체제 | 크로스 플랫폼 |
라이선스 | MIT 허가서 |
웹사이트 | https://www.lua.org/ |
파일 확장자 | .lua |
이름 | |
어원 | 포르투갈어로 "달"을 의미 |
발음 | 루아 |
2. 역사
루아는 1993년 브라질 리우데자네이루에 있는 교황청 대학교의 컴퓨터 그래픽 기술 그룹 회원인 루이스 엔리케 데 피게이레두, 호베르투 이에루잘림스키, 발데마르 셀레스가 만들었다.[87] 초기에는 내부 프로젝트에 사용하기 위해 만들어졌으며, C 언어와 같이 기존의 언어로 작성된 소프트웨어와 쉽게 통합되도록 설계되었다. 루아는 작고 간단한 언어로 설계되었으며, C 언어의 부족한 점을 보완하여 추상화 유지, 동적 자료구조, 중복 방지, 테스트와 디버깅이 쉬운 구조에 집중했다. 루아는 안정적이고 자동적인 메모리 관리와 문자열 및 동적 데이터를 효율적으로 처리한다.[87]
5.0 버전 이전의 루아는 BSD 라이선스와 비슷한 라이선스에 따라 공개되었고, 5.0부터는 MIT 라이선스에 따라 공개되어 개인적, 상업적 사용이 허락없이 가능하며, GNU같은 저작권 표시가 요구되지 않는다. 다만, 사용 중 발생하는 문제에 관해서는 루아 개발자 측에서는 책임을 지지 않는다.[88]
2. 1. 개발 배경
루아는 1993년 브라질 리우데자네이루에 있는 교황청 대학교의 컴퓨터 그래픽 기술 그룹(Tecgraf) 회원인 루이스 엔리케 데 피게이레두, 호베르투 이에루잘림스키와 발데마르 셀레스가 만들었다.[87]1977년부터 1992년까지 브라질은 무역 장벽을 강화하는 정책을 시행하여, 컴퓨터 하드웨어와 소프트웨어를 자체적으로 생산해야 했다. Tecgraf의 고객들은 해외에서 맞춤형 소프트웨어를 구매할 여유가 없었다. 이러한 이유로 Tecgraf는 필요한 기본적인 도구들을 직접 구현하게 되었다.[5]
루아의 전신은 ''Simple Object Language''(SOL, 데이터 설명/구성 언어)와 ''data-entry language''(DEL)이었다.[6] 이들은 Tecgraf에서 두 개의 다른 프로젝트에 유연성을 더하기 위해 독립적으로 개발되었다. SOL과 DEL에는 제어 흐름 구조가 부족했고, 페트로브라스는 이에 완전한 프로그래밍 기능을 추가할 필요성을 느꼈다.
1993년에 유일한 경쟁자는 Tcl이었는데, 애플리케이션에 임베드되도록 설계되었지만 익숙하지 않은 구문을 가지고 있었고, 데이터 설명에 대한 좋은 지원을 제공하지 않았으며, 유닉스 플랫폼에서만 실행되었다. LISP나 Scheme은 친숙하지 않은 구문 때문에 고려되지 않았다. Python은 아직 초기 단계였다. Tecgraf는 자체 스크립팅 언어를 개발하기로 결정했다. 언어의 잠재적 사용자들이 전문 프로그래머가 아니었기 때문에, 난해한 구문과 의미를 피해야 했다. 새로운 언어는 이식 가능해야 했고, 다른 Tecgraf 제품들도 스크립팅 언어를 임베드해야 할 것으로 예상했기 때문에, C API를 가진 라이브러리로 제공되어야 했다.[5]
루아 1.0은 SOL의 데이터 설명 구문을 통합하도록 설계되었다. 루아의 구문은 제어 구조의 경우 대부분 Modula에서 차용되었지만, CLU, C++, SNOBOL 및 AWK의 영향을 받았다. 루아의 제작자들은 LISP와 Scheme이 단일하고 어디에나 존재하는 데이터 구조 메커니즘(리스트)을 가지고 있다는 점이 루아의 주요 데이터 구조로 테이블을 개발하기로 결정하는 데 큰 영향을 미쳤다고 밝혔다.[7]
루아의 의미론은 시간이 지남에 따라 특히 익명 함수와 완전한 렉시컬 범위의 도입과 함께 Scheme의 영향을 점점 더 많이 받았다.[5]
5.0 버전 이전의 루아 버전은 BSD 라이선스와 유사한 라이선스 하에 배포되었다. 5.0 버전부터 루아는 MIT 라이선스 하에 라이선스가 부여되었다.[87]
2. 2. 발전 과정
1993년 7월 28일, Lua 1.0이 처음 출시된 이후, Lua는 꾸준히 발전해왔다.[5] 초기 버전은 BSD 라이선스와 유사한 라이선스로 배포되었으나, 2003년 4월 11일 발표된 Lua 5.0부터는 MIT 라이선스를 채택하여 개인 및 상업적 용도로 자유롭게 사용할 수 있게 되었다.[88]2006년 2월 21일에 발표된 Lua 5.1에서는 점진적 가비지 컬렉션(Incremental Garbage Collection)이 도입되어 실시간 성능이 개선되었다. 2015년 1월 6일 발표된 Lua 5.3에서는 정수형과 비트 연산자가 지원되기 시작했다. 2020년 6월 29일, Lua 5.4.0이 출시되었다.
LuaJIT는 Lua의 성능 향상을 위한 JIT 컴파일러로, 2005년 9월 8일 LuaJIT 1.0.3이 최초로 공개되었다. 이후 LuaJIT는 Lua 5.1을 지원하고, 꾸준히 개선되어 2017년 5월 1일 LuaJIT 2.0.5가 릴리스되었다.
Lua와 LuaJIT의 주요 버전 출시 이력은 다음과 같다.
버전 | 출시일 | 주요 변경 사항 |
---|---|---|
Lua 1.0 | 1993년 7월 28일 | 최초 릴리스 |
Lua 2.1 | 1995년 2월 7일 | |
Lua 3.0 | 1997년 7월 1일 | |
Lua 4.0 | 2000년 11월 6일 | |
Lua 5.0 | 2003년 4월 11일 | MIT 라이선스 채택 |
Lua 5.1 | 2006년 2월 21일 | 점진적 GC 채택 |
Lua 5.2.0 | 2011년 12월 16일 | 비트 연산 라이브러리 지원 |
Lua 5.3.0 | 2015년 1월 6일 | 정수형 및 비트 연산자 지원 |
Lua 5.4.0 | 2020년 6월 29일 | |
LuaJIT 1.0.3 | 2005년 9월 8일 | 최초 공개 버전 |
LuaJIT 1.1.0 | 2006년 3월 13일 | Lua 5.1 지원 |
LuaJIT 2.0.0 | 2012년 11월 8일 | |
LuaJIT 2.0.5 | 2017년 5월 1일 |
루아는 다양한 문제 유형에 맞게 확장할 수 있는 적은 수의 일반적인 기능을 제공하는 "다중 패러다임" 언어이다.[3] 상속에 대한 명시적인 지원은 없지만, 메타테이블을 사용하여 구현할 수 있다. 프로그래머는 단일 테이블 구현을 사용하여 네임스페이스, 클래스 및 기타 관련 기능을 구현할 수 있다. 일급 함수는 함수형 프로그래밍의 많은 기술을 사용할 수 있도록 하며, 완전한 렉시컬 스코핑은 세분화된 정보 은닉을 통해 최소 권한의 원칙을 적용할 수 있도록 한다.
루아의 주석은 두 개의 하이픈(--)으로 시작하여 줄의 끝까지 이어진다. 이는 Ada, Eiffel, Haskell, SQL 및 VHDL과 유사하다. 여러 줄 문자열과 주석은 두 개의 대괄호로 표시된다.[8]
3. 특징
루아는 필요에 따라 확장할 수 있는 간단하고 유연한 메타 기능을 제공한다. 따라서 기본 언어는 가볍고,[3] 전체 참조 인터프리터는 컴파일 시 약 247 kB에 불과하여[3] 광범위한 응용 분야에 쉽게 적용할 수 있다.
스크립트 언어로 사용하기 위한 동적 타입 언어인 루아는 다양한 호스트 플랫폼에 맞을 만큼 작다. 부울 값, 숫자 (기본적으로 배정밀도 부동 소수점 및 64비트 정수), 문자열과 같은 소수의 원자 데이터 구조만 지원한다. 배열, 집합, 리스트, 레코드와 같은 일반적인 데이터 구조는 본질적으로 이기종인 연관 배열인 루아의 단일 기본 데이터 구조인 테이블을 사용하여 나타낼 수 있다.
루아는 일급 함수, 가비지 수집, 클로저, 적절한 꼬리 재귀, 강제 변환 (런타임 시 문자열과 숫자 값 간의 자동 변환), 코루틴 (협력적 멀티태스킹) 및 동적 모듈 로딩과 같은 소수의 고급 기능을 구현한다.
루아의 핵심 기능은 확장 가능한 의미 체계이며, 메타테이블 개념은 테이블의 강력한 사용자 정의를 가능하게 한다.
Lua 프로그램은 텍스트 형태의 Lua 파일에서 직접 인터프리트되지 않고, 컴파일되어 바이트코드로 변환된 후 Lua 가상 머신 (VM)에서 실행된다.
C 언어의 호스트 프로그램에 내장되도록 설계되었으며, 빠른 동작, 높은 이식성, 내장 용이성이 특징이다. 일단 바이트코드로 컴파일되어 Lua VM에서 실행된다.
루아의 특징은 범용성이 높으면서도 비교적 쉽게 구현할 수 있다는 점이다. 객체 지향 등과 같은 다른 요소를 명확하게 지원하지 않지만, 지원하지 않는 범위에서도 쉽게 확장이 가능하다. 또한, 빠른 실행 속도와 뛰어난 이식성도 큰 특징이다.
문법적인 특징으로는 파스칼과 매우 유사한 구문을 채택하고 있다는 점, 코루틴(협조적 멀티태스킹) 지원, 수치형은 정수와 부동 소수점의 구분이 없다는 점 (단, Lua 5.3에서는 정수형이 도입되었다), 함수를 변수로 취급할 수 있다는 점 등이 있다.
Lua는 범용 스크립트 언어이며, 특정 용도에 한정되지 않는다.
Lua 5.0 이전에는 메모리 관리에 마크 & 스윕 방식의 가비지 컬렉션이 사용되었지만, Lua 5.1에서는 증분 가비지 컬렉션이 채택되어 실시간 용도에서의 성능 개선이 이루어졌다. 가비지 컬렉션의 구현 형태도 Lua의 빠른 동작 및 높은 실시간 성능에 일조하고 있다.
4. 문법
```lua
여러 줄 주석
```
루아는 `if then end` 구문을 사용하여 조건문을 표현한다. 선택적으로 `else`와 `elseif then`을 사용하여 조건을 추가할 수 있다.
```lua
if 조건 then
elseif 조건 then
else -- 선택 사항
end
```
루아는 네 가지 유형의 반복문을 제공한다. `while` 루프, `repeat ... until` 루프 (do while 루프와 유사), 숫자 `for` 루프, 그리고 일반 `for` 루프가 있다.
```lua
while condition do
end
repeat
until condition
for i = first, last, delta do --delta는 음수가 될 수 있으며, for 루프가 카운트다운 또는 업할 수 있다.
end
```
일반적인 `for` 루프는 표준 반복자 함수 `pairs`를 사용하여 테이블 `_G`를 반복하며, `nil`을 반환할 때까지 반복한다.
```lua
for key, value in pairs(_G) do
print(key, value)
end
```
루프는 중첩될 수 있다.
루아에서 함수는 일급 객체로 취급된다. 즉, 변수에 할당되거나 다른 함수의 인수로 전달될 수 있다. 다음은 `print` 함수의 동작을 수정하는 예시이다.
```lua
do
local oldprint = print
function print(s)
oldprint(s == "foo" and "bar" or s)
end
end
```
`print`에 대한 향후 호출은 새로운 함수를 통해 전달되며, 이전 `print` 함수는 수정된 `print` 함수를 통해서만 접근할 수 있다.
루아는 클로저를 지원한다.
```lua
function addto(x)
return function(y)
return x + y
end
end
fourplus = addto(4)
print(fourplus(3)) -- 7 출력
print(addto(4)(3))
```
`addto`가 호출될 때마다 변수 `x`에 대한 새로운 클로저가 생성되므로, 반환되는 각 새로운 익명 함수는 항상 자체 `x` 매개변수에 접근하게 된다. 클로저는 다른 객체와 마찬가지로 Lua의 가비지 수집기에 의해 관리된다.
테이블은 루아에서 가장 중요한 자료 구조이며 (설계상, 유일한 내장 복합 데이터 타입) 모든 사용자 생성 타입의 기초이다. 테이블은 자동 숫자 키와 특수 구문이 추가된 연관 배열이다.
테이블은 키와 데이터 쌍의 집합으로, 데이터는 키로 참조된다. 즉, 해시된 이종 연관 배열이다.
테이블은 `{}` 생성자 구문을 사용하여 생성된다.
```lua
a_table = {} -- 새로운 빈 테이블 생성
```
테이블은 항상 참조로 전달된다.
키(인덱스)는 함수를 포함하여 `nil` 및 NaN을 제외한 모든 값이 될 수 있다.
```lua
a_table = {x = 10} -- "x"를 숫자 10에 매핑하는 하나의 항목이 있는 새로운 테이블 생성
print(a_table["x"]) -- 문자열 키와 연결된 값을 출력합니다. 이 경우 10.
b_table = a_table
b_table["x"] = 20 -- 테이블의 값이 20으로 변경되었습니다.
print(b_table["x"]) -- 20을 출력합니다.
print(a_table["x"]) -- 또한 20을 출력합니다. a_table과 b_table은 모두 동일한 테이블을 참조하기 때문입니다.
```
테이블은 구조체 (또는 레코드)로 자주 사용되며, 문자열을 키로 사용한다. 이러한 사용법이 매우 일반적이므로 루아는 이러한 필드에 액세스하기 위한 특수 구문을 제공한다.[10]
```lua
point = { x = 10, y = 20 } -- 새로운 테이블 생성
print(point["x"]) -- 10을 출력합니다
print(point.x) -- 위의 줄과 정확히 동일한 의미를 가집니다. 더 읽기 쉬운 점 표기법은 단순히 구문 설탕입니다.
```
테이블을 사용하여 관련 함수를 저장하면 네임스페이스 역할을 할 수 있다.
```lua
Point = {}
Point.new = function(x, y)
return {x = x, y = y} -- return {["x"] = x, ["y"] = y}
end
Point.set_x = function(point, x)
point.x = x -- point["x"] = x;
end
```
테이블에는 자동으로 숫자 키가 할당되어 배열 데이터 타입으로 사용할 수 있다. 첫 번째 자동 인덱스는 다른 많은 프로그래밍 언어와 달리 0이 아닌 1이다 (0의 명시적 인덱스는 허용된다).
숫자 키 `1`은 문자열 키 `"1"`과 다릅니다.
```lua
array = { "a", "b", "c", "d" } -- 인덱스는 자동으로 할당됩니다.
print(array[2]) -- "b"를 출력합니다. 루아의 자동 인덱싱은 1부터 시작합니다.
print(#array) -- 4를 출력합니다. #는 테이블과 문자열의 길이 연산자입니다.
array[0] = "z" -- 0은 유효한 인덱스입니다.
print(#array) -- 여전히 4를 출력합니다. 루아 배열은 1부터 시작하기 때문입니다.
4. 1. 예제 코드
루아의 주석은 두 개의 하이픈(--)으로 시작하여 줄의 끝까지 이어진다. 여러 줄 문자열과 주석은 두 개의 대괄호로 표시된다.
```lua
여러 줄 주석
```
조건문 테스트는 `if then end` 구문을 사용하며, 선택적으로 `else`와 `elseif then`을 사용할 수 있다.
```lua
if 조건 then
elseif 조건 then
else -- 선택 사항
end
```
루아는 `while` 루프, `repeat` 루프 (do while 루프와 유사), 숫자 `for` 루프 및 일반 `for` 루프 등 네 가지 유형의 조건부 루프를 가지고 있다.
```lua
while condition do
end
repeat
until condition
for i = first, last, delta do --delta는 음수가 될 수 있으며, for 루프가 카운트다운 또는 업할 수 있다.
end
```
일반적인 `for` 루프는 표준 반복자 함수 `pairs`를 사용하여 테이블 `_G`를 반복하며, `nil`을 반환할 때까지 반복한다.
```lua
for key, value in pairs(_G) do
print(key, value)
end
```
루프는 중첩될 수 있다.
```lua
local grid = {
{ 11, 12, 13 },
{ 21, 22, 23 },
{ 31, 32, 33 }
}
for y, row in pairs(grid) do
for x, value in pairs(row) do
print(x, y, value)
end
end
```
함수의 동작을 수정하는 예시는 다음과 같다.
```lua
do
local oldprint = print
function print(s)
oldprint를 통해 계속 사용 가능. 새로운 함수는 인수를 하나만 받음. ]]
oldprint(s == "foo" and "bar" or s)
end
end
```
`print`에 대한 향후 호출은 새로운 함수를 통해 전달되며, 이전 `print` 함수는 수정된 `print` 함수를 통해서만 접근할 수 있다.
루아는 클로저를 지원한다.
```lua
function addto(x)
return function(y)
Lua는 클로저를 생성한다. ]]
return x + y
end
end
fourplus = addto(4)
print(fourplus(3)) -- 7 출력
print(addto(4)(3))
```
`addto`가 호출될 때마다 변수 `x`에 대한 새로운 클로저가 생성되므로, 반환되는 각 새로운 익명 함수는 항상 자체 `x` 매개변수에 접근하게 된다. 클로저는 다른 객체와 마찬가지로 Lua의 가비지 수집기에 의해 관리된다.
루아는 내장된 클래스 개념이 없지만, 함수와 테이블을 사용하여 객체 지향 프로그래밍을 흉내낼 수 있다. 상속(단일 및 다중)은 존재하지 않는 메서드와 필드를 상위 객체에 위임하는 메타테이블을 사용하여 구현할 수 있다.
기본 벡터 객체를 생성하는 방법은 다음과 같다.
```lua
local Vector = {}
local VectorMeta = { __index = Vector}
function Vector.new(x, y, z) -- 생성자
return setmetatable({x = x, y = y, z = z}, VectorMeta)
end
function Vector.magnitude(self) -- 또 다른 메서드
return math.sqrt(self.x^2 + self.y^2 + self.z^2)
end
local vec = Vector.new(0, 1, 0) -- 벡터 생성
print(vec.magnitude(vec)) -- 메서드 호출 (출력: 1)
print(vec.x) -- 멤버 변수 접근 (출력: 0)
```
`object:func(args)`는 `object.func(object, args)`와 동일하다.
```lua
local Vector = {}
Vector.__index = Vector
function Vector:new(x, y, z) -- 생성자
return setmetatable({x = x, y = y, z = z}, self)
end
function Vector:magnitude() -- 또 다른 메서드
return math.sqrt(self.x^2 + self.y^2 + self.z^2)
end
local vec = Vector:new(0, 1, 0) -- 벡터 생성
print(vec:magnitude()) -- 메서드 호출 (출력: 1)
print(vec.x) -- 멤버 변수 접근 (출력: 0)
```
루아는 메타테이블을 사용하여 루아 클래스 상속을 제공할 수 있다.[13]
```lua
local Vector = {}
Vector.__index = Vector
function Vector:new(x, y, z) -- 생성자
return setmetatable({x = x, y = y, z = z}, self)
end
function Vector:magnitude() -- 또 다른 메서드
return math.sqrt(self.x^2 + self.y^2 + self.z^2)
end
local VectorMult = {}
VectorMult.__index = VectorMult
setmetatable(VectorMult, Vector) -- VectorMult를 Vector의 자식으로 만듭니다.
function VectorMult:multiply(value)
self.x = self.x * value
self.y = self.y * value
self.z = self.z * value
return self
end
local vec = VectorMult:new(0, 1, 0) -- 벡터 생성
print(vec:magnitude()) -- 메서드 호출 (출력: 1)
print(vec.y) -- 멤버 변수 접근 (출력: 1)
vec:multiply(2) -- 벡터의 모든 구성 요소를 2로 곱합니다.
print(vec.y) -- 멤버 다시 접근 (출력: 2)
```
루아는 다중 상속을 지원한다. `__index`는 함수 또는 테이블이 될 수 있다.[14] 연산자 오버로딩 또한 가능하다. Lua 메타테이블은 `__add`, `__sub` 등과 같은 요소를 가질 수 있다.[15]
4. 1. 1. Hello World
다음은 "Hello, world!"를 출력하는 전형적인 프로그램이다:[89]
```lua
print ("Hello, world!")
```
다음은 계승을 계산하는 프로그램으로, 재귀 호출 함수의 예시를 보이고 있다.[90]
```lua
function factorial(n)
if n == 0 then
return 1
end
return n * factorial(n - 1)
end
```
고전적인 "Hello, World!" 프로그램은 괄호가 있거나 없이 다음과 같이 작성할 수 있다:[8]
```lua
print("Hello, World!")
```
```lua
print "Hello, World!"
4. 1. 2. 팩토리얼 계산
lua
function factorial(n)
if n == 0 then
return 1
end
return n * factorial(n - 1)
end
```
계승을 계산하는 루아 프로그램으로, 재귀 호출 함수의 예시를 보여준다.[90]
5. 내부 구조
루아 프로그램은 직접 인터프리트되지 않고, 바이트 코드로 컴파일되어 루아 가상 머신에서 실행된다.[2][3] 컴파일 과정은 실행 시간에 사용자가 느끼지 못하게 시행되지만, 로딩 시간을 줄여 성능을 향상시키거나 컴파일러가 없는, 메모리 사용량에 제약이 있는 환경에서 실행하기 위해 미리 컴파일할 수도 있다.
루아 가상 머신은 CPU 구조와 닮은 레지스터 기반이라 실제 하드웨어 디자인과 유사성이 있다.[16] 레지스터 기반 가상 머신은 값의 과도한 복사를 방지하고, 함수를 구성하는 명령어 수를 줄일 수 있다는 장점이 있다. Lua 5 가상 머신은 최초의 널리 사용되는 레지스터 기반 가상 머신 중 하나이며, 다른 두 개의 잘 알려진 레지스터 기반 가상 머신으로는 펄의 패롯과 안드로이드의 달빅이 있다.[17]
Lua 5.0 이전에는 메모리 관리에 마크 & 스윕 방식의 가비지 컬렉션이 사용되었지만, Lua 5.1부터는 증분 가비지 컬렉션이 채택되어 실시간 용도에서의 성능 개선이 이루어졌다.
6. 응용 분야
루아는 다양한 분야에서 활용되는 프로그래밍 언어이다.
게임 개발비디오 게임 개발에서 루아는 임베딩이 쉽고, 실행 속도가 빠르며, 학습 곡선이 짧아 널리 사용되는 스크립팅 언어이다.[24] 2003년 GameDev.net 설문 조사에서는 게임 프로그래밍에 가장 인기 있는 스크립팅 언어로 선정되었으며,[28] 2012년에는 ''게임 개발자'' 잡지에서 프로그래밍 도구 부문 2011년 프론트 라인 어워드를 수상했다.[29]
루아를 사용하는 주요 게임은 다음과 같다.
게임 제목 | 비고 |
---|---|
로블록스 | [25] |
개리 모드 | |
월드 오브 워크래프트 | |
페이데이 2 | |
판타시 스타 온라인 2 | |
도타 2 | |
크라이시스 | [26] |
블루 마스 | |
파 크라이 | |
팩토리오 | |
프롬 더 뎁스 | |
로스트 윈드 | |
라그나로크 온라인 | [74] |
스톰웍스: 빌드 앤드 레스큐 | |
제노에픽 온라인 레보 | |
소닉 더 헤지혹 (2006년 게임) | |
소닉 언리쉬드 | |
티어즈 투 티아라 - 꽃관의 대지 | |
아이돌 마스터 2 | |
워해머 온라인: 에이지 오브 레크닝 | |
컴퍼니 오브 히어로즈 | |
GRAVITY DAZE | |
닌텐도 클래식 미니 패밀리 컴퓨터 | 에뮬레이터 시스템 kachikachi의 게임 선택 화면 |
파이널 판타지 XIV | [75] |
드래곤 퀘스트 X: 잠자는 다섯 종족 온라인 | [76] |
''마인크래프트''의 ComputerCraft처럼 모드를 통해 루아 기능을 추가하는 경우도 있다.[27]
기타 응용 프로그램비 게임 응용 프로그램에서도 확장성을 위해 루아를 사용한다.
응용 프로그램 | 비고 |
---|---|
어도비 포토샵 라이트룸 | |
Aegisub | |
Anime Studio | |
Apache mod_lua | |
Asterisk extensions.lua | |
AutoTouch | [77] |
AviUtl | |
FlashAir | 무선 LAN 기능을 탑재한 도시바제 SDHC 메모리 카드[78] |
FLOW | 설정[79] |
FreeBSD | 부트 로더 UI 구현[80] |
LuaTeX | |
MediaWiki | Scribunto 확장 |
MySQL Proxy | |
Nginx | |
nmap | |
OpenResty | [81] |
OpenWrt | |
osm2pgsql | OpenStreetMap 데이터를 PostGIS로 읽어들이는 유틸리티[82] |
Redis | |
RigidChips | |
Renoise | |
Strata 3D | |
Tachyon | |
TileMan | [83] |
야마하 라우터 제품 | RTX 시리즈(5000/3500/1300/1220/1210/1200/830/810) NVR 시리즈, FWX120, SRT100[84] |
Vim | 확장 스크립트 내에서 Lua 사용, Neovim에서는 LuaJIT 내장 |
VLC 미디어 플레이어 | |
VOCALOID3 | 사용자 제작 이펙터[85] |
와이어샤크 |
미디어위키Scribunto 확장을 통해 루아는 위키백과를 포함한 미디어위키 소프트웨어에서 서버 측 스크립팅 언어로 사용 가능하다.[30] 위키데이터의 데이터를 문서에 통합하거나, 자동 분류 상자 시스템을 구동하는 데 사용된다.[31]
7. 파생 언어 및 기술
- LuaJIT는 Lua 5.1 기반의 JIT(Just-In-Time) 컴파일러이다.[37][38] The Computer Language Benchmarks Game에 따르면, 동적 타입 언어 스크립트 언어 중 가장 빠른 언어/처리 시스템이다.[56] 정적 단일 할당 등을 사용한 고도의 최적화로 바이트 코드를 실행하는 것보다 수 배에서 수백 배의 속도 향상을 기대할 수 있다.[61]
- Luau는 Roblox Corporation에서 개발한 Lua 5.1 파생 언어로, 점진적 타이핑, 추가 기능 및 성능에 중점을 두고 있다.[39]
- Ravi는 선택적 정적 타이핑을 지원하는 JIT 기반 Lua 5.3 언어이다. JIT는 타입 정보를 기반으로 수행된다.[40]
- Shine은 모듈 시스템 및 매크로 시스템을 포함한 많은 확장을 가진 LuaJIT의 포크이다.[41]
- Glua는 Garry's Mod 게임에 스크립트 언어로 내장된 수정된 버전이다.[42]
- Teal은 Lua로 작성된 정적으로 타입이 지정된 Lua 방언이다.
- [http://www.luaj.org/luaj.html Luaj]라는 자바 가상 머신용 구현이 있다. [http://www.luaj.org/luaj/3.0/README.html Luaj 3.0]은 Lua 5.2 상당의 사양을 Java로 다시 구현한 것으로, Java 클래스에서 바인더 없이 인스턴스를 생성하거나 메서드를 호출할 수 있다. 그 외에, Lua의 C API를 JNI를 통해 Java에서 사용할 수 있게 해주는 JNLua[70]가 존재한다.
8. C/C++과의 연동
루아는 다른 애플리케이션에 내장되도록 설계되었으며, 이를 위해 C API를 제공한다.[19] 이 API는 루아 코어와 루아 보조 라이브러리의 두 부분으로 나뉜다.[19] 루아 API의 설계는 파이썬 API와 달리 C 코드에서 수동 참조 카운팅(관리)의 필요성을 없앴다. API는 언어와 마찬가지로 간결하며, 고급 기능은 보조 라이브러리에서 제공되며, 이는 복잡한 테이블 작업을 돕는 전처리기 매크로로 구성된다.
루아 C API는 스택 기반이다. 루아는 대부분의 간단한 C 데이터 유형(정수, 부동 소수점 등)을 스택에 넣고 빼는 함수와 스택을 통해 테이블을 조작하는 함수를 제공한다. 루아 스택은 기존 스택과 다소 다른데, 예를 들어 스택을 직접 인덱싱할 수 있다. 음수 인덱스는 스택 상단으로부터의 오프셋을 나타내며(예: -1은 맨 위), 양수 인덱스는 맨 아래로부터의 오프셋을 나타낸다. C와 루아 함수 간의 마샬링 데이터도 스택을 사용하여 수행된다. 루아 함수를 호출하려면 인수를 스택에 넣은 다음 `lua_call`을 사용하여 실제 함수를 호출한다. 루아에서 직접 호출할 C 함수를 작성할 때 인수는 스택에서 읽는다.
다음은 C에서 루아 함수를 호출하는 예시다.
```c
#include
#include
#include
int main(void)
{
// Lua 상태 생성
lua_State *L = luaL_newstate();
// 문자열 로드 및 실행
if (luaL_dostring(L, "function foo (x,y) return x+y end")) {
lua_close(L);
return -1;
}
// 전역 변수 "foo" (위에서 정의된 함수)의 값을 스택에 푸시하고, 이어서 정수 5와 3을 푸시
lua_getglobal(L, "foo");
lua_pushinteger(L, 5);
lua_pushinteger(L, 3);
lua_call(L, 2, 1); // 두 개의 인수와 하나의 반환 값을 가진 함수 호출
printf("Result: %d\n", lua_tointeger(L, -1)); // 스택 최상단에 있는 항목의 정수 값을 출력
lua_pop(L, 1); // 스택을 원래 상태로 되돌림
lua_close(L); // Lua 상태 닫기
return 0;
}
```
이 예제를 실행하면 다음과 같은 결과가 나타난다.
```console
$ cc -o example example.c -llua
$ ./example
Result: 8
```
C API는 또한 루아 스택의 다양한 "의사 인덱스"에 위치한 몇 가지 특수 테이블을 제공한다. 루아 5.2 이전에는[20] `LUA_GLOBALSINDEX`에 전역 테이블인 루아 내의 `_G`가 있으며, 이는 주된 네임스페이스이다. 또한 C 프로그램이 나중에 검색할 루아 값을 저장할 수 있는 `LUA_REGISTRYINDEX`에 레지스트리가 있다.
표준 라이브러리(코어) 모듈 외에도, 루아 API를 사용하여 확장을 작성할 수 있다. 확장 모듈은 공유 객체로, 루아 스크립트에 네이티브 기능을 제공하여 인터프리터의 기능을 확장하는 데 사용할 수 있다. 루아 스크립트는 루아 자체로 작성된 모듈과 마찬가지로 `require`[19] 또는 `package.loadlib`를 사용하여 확장 모듈을 로드할 수 있다.[21]
Lua에는 C 언어용 상호 운용 API가 준비되어 있다. Lua에서 C/C++ 함수를 호출하려면 다음 방법을 사용한다. 다음 코드는 C/C++ 함수를 Lua VM에 등록하고, Lua 스크립트 측에서 호출하고 있다.
```cpp
#include
#include
#include
#include
int my_add(lua_State* L) {
const int x = (int)lua_tonumber(L, 1); // 첫 번째 인수를 가져오기.
const int y = (int)lua_tonumber(L, 2); // 두 번째 인수를 가져오기.
lua_settop(L, 0); // 스택을 클리어.
const int ret = x + y; // C/C++ 측에서의 연산.
lua_pushnumber(L, ret); // 반환값을 푸시.
return 1;
}
int main(int argc, char* argv[]) {
lua_State* L = luaL_newstate(); // Lua VM 초기화.
luaL_openlibs(L); // Lua 표준 라이브러리를 사용할 수 있도록 함.
lua_register(L, "my_add", my_add); // Lua VM에 C/C++ 함수를 등록.
// my_add 함수를 호출하는 Lua 스크립트를 실행.
if (luaL_dostring(L, "print(my_add(5, 3))")) {
lua_close(L); // Lua VM을 닫음.
return EXIT_FAILURE; // 에러 종료.
}
lua_close(L);
return EXIT_SUCCESS;
}
```
반대로, C/C++에서 Lua 함수를 호출할 때에도 스택 조작이 필요하다.
```cpp
#include
#include
#include
#include
int main(int argc, char* argv[]) {
lua_State* L = luaL_newstate(); // Lua VM 초기화.
// add_func 함수를 정의하는 Lua 스크립트를 실행.
if (luaL_dostring(L, "function add_func(x, y) return x + y end")) {
lua_close(L); // Lua VM을 닫음.
return EXIT_FAILURE; // 에러 종료.
}
lua_getglobal(L, "add_func"); // Lua의 글로벌 객체인 "add_func"를 가져와 스택에 쌓음.
lua_pushinteger(L, 5); // 정수값 "5"를 Lua 스택에 푸시.
lua_pushinteger(L, 3); // 정수값 "3"을 Lua 스택에 푸시.
lua_call(L, 2, 1); // Lua 측에서 구현한 add_func 함수를 호출. 인수의 수는 2, 결과의 수는 1.
printf("Result: %d\n", lua_tointeger(L, -1)); // 결과를 표시.
lua_close(L);
return EXIT_SUCCESS;
}
```
CPAN, RubyGems 및 Python eggs의 정신으로, LuaRocks라는 패키지 관리 시스템을 통해 'rocks'라고 불리는 모듈이 증가하고 있다.[22]
루아의 다른 언어용 바인딩은 공식적으로 제공되지 않지만, 자발적인 제3자 라이브러리나 도구가 몇 가지 존재한다. 바인딩을 사용하면, 앞서 언급한 것과 같은 번거로운 스택 조작을 명시적으로 기술하지 않고 간결하게 상호 운용할 수 있게 된다.
[http://www.luaj.org/luaj.html Luaj]라는 자바 가상 머신용 구현이 있다. [http://www.luaj.org/luaj/3.0/README.html Luaj 3.0]은 Lua 5.2 상당의 사양을 Java로 다시 구현한 것으로, Java 클래스에서 바인더 없이 인스턴스를 생성하거나 메서드를 호출할 수 있다. 그 외에, Lua의 C API를 JNI를 통해 Java에서 사용할 수 있게 해주는 JNLua[70]가 존재한다.
C#이나 VB.NET과 같은 .NET Framework 언어용 바인딩으로, LunaRoad[71]가 존재한다. C#으로 작성된 Lua 인터프리터로 MoonSharp[72]가 존재한다. 또한, DLR 위에 구현된 NeoLua[73]가 존재한다.
9. 결론
C++(C++) 언어로 작성된 호스트 프로그램에 Lua를 통합하기 위한 간소화 도구(코드 생성기) 및 언어 바인딩으로 toLua[63], tolua++(Lua 5.2 미지원)[64][65], Luabind(Lua 5.2 미지원)[66], Selene[67], Sol[68], Sol2[69] 등이 개발되었다.
다음은 Sol2를 사용한 예시이다 (\[\[C++11]] 및 C++14 기능을 사용하기 때문에, 대응 컴파일러가 필요하다).
- Lua에서 C/C++ 함수를 호출하는 예시:
```cpp
#include
#include
int add(int x, int y) {
return x + y;
}
int main() {
// Lua 초기화
sol::state lua;
// Lua의 표준 라이브러리를 모두 열기
lua.open_libraries(sol::lib::base, sol::lib::coroutine, sol::lib::debug, sol::lib::debug,
sol::lib::io, sol::lib::math, sol::lib::os,
sol::lib::package, sol::lib::string, sol::lib::table, sol::lib::utf8);
// Lua에 C/C++ 함수를 등록
lua["add"] = add;
// Lua 스크립트 읽기
try {
lua.safe_script_file("test.lua");
} catch (const sol::error& e) {
std::cout << e.what() << std::endl;
}
}
```
C/C++ 함수를 호출하는 Lua 스크립트 (test.lua):
```lua
print(add(100, 200)) -- 「300」이 표시됨
```
- C++에서 Lua 함수를 호출하는 예시:
```cpp
#include
#include
int main() {
// Lua 초기화
sol::state lua;
// Lua의 표준 라이브러리를 모두 열기
lua.open_libraries(sol::lib::base, sol::lib::coroutine, sol::lib::debug, sol::lib::debug,
sol::lib::io, sol::lib::math, sol::lib::os,
sol::lib::package, sol::lib::string, sol::lib::table, sol::lib::utf8);
// Lua 스크립트 읽기
try {
lua.safe_script_file("test.lua");
} catch (const sol::error& e) {
std::cout << e.what() << std::endl;
}
// Lua 함수를 호출
sol::function_result ret = lua["add"](100, 200);
// 결과 표시
std::cout << ret.get
}
```
C++에서 호출되는 함수를 정의하는 Lua 스크립트 (test.lua):
```lua
function add(a, b)
return a + b
end
참조
[1]
웹사이트
The Ring programming language and other languages
http://ring-lang.sou[...]
2017-12-05
[2]
간행물
Lua—An Extensible Extension Language
https://www.lua.org/[...]
2015-10-24
[3]
웹사이트
About Lua
https://www.lua.org/[...]
Lua.org
2011-08-11
[4]
간행물
From Brazil to Wikipedia
https://www.foreigna[...]
2013-04-25
[5]
서적
Proceedings of the third ACM SIGPLAN conference on History of programming languages
https://www.acm.org/[...]
[6]
웹사이트
The evolution of an extension language: a history of Lua
https://www.lua.org/[...]
2008-12-18
[7]
뉴스
Lua: an Extensible Embedded Language. A few metamechanisms replace a host of features
https://www.lua.org/[...]
1996-12
[8]
웹사이트
Programming in Lua : 1
https://www.lua.org/[...]
[9]
웹사이트
Lua 5.0 Reference Manual, 2.5.7, Function Calls
https://www.lua.org/[...]
[10]
웹사이트
Lua 5.1 Reference Manual
https://www.lua.org/[...]
2014-02-27
[11]
웹사이트
Lua 5.1 Reference Manual
https://www.lua.org/[...]
2012-10-16
[12]
웹사이트
Lua 5.1 Source Code
https://www.lua.org/[...]
2011-03-24
[13]
서적
Programming in Lua, 4th Edition
[14]
웹사이트
Programming in Lua : 16.3
https://www.lua.org/[...]
2021-09-16
[15]
웹사이트
Metamethods Tutorial
http://lua-users.org[...]
2021-09-16
[16]
간행물
The implementation of Lua 5.0
http://www.jucs.org/[...]
[17]
서적
PC Scheme: Users Guide and Language Reference Manual, Trade Edition
MIP Press
[18]
웹사이트
A No-Frills Introduction to Lua 5.1 VM Instructions
https://talk.pokitto[...]
[19]
웹사이트
Lua 5.2 Reference Manual
https://www.lua.org/[...]
Lua.org
2012-10-23
[20]
서적
Changes in the API
https://www.lua.org/[...]
Lua.org
2014-05-09
[21]
웹사이트
Lua 5.4 Reference Manual
https://www.lua.org/[...]
2022-06-01
[22]
웹사이트
LuaRocks
https://luarocks.org[...]
luarocks.org
2009-05-24
[23]
웹사이트
Binding Code To Lua
http://lua-users.org[...]
Lua-users wiki
2009-05-24
[24]
웹사이트
Why is Lua considered a game language?
https://stackoverflo[...]
2017-04-22
[25]
웹사이트
Why Lua''u''?
https://luau-lang.or[...]
2022-03-23
[26]
웹사이트
Introduction to Crysis server-side modding
https://crymp.net/th[...]
2022-03-23
[27]
웹사이트
Lua Functions
https://wow.gamepedi[...]
2021-03-01
[28]
웹사이트
Poll Results
https://gamedev.net/[...]
2017-04-22
[29]
웹사이트
Front Line Award Winners Announced
http://www.gdmag.com[...]
2017-04-22
[30]
웹사이트
Extension:Scribunto - MediaWiki
https://www.mediawik[...]
2019-02-21
[31]
웹사이트
Wikidata:Infobox Tutorial - Wikidata
https://www.wikidata[...]
2018-12-21
[32]
웹사이트
Language Guide - MoonScript 0.5.0
https://moonscript.o[...]
2020-09-25
[33]
웹사이트
leafo/moonscript
https://github.com/l[...]
2020-09-25
[34]
웹사이트
Languages that compile to Lua
https://andregarzia.[...]
2020-09-25
[35]
웹사이트
Urn: A Lisp implementation for Lua {{!}} Urn
https://urn-lang.com[...]
2021-01-12
[36]
웹사이트
Amulet ML
https://amulet.works[...]
2021-01-12
[37]
웹사이트
LuaJIT
https://luajit.org/l[...]
[38]
웹사이트
Extensions
https://luajit.org/e[...]
[39]
웹사이트
Why Luau?
https://luau-lang.or[...]
2024-08-03
[40]
웹사이트
Ravi Programming Language
http://ravilang.gith[...]
[41]
웹사이트
richardhundt/shine
https://github.com/r[...]
2021-04-22
[42]
웹사이트
Garry's Mod Wiki
https://wiki.facepun[...]
[43]
웹사이트
Lua Power Patches
http://lua-users.org[...]
2021-05-18
[44]
문서
Lua: version history
https://www.lua.org/[...]
[45]
웹사이트
IUP
https://www.wikidata[...]
2023-05-17
[46]
서적
Integrating the lua language and the common language runtime
MAXWELL
2004-03-19
[47]
서적
MAXWELL
2006-09-13
[48]
웹사이트
Waldemar Celes (Filho)
https://web.tecgraf.[...]
2021-05-04
[49]
웹사이트
The Evolution of an Extension Language: A History of Lua
https://www.wikidata[...]
2023-05-17
[50]
웹사이트
Lua言語の紹介
https://staff.aist.g[...]
産業技術総合研究所
2021-05-04
[51]
웹사이트
Lua: authors
https://www.lua.org/[...]
2021-05-04
[52]
문서
原文の執筆者はRoberto Ierusalimschy、Luiz Henrique de Figueiredo、Waldemar Celes Filho
[53]
간행물
Lua—an Extensible Extension Language
[54]
간행물
A Text Pattern-Matching Tool Based on Parsing Expression Grammars
2009-03-10
[55]
간행물
Proceedings of V Brazilian Symposium on Programming Languages
https://www.lua.org/[...]
[56]
웹사이트
x64 Ubuntu:Intel®Q6600®one core Computer Language Benchmarks Game
http://shootout.alio[...]
2012-09-16
[57]
웹사이트
TIOBE Index
https://www.tiobe.co[...]
[58]
문서
Satori » The Engine Survey:General results
http://www.satori.or[...]
[59]
웹사이트
Lua scripting
https://www.mediawik[...]
MediaWiki
2020-09-14
[60]
웹사이트
Lua: license
https://www.lua.org/[...]
2021-03-04
[61]
문서
http://luajit.org/pe[...]
[62]
문서
スクリプト化可能なアプリケーションに Lua を組み込む
https://www.ibm.com/[...]
[63]
문서
toLua home page
http://webserver2.te[...]
[64]
웹사이트
toLua++ - binding c/c++ code to lua
http://www.codenix.c[...]
2013-04-02
[65]
문서
LuaDist/toluapp: tolua++ is an extension of toLua, a tool to integrate C/Cpp code with Lua
https://github.com/L[...]
[66]
웹사이트
luabind
http://www.rasterbar[...]
Rasterbar Software
2013-04-02
[67]
문서
Selene
https://github.com/j[...]
2013-04-02
[68]
문서
Rapptz/sol
https://github.com/R[...]
2023-05-17
[69]
문서
sol2
https://github.com/T[...]
2023-05-17
[70]
문서
JNLua (Java Native Lua) | Google Code Archive - Long-term storage for Google Code Project Hosting.
https://code.google.[...]
[71]
Github
3F/LunaRoad: Lua C API for .NET :: LunaRoad represents flexible platform for work with Lua 5.1, 5.2, 5.3 ....
https://github.com/3[...]
[72]
웹사이트
MoonSharp
http://www.moonsharp[...]
[73]
Github
neolithos/neolua: A Lua implementation for the Dynamic Language Runtime (DLR).
https://github.com/n[...]
[74]
웹사이트
ホムンクルス人工知能スクリプトマニュアル
https://ragnarokonli[...]
2019-07-29
[75]
뉴스
「FFXIV:新生エオルゼア」プロデューサー吉田直樹氏インタビュー
https://game.watch.i[...]
[76]
간행물
WEB+DB PRESS Vol.90 特集2 ドラゴンクエストX開発ノウハウ大公開 国民的RPGオンライン化へのチャレンジ
[77]
웹사이트
AutoTouch 公式ホームページ
https://autotouch.ne[...]
[78]
문서
FlashAir Developers - ドキュメント - APIガイド - Lua機能
https://flashair-dev[...]
[79]
웹사이트
darts/flow
http://darts.jaxa.jp[...]
2013-09-20
[80]
웹사이트
loader_lua(8)
https://man.freebsd.[...]
2023-12-31
[81]
웹사이트
Components - OpenResty
http://openresty.org[...]
2013-09-20
[82]
웹사이트
Osm2pgsql - OpenStreetMap Wiki
http://wiki.openstre[...]
2013-09-20
[83]
웹사이트
TileMan
https://github.com/o[...]
2013-09-20
[84]
웹사이트
Lua スクリプト機能
http://www.rtpro.yam[...]
ヤマハ株式会社
2013-03-28
[85]
웹사이트
ボーカロイドストア
http://shop.vocaloid[...]
[86]
웹인용
The Ring programming language and other languages
http://ring-lang.sou[...]
ring-lang
2019-10-25
[87]
문서
Ierusalimschy
2021
[88]
서적
루아 프로그래밍 가이드
http://preview.hanbi[...]
한빛미디어
2020-06-25
[89]
문서
Ierusalimschy
2021
[90]
문서
Ierusalimschy
2021
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com