맨위로가기

린든 스크립트 언어

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

린든 스크립트 언어(LSL)는 가상 세계 Second Life에서 사용되는 스크립트 언어이다. 변수, 함수 정의, 하나 이상의 상태로 구성되며, 각 상태는 발생하는 사건에 대한 반응을 정의한다. 정수, 부동 소수점 실수, 문자열, UUID, 벡터, 회전 등의 기본 데이터 형식을 지원하며, 리스트 타입도 제공한다. LSL 스크립트는 Second Life 내 개체에 배치되어 실행되며, 시스템은 이벤트를 전송하여 스크립트가 상태를 변경하거나 다른 개체와 통신하게 한다. 개체는 여러 스크립트를 포함할 수 있으며, 각 스크립트는 바이트 코드로 컴파일되어 린든 랩 서버의 가상 머신에서 실행된다.

더 읽어볼만한 페이지

  • 스크립트 언어 - Tcl
    Tcl은 존 오스터하우트가 개발한 명령어 기반의 프로그래밍 언어로, Tk 툴킷과 결합하여 GUI 스크립팅 환경으로 발전했으며, 다양한 운영체제에서 사용 가능하고 C, C++, Java 등 다른 언어와의 인터페이스를 지원한다.
  • 스크립트 언어 - PHP
    PHP는 라스무스 러도프가 개발한 범용 스크립팅 언어로, 웹 개발에 널리 사용되며 LAMP 아키텍처의 핵심 요소이다.
린든 스크립트 언어
기본 정보
언어 유형명령형, 객체 지향, 동시성
설계자린든 랩
첫 출시일2003년
최신 버전'3.7.0 (2014년 7월 29일 출시)'
운영 체제크로스 플랫폼
추가 정보
파일 확장자.lsl
웹사이트LSL 포털

2. LSL 구조

LSL 스크립트는 기본적으로 변수, 함수 정의, 그리고 하나 이상의 상태(상태)로 구성된다. 각 상태는 해당 상태에 있을 때 발생하는 이벤트에 어떻게 반응할지를 기술하는 방식으로 정의된다.

2. 1. 지원 데이터 형식

LSL의 기본 데이터 형식은 정수형, 부동소수점 실수형, 문자열, 키(UUID), 벡터(3차원 위치 및 RGB 색상 표현), 로테이션(쿼터니언)이 있다. 또한, 배열이나 구조체에 해당하는 것으로 기본 데이터 타입을 요소로 하는 리스트 타입이 있다. 내장 함수는 2015년 11월 시점에서 430개가 있으며, 사용자는 필요에 따라 사용자 정의 함수를 정의할 수도 있다.

2. 2. 함수

린든 스크립트 언어(LSL) 스크립트는 변수, 함수 정의, 그리고 하나 이상의 상태(State)로 구성된다. LSL에는 다양한 기능을 수행하는 내장 함수가 미리 정의되어 있으며, 2015년 11월 기준으로 약 430개의 내장 함수가 제공된다. 사용자는 필요에 따라 직접 함수를 정의하여 사용할 수도 있다.

3. 실행 환경

(내용 없음)

3. 1. 스크립트 실행

스크립트는 세컨드 라이프의 가상 세계에 배치된 의자나 벽과 같은 오브젝트 안에 포함되어 실행된다. 시스템은 스크립트에 타이머, 이동, 아바타와의 채팅, 전자 메일, 다른 오브젝트와의 충돌 등 다양한 이벤트를 전송한다. 이러한 이벤트를 받으면 스크립트는 상태를 바꾸거나 다른 오브젝트 또는 아바타와 상호작용한다.

스크립트는 해당 오브젝트에 추가되는 즉시 실행을 시작하며, 오브젝트가 가상 세계 안에 존재하는 한 소유자가 로그아웃한 상태에서도 계속 실행된다. 만약 소유자가 오브젝트를 인벤토리로 옮겼다가 다시 가상 세계에 배치하더라도 스크립트의 상태는 그대로 유지된다. 파일이나 데이터베이스 같은 영구적인 데이터 저장 기능은 기본적으로 제공되지 않지만, HTTP 요청을 이용해 세컨드 라이프 외부 서버에 데이터를 저장하는 것은 가능하다.

하나의 오브젝트에는 여러 개의 스크립트를 포함시켜 동시에 실행할 수 있다. 각 스크립트가 사용할 수 있는 메모리 공간은 64KiB 이하로 제한된다. 스크립트는 바이트코드 형식으로 컴파일되어, 린든 랩(Linden Lab)의 서버에서 Mono 기반의 가상 머신 위에서 실행된다.

시스템 자원에 과도한 부하가 걸리는 것을 막기 위해, 일부 내장 함수는 실행 시 부하 정도에 따라 0.2초에서 20초 사이의 지연 시간을 갖도록 설계되었다. 이 때문에 부하가 큰 함수를 연속해서 실행하는 것은 제한된다. 또한, 실행 시간이 오래 걸리는 작업은 모두 이벤트 핸들러를 이용한 비동기 방식으로 처리된다. 이는 하나의 가상 세계 시뮬레이터 안에서 수많은 스크립트가 동시에 작동하기 때문에 필요한 조치이다.

3. 2. 제약 사항

단일 스크립트에서 사용할 수 있는 메모리 영역은 64KiB 이하로 제한된다. 각 스크립트는 바이트코드 실행 형식으로 컴파일되어, 린든 랩 서버의 Mono를 이용한 가상 머신에서 실행된다.

파일이나 데이터베이스와 같은 영구적인 데이터 저장 장치는 제공되지 않는다. 데이터를 영구적으로 보존해야 할 경우, HTTP 요청 통신 등을 이용하여 Second Life 외부의 시스템을 활용해야 한다.

시스템 자원에 과도한 부담을 주는 것을 방지하기 위해 몇 가지 실행 상의 제약이 존재한다. 일부 부하가 큰 내장 함수는 실행 시 그 부하에 따라 0.2초에서 20초 사이의 지연(delay) 시간이 설정되어 있으며, 이러한 함수의 연속적인 실행은 제한된다. 또한, 실행 시간이 오래 걸리는 처리는 반드시 이벤트 핸들러를 이용한 비동기 방식으로 구현해야 한다. 이는 하나의 가상 세계 시뮬레이터 안에서 수천 개에서 수십만 개의 스크립트가 동시에 실행되기 때문에, 개별 스크립트가 시스템 자원을 과도하게 점유하는 것을 막기 위한 조치이다.

4. LSL 스크립트 예제

LSL 스크립트의 기본적인 구조와 이벤트 처리 방식을 이해하는 데 도움이 되는 대표적인 예제로 Hello World 예제가 있다. 이 예제는 오브젝트가 특정 이벤트(스크립트 시작, 터치 등)에 반응하여 간단한 메시지를 출력하는 기본적인 방법을 보여준다.

또한, 키보드 입력이나 파일 읽기처럼 시간이 걸릴 수 있는 작업은 비동기 처리 방식으로 구현된다. 비동기 처리 예제는 사용자가 지정한 텍스트 파일(세컨드 라이프 내의 '노트 카드') 내용을 비동기적으로 읽어와 출력하는 과정을 설명한다.

4. 1. Hello World

다음은 일종의 'Hello world 프로그램' 예시이다. `default`라는 상태 안에 `state_entry`와 `touch_start`라는 두 가지 이벤트가 정의되어 있다. 각 이벤트가 발생하면, 오브젝트는 `llSay` 함수를 통해 각각 "Hello, Avatar!" 또는 "Touched."라는 메시지를 채팅 창에 표시한다.



default

{

state_entry()

{

llSay(0, "Hello, Avatar!");

}

touch_start(integer total_number)

{

llSay(0, "Touched.");

}

}


4. 2. 비동기 처리 샘플

키보드 입력이나 파일 읽기와 같은 작업은 비동기 처리 방식으로 수행된다. 다음은 사용자가 지정한 텍스트 파일(세컨드 라이프 내의 '노트 카드')의 내용을 읽어 표시하는 예제 코드이다.



integer lsn; // Listen 핸들러 ID 저장 변수

string filename; // 읽을 노트 카드 이름 저장 변수

integer line; // 현재 읽고 있는 줄 번호 저장 변수

key read; // llGetNotecardLine 함수의 요청 ID 저장 변수

default // 기본 상태

{

// 오브젝트를 터치했을 때 실행되는 이벤트 핸들러

touch_start(integer total_number)

{

// 스크립트 소유자에게 노트 카드 이름을 입력하라는 메시지를 채팅으로 보냄

llOwnerSay("Enter note name:");

// 채널 0번에서 소유자의 채팅 입력만 감지하도록 Listen 설정

// llGetOwner()는 스크립트 소유자의 키(UUID)를 반환

lsn = llListen(0, "", llGetOwner(), "");

}

// Listen 설정에 의해 채팅 입력이 감지되었을 때 실행되는 이벤트 핸들러

listen(integer channel, string name, key id, string message)

{

// 입력된 채널이 0번이고, 입력한 사람(id)이 스크립트 소유자인지 확인

if(channel == 0 && id == llGetOwner()) {

// 더 이상 채팅 입력을 감지할 필요가 없으므로 Listen 설정을 제거

llListenRemove(lsn);

// 입력받은 메시지(채팅 내용)를 파일 이름으로 사용

filename = message;

// 파일 읽기를 수행하는 'read_file' 상태로 전환

state read_file;

}

}

}

// 파일 읽기를 처리하는 상태

state read_file

{

// 'read_file' 상태로 처음 진입했을 때 실행되는 이벤트 핸들러

state_entry()

{

// 인벤토리에서 입력받은 파일 이름(filename)에 해당하는 노트 카드의 키(UUID)를 가져옴

// 해당 이름의 노트 카드가 없으면 NULL_KEY를 반환

if(llGetInventoryKey(filename) == NULL_KEY) {

// 노트 카드가 없다는 오류 메시지를 소유자에게 보냄

llOwnerSay("ERROR: note is missing.");

// 기본 상태(default)로 돌아감

state default;

}

// 읽을 줄 번호를 0으로 초기화 (첫 번째 줄부터 읽기 시작)

line = 0;

// 노트 카드의 특정 줄(line) 내용을 비동기적으로 요청

// 요청 ID를 read 변수에 저장하여 나중에 dataserver 이벤트에서 어떤 요청에 대한 응답인지 구분

read = llGetNotecardLine(filename, line);

}

// llGetNotecardLine과 같은 비동기 함수가 데이터를 반환했을 때 실행되는 이벤트 핸들러

dataserver(key requested, string data)

{

// 현재 처리 중인 노트 카드 읽기 요청(read)과 응답의 요청 ID(requested)가 일치하는지 확인

if(requested == read) {

// 반환된 데이터(data)가 파일의 끝(End Of File)을 나타내는 "EOF" 문자열인지 확인

if(data == EOF) {

// 파일 읽기가 끝났으므로 파일 이름 변수를 초기화

filename = "";

// 기본 상태(default)로 돌아감

state default;

}

// 읽어온 한 줄의 내용(data)을 소유자에게 채팅으로 보냄

llOwnerSay(data);

// 다음 줄을 읽기 위해 줄 번호를 1 증가시킴

line++;

// 다음 줄의 내용을 비동기적으로 요청하고 새로운 요청 ID를 read 변수에 저장

read = llGetNotecardLine(filename, line);

}

}

}



이 스크립트는 오브젝트를 터치하면 소유자에게 노트 카드 이름을 입력하도록 요청한다. 소유자가 채팅으로 파일 이름을 입력하면, 스크립트는 해당 이름의 노트 카드를 찾아 한 줄씩 읽어 소유자에게 다시 채팅으로 보여준다. 파일의 끝(EOF)에 도달하면 작동을 멈추고 다시 터치를 기다리는 기본 상태로 돌아간다. `llGetNotecardLine` 함수는 비동기적으로 작동하며, 데이터가 준비되면 `dataserver` 이벤트를 통해 결과를 전달한다.


본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com