Lua(프로그래밍 언어)

Lua (programming language)
루아
Lua-Logo.svg
패러다임멀티패러다임: 스크립트 작성, 필수(프로시저, 프로토타입 기반, 객체 지향), 기능, 메타, 반사
설계자로베르토 이에루살림시
발데마르 셀레스
루이스 헨리케 드 피게이레도
처음 등장한1993년; 29년 전(1993년)
안정된 릴리스
5.4.4[1] / 2022년 1월 26일; 6개월 전(2022년 1월 26일)
타이핑 분야역동적이고, 강하고, 오리
구현 언어ANSI C
OS크로스 플랫폼
면허증.MIT 라이선스
파일 이름 확장자.lua
웹 사이트www.lua.org Edit this at Wikidata
주요 구현
Lua, LuaJIT, LuaVela, MoonSharp, Luvit, LuaRT, Luau
사투리
Metalua, Idle, GSL
영향을 받다
C++, CLU, 모듈라, 스킴, SNOBOL
영향받은
GameMonkey, Io, JavaScript, Julia, MiniD, Red, Ring,[2] Ruby, Squirle, MoonScript, C-

Lua(/luə/LOO-)주로 [3]응용 프로그램에서 사용하기 위해 설계경량, 하이레벨, 멀티패러다임 프로그래밍 언어입니다.컴파일된 바이트 코드의 인터프리터ANSI [4]C로 작성되어 있기 때문에 Lua는 크로스 플랫폼이며,[5] Lua는 비교적 간단한 C API를 사용하여 응용 프로그램에 포함시킬 수 있습니다.

Lua는 1993년에 소프트웨어 애플리케이션을 확장하여 커스터마이즈 수요 증가에 대응하기 위한 언어로 설계되었습니다.대부분의 프로시저 프로그래밍 언어의 기본적인 기능을 제공했지만, 보다 복잡하거나 도메인 고유의 기능은 포함되지 않았습니다.대신 언어를 확장하기 위한 메커니즘이 포함되어 있어 프로그래머가 이러한 기능을 구현할 수 있었습니다.Lua는 일반적인 임베디드 확장 언어이기 때문에 Lua의 설계자는 속도, 휴대성, 확장성 및 개발에서의 사용 편의성 향상에 초점을 맞췄다.

역사

Lua는 1993년 브라질 리우데자네이루 교황청 가톨릭대학 컴퓨터그래픽 테크놀로지 그룹(Tecgraf) 멤버인 Roberto Ierusalimschy, Luiz Henrique de Figueiredo 및 Waldemar Celes에 의해 만들어졌습니다.

1977년부터 1992년까지 브라질은 컴퓨터 하드웨어와 소프트웨어에 대해 강력한 무역 장벽(시장 보호구역) 정책을 가지고 있었다.이러한 상황에서 Tecgraf의 고객은 정치적 또는 재정적으로 해외에서 맞춤형 소프트웨어를 구입할 여유가 없었습니다.이러한 이유로 Tecgrraf는 필요한 기본 툴을 [6]처음부터 구현했습니다.

Lua의 이전 버전은 데이터 기술/구성 언어 SOL(Simple Object Language) 및 DEL(Data-Entry [7]Language)이었습니다.1992-1993년 Tecgraf에서 두 개의 다른 프로젝트에 유연성을 추가하기 위해 독립적으로 개발되었습니다(둘 다 Petrobras 회사의 엔지니어링 애플리케이션을 위한 대화형 그래픽 프로그램이었습니다).SOL과 DEL에는 흐름 제어 구조가 부족했고, Petrobras는 이러한 구조에 완전한 프로그래밍 능력을 추가해야 한다는 필요성을 느꼈습니다.

The Evolution of Lua에서 이 언어의 저자는 다음과 같이 [6]썼다.

1993년, 유일한 진정한 경쟁자는 애플리케이션에 포함되도록 명시적으로 설계된 Tcl이었습니다.그러나 Tcl은 익숙하지 않은 구문을 가지고 있었고 데이터 기술을 제대로 지원하지 않았으며 Unix 플랫폼에서만 실행되었습니다.LISP 또는 Scheme는 비우호적인 구문 때문에 고려하지 않았습니다.Python은 아직 초기 단계에 있었다.Tecgraf가 지배하던 자유롭고 DIY(Do It Yourself)적인 분위기 속에서 독자적인 스크립트 언어를 개발해야 하는 것은 당연했습니다.언어의 많은 잠재적 사용자가 전문 프로그래머가 아니기 때문에 언어는 암호 구문과 의미론을 피해야 합니다.새로운 언어의 실장은 휴대성이 매우 높아야 합니다.Tecgraf의 클라이언트는 매우 다양한 컴퓨터 플랫폼을 보유하고 있었기 때문입니다.마지막으로 다른 Tecgraf 제품도 스크립트 언어를 포함해야 하므로 새로운 언어는 SOL의 예를 따르고 C API를 갖춘 라이브러리로 제공되어야 합니다.

Lua 1.0은 현재의 가볍고 유연한 스타일과는 약간 다른 SOL의 데이터 기술 구문을 포함하도록 설계되었다(따라서 포르투갈어로 "Sun"을 뜻하는 Lua: Sol과 "Moon"을 뜻하는 Lua).제어 구조의 Lua 구문은 대부분 Modula에서 차용되었습니다.if,while,repeat/until또한 CLU(레퍼런스 파라미터 또는 명시적인 포인터의 단순한 대안으로서 함수 호출에서 여러 개의 할당과 여러 개의 반환), C++("로컬 변수를 필요한 곳에만 선언할 수 있도록 한다."),[6] SNOBOL AWK(어소시에이션 어레이)의 영향을 받았습니다.Dobb's Journal에 게재된 기사에서 Lua의 창작자들은 또한 Lua의 [8]주요 데이터 구조로서 테이블을 개발하기로 결정한 데 LISP와 Scheme의 단일 유비쿼터스 데이터 구조 메커니즘(리스트)이 큰 영향을 미쳤다고 언급하고 있다.

Lua 의미론은 시간이 [6]지남에 따라 특히 익명 함수와 완전한 어휘 범위 지정도입과 함께 Scheme의 영향을 점점 더 많이 받아왔다.새로운 Lua 버전에는 몇 가지 기능이 추가되었습니다.

버전 5.0보다 이전 버전의 Lua는 BSD 라이선스와 유사한 라이선스로 출시되었습니다.버전 5.0 이후, Lua는 MIT 라이선스에 근거해 라이센스를 취득했습니다.둘 다 허용 가능한 자유 소프트웨어 라이센스이며 거의 동일합니다.

특징들

Lua는 일반적으로 "멀티패러다임" 언어로 표현되며, 다양한 문제 유형에 맞게 확장할 수 있는 작은 일반 기능 세트를 제공합니다.Lua는 상속을 명시적으로 지원하지 않지만 메타테이블을 사용하여 구현할 수 있습니다.마찬가지로, Lua는 프로그래머가 단일 테이블 구현을 사용하여 네임스페이스, 클래스 및 기타 관련 기능을 구현할 수 있도록 하고, 1등급 함수는 함수 프로그래밍에서 많은 기술을 사용할 수 있도록 하며, 완전한 어휘 범위 지정은 최소 특권의 원칙을 적용하기 위해 세분화된 정보를 숨길 수 있도록 합니다.

일반적으로 Lua는 하나의 프로그래밍 패러다임에 고유한 기능 세트를 제공하는 것이 아니라 필요에 따라 확장할 수 있는 단순하고 유연한 메타 기능을 제공하기 위해 노력하고 있습니다.그 결과, 기본 언어는 가볍고 전체 참조 통역기는 약 247 kB에[4] 불과하며 광범위한 애플리케이션에 쉽게 적응할 수 있습니다.

확장 언어 또는 스크립트 언어로 사용하기 위한 동적 유형 언어인 Lua는 다양한 호스트 플랫폼에 적합할 정도로 컴팩트합니다.부울값, 숫자(기본적으로 2배 정밀도의 부동소수점 및 64비트 정수), 문자열같은 소수의 원자 데이터 구조만 지원합니다.어레이, 세트, 리스트, 레코드같은 일반적인 데이터 구조는 Lua의 단일 네이티브 데이터 구조인 테이블을 사용하여 나타낼 수 있습니다.테이블은 기본적으로 이종 어소시에이션 어레이입니다.

Lua는 퍼스트 클래스 함수, 가비지 컬렉션, 클로징, 적절한 테일 콜, 강제(실행 시 문자열과 번호 값 간의 자동 변환), 코루틴(공동 멀티태스킹) 및 동적 모듈 로딩 등의 소규모 고급 기능을 구현합니다.

구문

고전적인 "Hello, World!" 프로그램[9]다음과 같이 작성할 수 있습니다.

인쇄물("안녕, 월드!") 

또는 다음과 같이 입력합니다.

인쇄물 안녕, 세상아! 

Lua의 코멘트는 이중 하이픈으로 시작하여 Ada, Eiffel, Haskell, SQL 및 VHDL과 같이 행의 마지막까지 이어집니다.여러 줄의 문자열과 코멘트는 이중 대괄호로 장식됩니다.

예제에서는 요인 함수를 함수로 구현합니다.

기능. 요인(n)   현지의 x = 1   위해서 i = 2, n 하다     x = x * i   끝.   돌아가다 x 끝. 

흐름 제어

Lua에는 한 가지 유형의 조건부 테스트가 있습니다.if then end옵션으로else그리고.elseif then실행 제어 구성.

범용if then endstatement에는 다음 3가지 키워드가 모두 필요합니다.

한다면 조건. 그리고나서  --스테이트먼트 본문 끝. 

else키워드와 함께 스테이트먼트블록을 추가하여 다음 경우에 실행을 제어할 수 있습니다.if상태가 평가되다false:

한다면 조건. 그리고나서  --스테이트먼트 본문 또 다른  --스테이트먼트 본문 끝. 

또한 실행은 다음 명령을 사용하여 여러 조건에 따라 제어할 수 있습니다.elseif then키워드:

한다면 조건. 그리고나서  --스테이트먼트 본문 그렇지 않으면 조건. 그리고나서  --스테이트먼트 본문 또 다른 --옵션  --옵션의 디폴트스테이트먼트 본문 끝. 

Lua에는 4가지 타입의 조건부 루프가 있습니다.루프, 루프,repeat루프(루프와 유사), 숫자 루프 및 일반 루프for고리.

--condition = true  하는 동안에 조건. 하다   --문 끝.  따라하다   --문 까지 조건.  위해서 i = 첫번째, 지난, 델타 하다  --for loop이 카운트다운 또는 업 할 수 있도록 하기 위해 음수일 수 있습니다.   --문   --print(i) 끝. 

범용for루프:

위해서 열쇠, 가치  쌍들(_G) 하다   인쇄물(열쇠, 가치) 끝. 

테이블 위에서 반복할 것이다_G표준 반복기 기능 사용pairs반환될 때까지nil.

루프는 네스트할 수도 있습니다(다른 루프의 내부에 배치).

현지의 격자무늬 = {   { 11, 12, 13 },   { 21, 22, 23 },   { 31, 32, 33 } }  위해서 y, 배를 젓다  아이페어(격자무늬) 하다   위해서 x, 가치  아이페어(배를 젓다) 하다     인쇄물(x, y, 가치)   끝. 끝. 

기능들

함수를 퍼스트 클래스 값으로 처리하는 Lua의 방법은 인쇄 함수의 동작을 수정한 다음 예에 나와 있습니다.

하다   현지의 구식 인쇄물 = 인쇄물   -- 현재 인쇄 기능을 오래된 인쇄로 저장합니다.   기능. 인쇄물(s)     --[[인쇄기능 재정의]일반적인 인쇄 기능을 계속 사용할 수 있습니다. 오래된 지문을 통해서.새 인수에는 인수가 1개뿐입니다.]     구식 인쇄물(s == "푸" 그리고. '바' 또는 s)   끝. 끝. 

앞으로 에 문의할 경우print이제 새로운 기능을 통해 라우팅됩니다.Lua의 어휘 범위 설정 때문에 이전 인쇄 기능은 변경된 새 인쇄에서만 액세스할 수 있습니다.

Lua는 또한 아래와 같이 폐쇄를 지원합니다.

기능. 추가(x)   -- 인수에 x를 추가하는 새 함수를 반환합니다.   돌아가다 기능.(y)     --[=] 전류 밖에 있는 변수 x를 참조할 때 범위와 그 수명이 이 익명의 수명보다 짧을 수 있습니다. Lua가 닫힘을 만듭니다.]=]     돌아가다 x + y   끝. 끝. 포플러스 = 추가(4) 인쇄물(포플러스(3))  -- 인쇄 7  --이것은, 다음의 방법으로 함수를 호출하는 것으로도 실현됩니다. 인쇄물(추가(4)(3)) --[[이것은 'addto(4)'에서 반환된 함수를 인수 '3'으로 직접 호출하기 때문입니다. 또, 데이터 코스트의 삭감과 퍼포먼스의 향상에도 도움이 됩니다. ]] 

변수에 대한 새 마감x매번 작성됩니다.addto호출되어 반환되는 새로운 어나니머스 함수는 항상 자신의 함수에 액세스 할 수 있습니다.x파라미터를 지정합니다.닫힘은 다른 개체와 마찬가지로 Lua의 가비지 컬렉터에 의해 관리됩니다.

테이블

테이블은 Lua에서 가장 중요한 데이터 구조(및 설계상 유일한 임베디드 복합 데이터 유형)이며 모든 사용자 생성 유형의 기반이 됩니다.이들은 자동 숫자 키와 특수 구문이 추가된 연관 배열입니다.

테이블은 키와 데이터 쌍의 집합이며, 여기서 데이터는 키로 참조됩니다. 즉, 해시된 이기종 관련 배열입니다.

테이블은 를 사용하여 작성됩니다.{}컨스트럭터 구문.

a_테이블 = {} -- 빈 새 테이블을 만듭니다. 

테이블은 항상 참조에 의해 전달됩니다(공유에 의한참조).

키(인덱스)는 다음을 제외하고 모든 값이 될 수 있습니다.nil NaN(기능 포함)입니다.

a_테이블 = {x = 10}  -- 하나의 엔트리가 숫자 10에 "x" 매핑된 새 테이블을 작성합니다. 인쇄물(a_테이블["x"]) -- 문자열 키와 관련된 값(이 경우 10)을 인쇄합니다. 테이블 = a_테이블 테이블["x"] = 20   --테이블의 값이 20으로 변경되었습니다. 인쇄물(테이블["x"]) -- 20 을 인쇄합니다. 인쇄물(a_테이블["x"]) --a_table과 b_table은 모두 같은 테이블을 참조하기 때문에 20도 인쇄합니다. 

테이블은 스트링을 키로 사용하여 구조(또는 레코드)로 사용되는 경우가 많습니다.이러한 사용은 매우 일반적이기 때문에 Lua는 이러한 필드에 [10]액세스하기 위한 특별한 구문을 갖추고 있습니다.

포인트 = { x = 10, y = 20 }   -- 새 테이블을 만듭니다. 인쇄물(포인트["x"])            -- 인쇄 10 인쇄물(포인트.x)               -- 위의 행과 정확히 같은 의미를 가집니다.읽기 쉬운 점 표기법은 단지 통사설탕일 뿐이다. 

테이블을 사용하여 관련 함수를 저장함으로써 네임스페이스 역할을 할 수 있습니다.

포인트 = {}  포인트.신규 = 기능.(x, y)   돌아가다 {x = x, y = y}  -- {["x"] = x, ["y"] = y}를 반환합니다. 끝.  포인트.set_x = 기능.(포인트, x)   포인트.x = x  -- point["x"] = x; 끝. 

테이블에는 자동으로 숫자 키가 할당되어 배열 데이터 유형으로 사용할 수 있습니다.첫 번째 자동 인덱스는 다른 많은 프로그래밍 언어와 마찬가지로 0이 아니라 1입니다(0의 명시적 인덱스는 허용됨).

숫자 키1문자열 키와 구별됩니다."1".

배열 = { "a", "b", "c", "d" }   -- 인덱스는 자동으로 할당됩니다. 인쇄물(배열[2])                  -- 「b」를 인쇄합니다.Lua의 자동 인덱싱은 1부터 시작합니다. 인쇄물(#배열)                    -- prints 4. # 는 테이블과 문자열의 길이 연산자입니다. 배열[0] = "z"                   0은 법적 지표입니다. 인쇄물(#배열)                    -- Lua 어레이가 1 베이스이기 때문에, 4 는 인쇄됩니다. 

테이블의 길이t모든 정수 인덱스로 정의됩니다.n그렇게 해서t[n]아니다nil그리고.t[n+1]nil게다가 만약t[1]nil,n0 이 될 수 있습니다.nil 이외의 값이 1 ~ 지정된 일반 어레이의 경우n, 그것의 길이는 정확히 다음과 같습니다.n마지막 값의 인덱스입니다.배열에 "구멍"(즉, nil이 아닌 다른 값 사이의 0 값)이 있는 경우#t의 바로 앞에 있는 임의의 인덱스가 될 수 있습니다.nilvalue(즉,[11] 배열의 끝과 같은 0 값을 고려할 수 있습니다).

예표 = {   {1, 2, 3, 4},   {5, 6, 7, 8} } 인쇄물(예표[1][3]) -- 「3」을 인쇄합니다. 인쇄물(예표[2][4]) -- 「8」로 인쇄합니다. 

테이블은 객체의 배열이 될 수 있습니다.

기능. 포인트(x, y)        -- "Point" 객체 생성자   돌아가다 { x = x, y = y }   -- 새 개체(테이블)를 만들고 반환합니다. 끝. 배열 = { 포인트(10, 20), 포인트(30, 40), 포인트(50, 60) }   -- 점 배열을 작성합니다.                         -- 어레이 = { { x = 10, y = 20 }, { x = 30, y = 40 }, { x = 50, y = 60 }; 인쇄물(배열[2].y)                                         -- 40 을 인쇄 

해시 맵을 사용하여 어레이를 에뮬레이트하는 것은 일반적으로 실제 어레이를 사용하는 것보다 느립니다.단, Lua 테이블은 이 문제를 피하기 위해 [12]어레이로 사용하도록 최적화되어 있습니다.

메타테이블

확장 가능한 시멘틱스는 Lua의 주요 기능으로, 측정 가능한 개념을 통해 테이블을 강력하게 맞춤화할 수 있습니다.다음 예제에서는 "무한" 테이블을 보여 줍니다.모든 사용자용n,fibs[n]를 줄 것이다.n- 동적 프로그래밍메모화사용하는 피보나치 번호.

파이브 = { 1, 1 }                                -- fibs [ 1 ]및 fibs [ 2 ]의 초기값. 설정 가능한(파이브, {   __인덱스 = 기능.(가치, n)                --[_index는 Lua에 의해 정의된 함수입니다. 키 "n"이 존재하지 않으면 호출됩니다.]     가치[n] = 가치[n - 1] + 가치[n - 2]  -- fib[n]를 계산하여 메모합니다.     돌아가다 가치[n]   끝. }) 

객체 지향 프로그래밍

Lua에는 클래스 개념이 내장되어 있지 않지만 함수 및 테이블을 사용하여 객체 지향 프로그래밍을 에뮬레이트할 수 있습니다.오브젝트는 메서드와 필드를 테이블에 배치하여 형성됩니다.상속(단일 및 복수 모두)은 메타테이블을 사용하여 구현할 수 있으며 존재하지 않는 메서드와 필드를 부모 객체에 위임할 수 있습니다.

이러한 기술에는 "클래스"라는 개념이 없습니다. 대신 Self 또는 JavaScript유사한 프로토타입을 사용합니다.새 개체는 공장 방법(새 개체를 처음부터 구성) 또는 기존 개체를 복제하여 생성됩니다.

기본 벡터 개체 만들기:

현지의 벡터 = {} 현지의 벡터메타 = { __인덱스 = 벡터}  기능. 벡터.신규(x, y, z)    -- 컨스트럭터   돌아가다 설정 가능한({x = x, y = y, z = z}, 벡터메타) 끝.  기능. 벡터.규모(자신)     -- 다른 방법   돌아가다 math.discrt(자신.x^2 + 자신.y^2 + 자신.z^2) 끝.  현지의 VEC = 벡터.신규(0, 1, 0) -- 벡터를 만듭니다. 인쇄물(VEC.규모(VEC))       -- 메서드를 호출합니다(출력: 1). 인쇄물(VEC.x)                    -- 멤버 변수에 액세스합니다(출력: 0). 

여기서,setmetatableLua에게 Lua에게 명령합니다.Vector테이블이 존재하지 않는 경우vec테이블.vec.magnitude에 상당합니다.vec["magnitude"], 첫 번째 조사합니다.vec를 위한 테이블magnitude요소.vec테이블에는 다음이 없습니다.magnitude구성 요소, 단, 구성 가능한 대리인은Vector를 위한 테이블magnitude에 존재하지 않는 요소vec테이블.

Lua는 물체 방향을 쉽게 하기 위해 약간의 통사 당을 제공합니다.프로토타입 테이블 내에서 멤버 함수를 선언하려면function table:func(args)에 상당합니다.function table.func(self, args)콜 클래스 메서드에서도 콜론을 사용합니다.object:func(args)와 동등하다object.func(object, args).

그 점을 염두에 두고, 여기 이 강의는:통사당:

현지의 벡터 = {} 벡터.__인덱스 = 벡터  기능. 벡터:신규(x, y, z)    -- 컨스트럭터   -- 함수 정의에서는 콜론을 사용하기 때문에,   --그 첫 번째 인수는 '자기'입니다.   -- "Vector"로   돌아가다 설정 가능한({x = x, y = y, z = z}, 자신) 끝.  기능. 벡터:규모()     -- 다른 방법   -- self를 사용하여 암묵적인 오브젝트를 참조합니다.   돌아가다 math.discrt(자신.x^2 + 자신.y^2 + 자신.z^2) 끝.  현지의 VEC = 벡터:신규(0, 1, 0) -- 벡터를 만듭니다. 인쇄물(VEC:규모())          -- 메서드를 호출합니다(출력: 1). 인쇄물(VEC.x)                    -- 멤버 변수에 액세스합니다(출력: 0). 

상속

Lua는 메타테이블을 사용하여 Lua 클래스를 [13]상속할 수 있도록 지원합니다.이 예에서는 파생 클래스에서 벡터의 값에 상수를 곱할 수 있습니다.

현지의 벡터 = {} 벡터.__인덱스 = 벡터  기능. 벡터:신규(x, y, z)    -- 컨스트럭터   - 여기서 '셀프'는 어떤 계급이든 '새로운'을 말합니다.   -- 호출하는 메서드.파생된 수업에서, 자기 의지는   -- 파생 클래스가 됩니다.벡터 클래스에서 자기   -- 벡터가 됩니다.   돌아가다 설정 가능한({x = x, y = y, z = z}, 자신) 끝.  기능. 벡터:규모()     -- 다른 방법   -- self를 사용하여 암묵적인 오브젝트를 참조합니다.   돌아가다 math.discrt(자신.x^2 + 자신.y^2 + 자신.z^2) 끝.  -- 클래스 상속의 예 현지의 벡터 멀티 = {} 벡터 멀티.__인덱스 = 벡터 멀티 설정 가능한(벡터 멀티, 벡터) -- VectorMult를 Vector의 하위 항목으로 만듭니다.  기능. 벡터 멀티:곱하다(가치)    자신.x = 자신.x * 가치   자신.y = 자신.y * 가치   자신.z = 자신.z * 가치   돌아가다 자신 끝.  현지의 VEC = 벡터 멀티:신규(0, 1, 0) -- 벡터를 만듭니다. 인쇄물(VEC:규모())          -- 메서드를 호출합니다(출력: 1). 인쇄물(VEC.y)                    -- 멤버 변수에 액세스합니다(출력: 1). VEC:곱하다(2)                 -- 벡터의 모든 성분에 2를 곱한다. 인쇄물(VEC.y)                    -- 멤버 재접속(출력:2) 

Lua는 다중 상속도 지원합니다.__index 는 함수 [14]또는 테이블일 수 있습니다.연산자 오버로드도 수행할 수 있습니다. Lua 메타테이블은 다음과 같은 요소를 가질 수 있습니다.__add,__sub기타 등등.[15]

실행

Lua 프로그램은 텍스트 Lua 파일에서 직접 해석되지 않고 바이트 코드로 컴파일되어 Lua 가상 시스템에서 실행됩니다.컴파일 프로세스는 일반적으로 사용자에게는 보이지 않으며 런타임에 실행됩니다.특히 JIT 컴파일러를 사용하는 경우에는 오프라인으로 실행할 수 있습니다.다만, 컴파일러를 사용하지 않고 호스트 환경의 로드 퍼포먼스를 높이거나 메모리 용량을 줄이기 위해 오프라인으로 실행할 수 있습니다.Lua 바이트 코드는 Lua 내에서 생성 및 실행할 수도 있습니다.dump스트링 라이브러리와load/loadstring/loadfile기능들.Lua 버전 5.3.4는 약 24,000줄의 C [3][4]코드로 구현되어 있습니다.

대부분의 CPU와 마찬가지로 (스택 기반인) 대부분의 가상 머신과 달리 Lua VM은 레지스터 기반이므로 실제 하드웨어 설계와 더 유사합니다.레지스터 아키텍처는 값의 과도한 복사를 방지하고 함수별 명령의 총 수를 줄입니다.Lua 5의 가상 머신은 널리 사용되는 최초의 레지스터 기반 [16]순수 VM 중 하나입니다.Parrow와 Android의 Dalvik은 다른 두 개의 유명한 레지스터 기반 VM입니다. PCScheme의 VM도 레지스터 [17]기반이었습니다.

이 예는 위에 정의된 요인 함수의 바이트 코드 목록입니다(예:luac5.1 컴파일러):[18]

함수 <function >를 참조해 주세요.lua:1,7> (9개의 명령, 0x8063c60에서 36바이트) 1개의 파라미터, 6개의 슬롯, 0의 업값, 6개의 로컬, 2개의 상수, 0의 함수 1 [2] LOADK 1 - 1 ; 1 [ 3 ] LOADK 2 - 2 ; 2 [ 3 ] MOVE 3 0 4 [ 3 ] LOADK 4 - 1 ; 1 ; 5 - 1 、 1 、 1 ( ROPP )

C API

Lua는 다른 응용 프로그램에 포함되도록 설계되어 있으며 이를 위해 C API제공합니다.API는 Lua core와 Lua 보조 [19]라이브러리의 두 부분으로 나뉩니다.Python의 API와 달리 Lua API의 디자인은 C 코드에서 수동 참조 관리가 필요하지 않습니다.API는 언어와 마찬가지로 미니멀리즘입니다.고급 기능은 주로 복잡한 테이블 조작을 지원하는 프리프로세서 매크로로 구성된 보조 라이브러리에 의해 제공됩니다.

Lua C API는 스택 기반입니다.Lua는 가장 단순한 C 데이터 유형(정수, 플로트 등)을 스택으로 푸시 및 팝하는 기능과 스택을 통해 테이블을 조작하는 기능을 제공합니다.Lua 스택은 기존 스택과는 다소 다릅니다.예를 들어 스택을 직접 인덱싱할 수 있습니다.음의 지수는 스택의 상단에서 오프셋을 나타냅니다.예를 들어 -1은 맨 위(가장 최근에 누른 값)이고 양의 지수는 맨 아래(가장 오래된 값)로부터의 오프셋을 나타냅니다.C와 Lua 함수 간의 데이터 마샬링도 스택을 사용하여 이루어집니다.Lua 함수를 호출하려면 인수가 스택에 푸시되고 다음으로lua_call는 실제 함수를 호출하기 위해 사용됩니다.Lua에서 직접 호출되는 C 함수를 쓸 때 인수는 스택에서 읽힙니다.

다음으로 C에서 Lua 함수를 호출하는 예를 나타냅니다.

#실패하다 <stdio.h> #실패하다 <lua.h>// Lua 메인 라이브러리(lua_*) #실패하다 <lauxlib.h>// Lua 보조 라이브러리(luaL_*)  인트 주된(무효) {     // Lua 상태 생성     lua_상태 *L = luaL_newstate();      // 문자열 로드 및 실행     한다면 (luaL_dostring(L, "함수 foo(x,y) 반환 x+y 끝")) {         lua_close(L);         돌아가다 -1;     }      // 글로벌 "foo"의 푸시 값(위에서 정의한 함수)     // 스택에 이어 정수 5와 3이 이어집니다.     lua_getglobal(L, "푸");     lua_interneger(L, 5);     lua_interneger(L, 3);     lua_call(L, 2, 1); // 인수 2개와 반환 값 1개를 사용하여 함수를 호출합니다.     인쇄물("결과: %d\n", lua_integer(L, -1)); // 스택 맨 위에 항목의 정수 값 인쇄     lua_pop(L, 1); // 스택을 원래 상태로 되돌립니다.     lua_close(L); // Lua 상태 닫기     돌아가다 0; } 

이 예를 실행하면 다음과 같이 됩니다.

$ cc - o example . c - llua $ . / example 결과: 8

C API는 또한 Lua 스택의 다양한 "의사 인덱스"에 위치한 몇 가지 특별한 테이블을 제공합니다.LUA_GLOBALSINDEX루아 5.2 이전은[20] 지구본 테이블이었고_G 네임스페이스인 Lua 내에서.레지스트리도 다음 위치에 있습니다.LUA_REGISTRYINDEX여기서 C 프로그램은 나중에 검색하기 위해 Lua 값을 저장할 수 있습니다.

Lua API를 사용하여 확장 모듈을 쓸 수 있습니다.확장 모듈은 Lua 스크립트에 네이티브 기능을 제공함으로써 인터프리터의 기능을 확장하기 위해 사용할 수 있는 공유 객체입니다.Lua 스크립트는 다음을 사용하여 확장 모듈을 로드할 수 있습니다.requireLua 자체에서 기술된 모듈 [19]또는package.loadlib를 통해 C 라이브러리를 로드하는 [21]경우require("foo")Lua가 기능을 찾을 것입니다.luaopen_foo그리고 그것은 Lua에서 호출할 수 있는 모든 C 함수와 같은 역할을 하며 일반적으로 메서드로 채워진 테이블을 반환합니다.암석이라고 불리는 모듈들의 증가하는 컬렉션CPAN, RubyGems 및 Python 달걀의 정신으로 LuaRocks라고 [22]불리는 패키지 관리 시스템을 통해 이용할 수 있습니다.사전 작성된 [23]Lua 바인딩은 다른 스크립트 언어를 포함하여 가장 일반적인 프로그래밍 언어에 대해 존재합니다.C++의 경우 템플릿 기반 접근법과 자동 바인딩 생성기가 몇 가지 있습니다.

적용들

비디오 게임 개발에서 Lua는 임베드가 용이하고 실행이 빠르며 학습 [24]곡선이 짧기 때문에 프로그래머에 의해 스크립트 언어로 널리 사용되고 있습니다.Lua를 사용하는 주목할 만한 게임으로는 Roblox,[25] Garry's Mod, Payday 2, Fantasy Star Online 2, Dota 2, Angry Birds Space,[26] Crysis [27]등이 있다.기본적으로 Lua 프로그래밍이나 스크립트를 지원하지 않는 일부 게임에는 MineCraft와 같이 mods에 의해 이 기능이 추가됩니다.또한 Lua는 Adobe Lightroom, Moho, iClone, Aerospike와 같은 비디오 게임 소프트웨어가 아닌 FreeBSDNetBSD의 특정 시스템 소프트웨어에서도 사용되며 Scribunto [28]확장을 사용하여 MediaWiki에서 템플릿 스크립팅 언어로 사용됩니다.

2003년에 GameDev.net에 의해 실시된 여론조사에 따르면 Lua가 게임 [29]프로그래밍에서 가장 인기 있는 스크립트 언어인 것으로 나타났다.2012년 1월 12일, Lua는 프로그래밍 [30]부문에서 잡지 Game Developer로부터 Front Line Award 2011 수상자로 발표되었습니다.

TeX 유형 설정 언어의 구현인 LuaTeX, 키 데이터베이스인 Redis, 텍스트 에디터인 Neovim, 웹 서버Nginx 및 네트워크 패킷 분석기인 Wireshark와 같은 많은 비게임 애플리케이션도 확장성을 위해 Lua를 사용합니다.

Scribunto 확장을 통해 Lua는 Wikipedia 및 기타 [31]Wiki를 지원하는 MediaWiki 소프트웨어에서 서버 측 스크립팅 언어로 사용할 수 있습니다.Wikidata의 데이터를 [32]기사에 통합할 수 있도록 하고 자동화된 Taxobox 시스템을 강화하는 것도 그 용도 중 하나입니다.

파생 언어

Lua로 컴파일되는 언어

  • MoonScript는 Lua로 컴파일된 CoffeeScript에서 영감을 받은 동적 공백 구분 스크립트 언어입니다.즉, 를 사용하는 대신do그리고.end(또는{그리고.})는 줄 바꿈과 들여쓰기 [33][34][35]스타일을 사용하여 코드 섹션을 구분합니다.MoonScript의 주목할 만한 용도는 비디오 게임 배급 웹사이트 Itch.io이다.
  • Haxe는 Lua 타깃 컴파일을 지원하며 Lua 5.1~5.3 및 LuaJ 지원IT 2.0 및 2.1
  • 회향, [35]루아를 표적으로 하는 리스프 방언.
  • Lua를 기반으로 하는 [36]리스프 방언 Urn.
  • 컴파일러가 Lua [37]파일을 출력하는 ML과 유사한 기능 언어인 Amulet.

사투리

  • LuaJIT
  • Roblox의 Luau, 점진적인 타이핑과 인체공학적 추가가 가능[38]Lua 5.1 언어.
  • Ravi, JIT 대응 Lua 5.3 언어, 옵션 스태틱 타이핑 기능 탑재.JIT는 유형 [39]정보에 따라 안내됩니다.
  • 샤인, LuaJ의 포크모듈 시스템 및 매크로 [40]시스템 등 다양한 확장을 갖춘 IT 부서

게다가 Lua 유저 커뮤니티에서는, 참조 C 의 [41]실장에 가세해 몇개의 전원 패치를 제공하고 있습니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ "Lua 5.4.4 now available". 26 January 2022. Retrieved 28 January 2022.
  2. ^ Ring Team (5 December 2017). "The Ring programming language and other languages". ring-lang.net.
  3. ^ a b Ierusalimschy, Roberto; de Figueiredo, Luiz Henrique; Filho, Waldemar Celes (June 1996). "Lua—An Extensible Extension Language". Software: Practice and Experience. 26 (6): 635–652. doi:10.1002/(SICI)1097-024X(199606)26:6<635::AID-SPE26>3.0.CO;2-P. Retrieved 24 October 2015.
  4. ^ a b c "About Lua". Lua.org. Retrieved 11 August 2011.
  5. ^ Yuri Takhteyev (21 April 2013). "From Brazil to Wikipedia". Foreign Affairs. Retrieved 25 April 2013.
  6. ^ a b c d Ierusalimschy, R.; Figueiredo, L. H.; Celes, W. (2007). "The evolution of Lua" (PDF). Proc. of ACM HOPL III. pp. 2–1–2–26. doi:10.1145/1238844.1238846. ISBN 978-1-59593-766-7. S2CID 475143.[데드링크]
  7. ^ "The evolution of an extension language: a history of Lua". 2001. Retrieved 18 December 2008.
  8. ^ Figueiredo, L. H.; Ierusalimschy, R.; Celes, W. (December 1996). "Lua: an Extensible Embedded Language. A few metamechanisms replace a host of features". Dr. Dobb's Journal. Vol. 21, no. 12. pp. 26–33.
  9. ^ "Programming in Lua : 1".
  10. ^ "Lua 5.1 Reference Manual". 2014. Retrieved 27 February 2014.
  11. ^ "Lua 5.1 Reference Manual". 2012. Retrieved 16 October 2012.
  12. ^ "Lua 5.1 Source Code". 2006. Retrieved 24 March 2011.
  13. ^ Roberto Ierusalimschy. Programming in Lua, 4th Edition. p. 165.
  14. ^ "Programming in Lua : 16.3". www.lua.org. Retrieved 16 September 2021.
  15. ^ "lua-users wiki: Metamethods Tutorial". lua-users.org. Retrieved 16 September 2021.
  16. ^ Ierusalimschy, R.; Figueiredo, L. H.; Celes, W. (2005). "The implementation of Lua 5.0". J. Of Universal Comp. Sci. 11 (7): 1159–1176.
  17. ^ Texas Instruments (1990). PC Scheme: Users Guide and Language Reference Manual, Trade Edition. ISBN 0-262-70040-9.
  18. ^ Kein-Hong Man (2006). "A No-Frills Introduction to Lua 5.1 VM Instructions" (PDF).
  19. ^ a b "Lua 5.2 Reference Manual". Lua.org. Retrieved 23 October 2012.
  20. ^ "Changes in the API". Lua 5.2 Reference Manual. Lua.org. Retrieved 9 May 2014.
  21. ^ "Lua 5.4 Reference Manual". www.lua.org. Retrieved 1 June 2022.
  22. ^ "LuaRocks". LuaRocks wiki. Retrieved 24 May 2009.
  23. ^ "Binding Code To Lua". Lua-users wiki. Retrieved 24 May 2009.
  24. ^ "Why is Lua considered a game language?". Archived from the original on 20 August 2013. Retrieved 22 April 2017.{{cite web}}: CS1 maint: bot: 원래 URL 상태를 알 수 없습니다(링크).
  25. ^ "Why Luau?". Luau. Retrieved 23 March 2022.
  26. ^ "TIL Angry Birds was coded in Lua - post - Imgur". Retrieved 23 March 2022.
  27. ^ "Introduction to Crysis server-side modding". Retrieved 23 March 2022.
  28. ^ "Lua Functions". wow.gamepedia.com. Retrieved 1 March 2021.
  29. ^ "Poll Results". Archived from the original on 7 December 2003. Retrieved 22 April 2017.{{cite web}}: CS1 maint: bot: 원래 URL 상태를 알 수 없습니다(링크).
  30. ^ "Front Line Award Winners Announced". Archived from the original on 15 June 2013. Retrieved 22 April 2017.{{cite web}}: CS1 maint: bot: 원래 URL 상태를 알 수 없습니다(링크).
  31. ^ "Extension:Scribunto - MediaWiki". MediaWiki.org. Retrieved 21 February 2019.
  32. ^ "Wikidata:Infobox Tutorial - Wikidata". www.wikidata.org. Retrieved 21 December 2018.
  33. ^ "Language Guide - MoonScript 0.5.0". moonscript.org. Retrieved 25 September 2020.
  34. ^ leaf (23 September 2020), leafo/moonscript, retrieved 25 September 2020
  35. ^ a b Andre Alves Garzia. "Languages that compile to Lua". AndreGarzia.com. Retrieved 25 September 2020.
  36. ^ "Urn: A Lisp implementation for Lua Urn". urn-lang.com. Retrieved 12 January 2021.
  37. ^ "Amulet ML". amulet.works. Retrieved 12 January 2021.
  38. ^ "Luau". Roblox.GitHub.io.
  39. ^ "Ravi Programming Language". GitHub.
  40. ^ Hundt, Richard (22 April 2021). "richardhundt/shine". GitHub.
  41. ^ "Lua Power Patches". lua-users.org.

추가 정보

외부 링크