LSL Errors/ko

From Second Life Wiki
Jump to navigation Jump to search

Run-time error messages

스크립트가 실행중 정지될때에 아래과 같은 메세지와 함께 "스크립트 Run-Time 오류"를 당신에게 보낼 지도 모릅니다.

Script run-time error: Heap Error

무리한 스크립트를 구현하지 말아주세요. 예를 들어, 결과를 돌려주지 않는 루틴으로 리스트형을 돌려주지 마세요. 또한, 스크립트로 무한 루핑을 돌리게 만드는 경우도 있기때문에 무리할 경우 "힙 에러"가 발생 될 수 있습니다.

Script run-time error: Lists may not contain lists

리스트안에 리스트를 또 넣을 수 없습니다.

Script run-time error: Math Error

수식 에러입니다. 예를 들어 Float형의 수를 0으로 나누려고 하거나 혹은 integer형의 수를 0으로 나누려고 할때 발생됩니다.

Script run-time error: Stack-Heap Collision

스택 영역이 아르바이트 코드 영역이나 heap 영역에 충돌했다.

각각의 스크립트는, 16킬로바이트로 분할된 메모리내에서 실행됩니다.그 메모리는 아르바이트 코드 영역, 스택 영역, heap 영역에 분할되고 있습니다.

당신이 너무 긴 스크립트를 써서 컴파일 하면, 너무 큰 아르바이트 코드가 생성되어 충돌이 발생합니다. 스크립트를 컴파일 할 수 있어 컴파일에 성공했다고 해도, 스크립트를 포함한 오브젝트를 rez 하려고 하면, 스크립트는 실행중이나 혹은 바로 크래쉬 될 수 있습니다.

참조 페이지 : llGetFreeMemory.

Run-time error demo scripts

런타임 에러를 경험하고 싶으시다면 아래의 LSL 소스를 컴파일 하여 실행하여 주시기 바랍니다.

default
{
    state_entry()
    {
        llOwnerSay((string) [llOwnerSay("bye")]); // Script run-time error: Heap Error
    }
}
default
{
    state_entry()
    {
        list once = [];
        list twice = [once, once]; // Script run-time error: Lists may not contain lists
    }
}
default
{
    state_entry()
    {
        float one = 1.0;
        float zero = 0.0;
        float quotient = one / zero; // Script run-time error: Math Error
        llOwnerSay((string) quotient);
    }
}
default
{
    state_entry()
    {
        list entries = [0];
        while (TRUE)
        {
            entries += entries; // Script run-time error: Stack-Heap Collision
            llOwnerSay((string) llGetListLength(entries));
        }
    }
}

Compile-time error messages

SL의 GUI는 당신이 완벽하다고 생각하는 몇몇개의 코드들을 거절 할 수 있으며, 여러개의 설명과 함께 에러를 출력할 수도 있습니다.

ERROR : Type mismatch

vector형이나 rotation형에 값을 지정하려면 .x .y .z .s 라고 하는 이름의 요소를 사용하지 않으면 안됩니다. 한 번에 list로 지정할 수 없습니다.예를 들면:

default
{
    state_entry()
    {
        vector vec = (vector) [1, 2, 3]; // 에러 : 타입이 틀립니다.
        llOwnerSay((string) vec);
    }
}

ERROR : Byte code assembly failed -- out of memory

스크립트는 메모리를 사용하기 적합하게 사용하셔야 합니다. 예를 들어 너무 많은 else-if문을 넣어서 컴파일 할 경우, 컴파일러는 스크립트에 대하여 무리하게 커지게 되면 리포트를 하게 됩니다. 따라서, 항상 스크립트는 알맞게 사용하여 주시기 바랍니다.

demoElseIfCompileError(integer count)
{
    if (count == 0)
    {
        ;
    }
    else if (count == 1)
    {
        ;
    }
    else if (count == 2)
    {
        ;
    }
    ...
    ... // ERROR : Byte code assembly failed -- out of memory
    ... // or ERROR : Syntax error
    ...
    else if (count == ...)
    {
        ;
    }
}

스크립트의 크기는 OS의 환경에 따라 다를 수 있습니다. 그 예로, the 2007-08 Second Life Windows 클라이언트는 22개의 else-if를 받아들여 23개의 else-if을 실행할 때에 에러를 출력했지만 Mac OS X는 692개의 else-if를 받아들여 693개의 else-if를 실행할 떄에 에러를 출력하였습니다.

OS에 의하여 변화되는 컴파일러의 크기는 복사에 관련된 제반 사항과 동일 할 수 있습니다.

소스가 알맞게 구성된 경우 누구라도 컴파일러로 컴파일된 스크립트를 실행할 수 있습니다. 그러나 제약이 많은 컴파일러 밖에 가지지 않은 유져는 해당 소스를 아무리 변경한다 해도 저장 할 수가 없답니다.

참조 llGetFreeMemory, llMessageLinked.

ERROR : Syntax error

여러분들은 스크립트나 스크립트 안에 출력되는 문장들을 컴파일러가 이해 할 수 있도록 작성하여야 합니다. 그리고 알맞고 작은 크기로 쓰지 않으면 않됩니다. 스크립트의 출력되는 문장에 대하여 잘못 작성 하셨을 경우, 컴파일러는 "Out of Memory"나 혹은 "Byte code assembly failed"와 같은 에러가 아닌 "Syntax Error(구문 에러)"라고 출력할 수도 있습니다.

2007년 8월의 SecondLife 윈도우 버젼 클라이언트는 else-if를 사용하게 될 경우 Syntax error를 출력하였습니다. 또한 22개 이상의 else-if문을 사용하게 되었을 경우 어떤 클라이언트는 23개까지, 또 어떤 클라이언트는 19개까지만 받아들이고 그 이상 사용시 Syntax에러를 출력하게 된 적도 있습니다.

한개의 컴파일러로 LSL을 배우고 있는 프로그래머는 컴파일러의 제한이 합리적이라고 느낄수도 있습니다. 예를 들어 Mac OS X에서는 500개 까지의 else-if를 사용할 수 있습니다. 하지만 그 외의 컴파일러를 사용하는 프로그래머는 사용 할 수 없으며, 윈도우에서는 약 1타스 정도의 else-if만을 늘어놓는다고 가정할 수 있습니다.