스킴(Scheme)은 리스프(Lisp) 계열의 다중 패러다임 프로그래밍 언어로, 함수형 프로그래밍과 절차적 프로그래밍을 모두 지원한다. 1970년대에 매사추세츠 공과대학교(MIT) 인공지능 연구소에서 가이 루이스 스틸 주니어(Guy Lewis Steele Jr.)와 제럴드 제이 서스먼(Gerald Jay Sussman)이 개발하였으며, 당시 작성된 일련의 연구 보고서들은 '람다 논문(Lambda Papers)'으로 알려져 있다.
스킴이라는 이름은 원래 'Schemer'였으나, ITS 운영체제의 파일명 제한(최대 6자)으로 인해 현재의 이름으로 단축되었다.
주요 특징
스킴은 다른 리스프 방언과 비교할 때 단순함이 가장 큰 특징이다. 전통적인 리스프와의 가장 큰 차이점은 동적 영역 규칙(dynamic scope) 대신 정적 영역 규칙(lexical scope)을 사용한다는 점이다. 이는 리스프 계열 최초로 도입된 것이었다. 또한 반복문을 기본적으로 지원하지 않으며 재귀 함수를 통해 반복 계산을 처리한다. 대부분의 스킴 구현체는 꼬리 호출 최적화(tail-call optimization)를 수행하여 무한정의 활성 꼬리 호출을 지원한다.
스킴은 최초로 일급 계속(first-class continuation)을 지원한 프로그래밍 언어 중 하나이기도 하며, call-with-current-continuation(약칭 call/cc)을 통해 현재의 계속을 포착할 수 있다.
구문
스킴의 구문은 S식(S-expression)만으로 이루어져 있다. S식은 아톰(atom) 또는 리스트(list) 중 하나이며, 함수 호출도 (f a1 a2 ... an) 형태의 S식으로 표현된다. 이는 C 언어의 f(a1, a2, ..., an)에 해당한다. 이러한 계산 방식을 '계산 후 적용 모델'(eval-apply model)이라고 부른다.
핵심 특수 구문으로는 quote, cond, let, define, lambda 등이 있으며, lambda는 함수 값을 정의하는 가장 기본적인 구문이다.
표준화
스킴 언어는 공식 IEEE 표준과 de facto 표준인 RnRS(Revised^n Report on the Algorithmic Language Scheme)로 표준화되어 있다. 주요 버전은 다음과 같다:
- R5RS (1998년) - 널리 구현된 표준
- R6RS (2007년) - 더 확장되고 모듈화된 표준
- R7RS-small (2013년) - 가장 최근에 비준된 표준
패러다임 및 자료형
스킴은 다중 패러다임(함수형, 명령형, 메타)을 지원하며, 동적 자료형 체계(dynamic typing)를 가진다. 변수의 영역은 정적(lexical)이다. 파일 확장자는 .scm 또는 .ss를 사용한다.
영향
스킴은 이후 많은 프로그래밍 언어에 영향을 주었다. 영향을 받은 언어로는 클로저(Clojure), 커먼 리스프(Common Lisp), 하스켈(Haskell), 자바스크립트(JavaScript), 줄리아(Julia), 루아(Lua), 파이썬(Python), R, 루비(Ruby), 러스트(Rust), 스칼라(Scala) 등이 있다. 스킴 자체는 알골(ALGOL), 리스프(Lisp), MDL의 영향을 받았다.
활용
스킴은 여러 대학의 컴퓨터 과학 입문 과정에서 교재 『컴퓨터 프로그램의 구조와 해석』(SICP)과 함께 널리 사용되었다. 또한 GNU 프로젝트의 공식 스크립팅 언어인 Guile 구현체를 통해 GNU LilyPond, GnuCash 등의 응용 프로그램에 내장되어 사용된다. 오픈소스 그래픽 편집기 GIMP는 TinyScheme을 스크립팅 언어로 사용한다.
주요 구현체
스킴은 단순한 설계 덕분에 수많은 구현체가 존재한다. 대표적인 구현체로는 MIT/GNU Scheme, Chez Scheme, Chicken Scheme, Gambit, Bigloo, Guile, Kawa, Racket(원래 PLT Scheme) 등이 있다.