{{위키데이터 속성 추적}}
{{프로그래밍 언어 정보
|이름 = 스퀴럴
|패러다임 = [[스크립팅 언어|스크립트]], [[명령형 프로그래밍|명령형]], [[절차적 프로그래밍|절차적]], [[객체 지향 프로그래밍|객체 지향]]
|연도 = 2003년
|설계자 = Alberto Demichelis
|형 체계 = 
|구현체 = 
|방언 = 
|영향을 받은 언어 = [[C (프로그래밍 언어)|C]], [[C++]], [[루아 (프로그래밍 언어)|루아]], [[파이썬]]
|영향을 준 언어 = [[다오]], [[MiniD]]
|라이선스 = [[zlib/libpng 사용 허가서]]
|웹사이트 = http://www.squirrel-lang.org/
}}
'''스퀴럴'''({{lang|en|Squirrel}}) 프로그래밍 언어는 [[스크립팅 언어|스크립트]] 언어로 [[명령형 프로그래밍|명령형]], [[절차적 프로그래밍|절차적]], [[객체 지향 프로그래밍|객체 지향적]] 특징을 지닌다. 메모리 사용량이 적고 실시간 처리가 우수하여 주로 게임 내 탑재 언어로 쓰이고 있다.

[[2003년]]부터 개발하기 시작했고 [[zlib/libpng 사용 허가서|zlib/libpng 라이선스]]를 가지고 있다. 개발 및 유지보수는 Alberto Demichelis가 맡고 있다.

== 특징 ==
[[C (프로그래밍 언어)|C 언어]]에 탑재(host)하여 동작하는 것을 목적으로 설계되었으며 빠른 실행 속도 및 다양한 플랫폼으로의 손쉬운 이식, 편리성이 특징이다. 또한 스크립트 [[라이브러리]]로 C 언어를 이용할 수 있다.

제작 동기는 처음에 [[루아 (프로그래밍 언어)|루아]]의 클론에서 시작했으며 루아의 이질적인 문법과 기능의 제한을 확장하기 위해 스퀴럴이 제작되었다.

루아와 비교했을 때 다른 점을 들면 다음과 같다.
* C/C++의 형태를 가지고 있고
* [[정수]]와 [[부동소수점]]([[실수]]) 양쪽 모두 가지고 있으며
* 배열의 인덱스는 0부터 시작
* 테이블과 배열이 서로 다른 구조를 가지고
* 클래스를 가지며 클래스는 상속 가능 하다.

[[메모리 관리]] 방식은 기본적으로 [[참조 횟수 계산 방식]](reference counting)을 사용하며 [[쓰레기 수집 (컴퓨터 과학)|가비지 컬렉팅]](garbage collection)도 사용한다.

== 기능 ==
* 유동적인(dynamic) [[자료형]]
* [[대리자 (컴퓨터 과학)|대리자]]
* [[클래스]] & 상속
* 우선 순위 함수
* [[제네레이터 (컴퓨터 과학)|제네레이터]]
* 협동 스레드 ([[코루틴]])
* 재귀 호출 최적화
* [[예외 처리]] (try, catch, throw)
* 자동 메모리 관리 ([[참조 횟수 계산 방식]], [[쓰레기 수집 (컴퓨터 과학)|가비지 컬렉팅]])
* 약한 참조 횐수 계산
* [[컴파일러]] 및 [[가상 머신]]을 합쳐 6k 정도의 [[C++]] 코드로 구성
* 옵션으로 16비트 문자 코드(UTF-16 [[유니코드]] 대응) 사용 가능

== 문법 ==
스퀴럴은 C/C++와 유사한 문법을 가진다.

스퀴럴로 구현한 팩토리얼
<pre>
function factorial(x)
{      
  if (x == 0) {                      
    return 1;                   
  }
  else {
    return x * factorial(x-1);
  }
}
</pre>

난수 제조기 (코루틴)
<pre>
function gen_random(max) { 
  local last=42
  local IM = 139968;
  local IA = 3877;
  local IC = 29573;
  for(;;) {  //loops forever
    yield (max * (last = (last * IA + IC) % IM) / IM); 
  }
}

local randtor = gen_random(100);

for(local i = 0; i < 10; i += 1)
   print(">"+resume randtor+"\n");
</pre>

클래스와 상속
<pre>
class BaseVector {
  constructor(...)
  {
    if(vargc >= 3) {
      x = vargv[0];
      y = vargv[1];
      z = vargv[2];
    }
  }
  
  
  x = 0;
  y = 0;
  z = 0;
}

class Vector3 extends BaseVector {
  function _add(other)
  {
    if(other instanceof this.getclass())
      return ::Vector3(x+other.x,y+other.y,z+other.z);
    else
      throw "wrong parameter";
  }
  function Print()
  {
    ::print(x+","+y+","+z+"\n");
  }
}

local v0 = Vector3(1,2,3)
local v1 = Vector3(11,12,13)
local v2 = v0 + v1;
v2.Print();
</pre>

== 사용 소프트웨어 ==
스퀴럴은 다음과 같은 소프트웨어가 사용하고 있다.
* 작은 임금님과 약속의 나라 파이널 판타지 크리스탈 크로니클 ([[Wii 웨어]])
* Portal2
* Left4Dead2
* GTA Vicecity Multiplayer
* GTAIV's IV-MP
* Mafia II's M2-Multiplayer
* Alien Swarm
* Counter Strike: Global Offensive
* Shadow Warrior
*동방빙의화

== 같이 보기 ==
* [[루아 (프로그래밍 언어)]]
* [[파이썬]]
* [[루비 (프로그래밍 언어)]]

== 외부 링크 ==
* [http://www.squirrel-lang.org/ 스퀴럴 웹사이트]
* [http://wiki.squirrel-lang.org/ 스퀴럴 위키] {{웨이백|url=http://wiki.squirrel-lang.org/ |date=20080820082523 }}
* [https://web.archive.org/web/20081022120727/http://www.mirthkit.com/ 오픈소스 게임 아카데미]

[[분류:스크립트 언어]]
[[분류:2003년 개발된 프로그래밍 언어]]
[[분류:C로 작성된 자유 소프트웨어]]
[[분류:크로스 플랫폼 자유 소프트웨어]]
[[분류:자유 라이브러리]]