GaGe

Lua_Study(8장) 본문

Study/Lua

Lua_Study(8장)

Sorrel 2022. 7. 12. 12:20

미리 컴파일 된 코드

루아는 실행하기 전에 코드를 미리 컴파일한다. 그래서 루아를 컴파일된 코드 형태로 배포할 수 있다.

 

컴파일 된 코드 형태로 배포하면 소스 코드의 잘못 수정하는 것을 막을 수 있다. 하지만 악의적으로 변형된 바이너리 코드는 루아 인터프리터나 프로그램까지 죽여버릴 수 있다.

load 함수에 이런 일을 처리하기 위한 옵션이 있다.

 

load 함수에는 필수가 아닌 인자 3개가 있는데, 세 번째 인자가 어떤 종류의 청크만 읽을 수 있게 할 것인지 제어하는 역할을 한다. 세번 째 인자에 "t"를 입력하면 텍스트로 된 보통의 소스 코드 형태의 청크만 읽어올 수 있다. "b"를 입력하면 바이너리 형태의 청크만, "bt"를 입력하면 두 형식 모두 읽을 수 있다.

 

C언어로 작성한 코드

C언어로 구현할 수 없는 부분을 루아에서 지원하고 있지 않지만, 동적 링크만은 예외적으로 지원한다. 루아는 플랫폼을 위한 동적 링크 기능을 따로 구현하고 있다. 루아 명령창에서 해당 코드를 실행하여 파일이 존재하지 않는다는 메세지가 나오면 현재 플랫폼을 위한 동적 링크 기능을 배포판에서 지원하고 있는 것이다.

 

오류처리

루아는 언제든 오류가 발생하면 실행하던 청크를 끝내고 호출한 프로그램으로 복귀하도록 되어 있다.

 

error 함수를 사용해서 직접 오류 메세지를 띄울 수도 있다.

print "enter a number:"
n = io.read("*n")
if not n then error("invalid input") end

assert 함수를 사용해서 다르게 표현할 수 있다.

print "enter a number:"
n = assert(io.read("*n"), "invalid input")

* assert 함수는 첫 번째 인자가 참이면 인자를 그대로 반환한다. 거짓이면 오류를 발생시킨다. 이 때 두 번째 인자가 있다면 오류 메시지로 출력한다.

 

 

pcall 함수

대부분 애플리케이션에서 오류를 적절히 처리하기 때문에 굳이 오류를 처리해 주는 것이 필요하지 않다.

하지만 루아로 오류를 철히애햐 하는 경우에는 루아 코드를 꼭 pcall 함수로 감싸서 사용해야 한다.

local ok, msg = pcall(function()
    <임의의 코드>
    if unexpected_condition then error() end
    <임의의 코드>
    print(a[i])
    <임의의 코드>
end)


if ok then
    <정상 처리 코드>   --> pcall 안에서 오류가 없었다면 실행
else
    < 오류 처리 코드>  --> pcall 안에서 오류가 있었다면 실행
end

오류가 없었다면 ok에 true와 호출한 함수에서 반환한 값을 반환하고, 

오류가 있었다면 ok에 false와 오류 메시지를 반환한다.

'Study > Lua' 카테고리의 다른 글

Lua_Study(9장) 코루틴  (0) 2022.07.14
Lua_Study(dofile vs loadfile vs load)  (0) 2022.07.12
Lua_Study(pairs와 ipairs의 차이점)  (0) 2022.07.12
Lua_Study(6장)  (0) 2022.07.11
Lua_Study(5장)  (0) 2022.07.11
Comments