mir.pe (일반/밝은 화면)
최근 수정 시각 : 2023-05-15 04:33:33

Scheme



파일:나무위키+유도.png  
은(는) 여기로 연결됩니다.
대수기하학의 스킴에 대한 내용은 스킴(대수기하학) 문서
번 문단을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
참고하십시오.
프로그래밍 사이트 선정 프로그래밍 언어 순위 목록
{{{#!wiki style="margin: 0 -10px -5px; word-break: keep-all"
{{{#!wiki style="display: inline-block; margin: 0 0 -5px; min-width: 25%"
{{{#!folding ⠀[ IEEE Spectrum 2023 ]⠀
{{{#!wiki style="margin:-6px -1px -10px"
<rowcolor=#fff> 스펙트럼 부문 상위 10개 프로그래밍 언어 직업 부문 상위 10개 프로그래밍 언어
1 Python 1 SQL
2 Java 2 Python
3 C++ 3 Java
4 C 4 JavaScript
5 JavaScript 5 C++
6 C# 6 C#
7 SQL 7 C
8 Go 8 HTML
9 TypeScript 9 Shell
10 HTML 10 SAS
}}}}}}}}}
⠀[ Stack Overflow 2023 ]⠀
⠀[ TIOBE 2024 ]⠀
||<tablewidth=100%><width=2000><-4><bgcolor=deepskyblue><tablebgcolor=#fff,#222> 2024년 2월 기준 검색어 점유율 상위 20개 프로그래밍 언어 ||
1 Python 11 Fortran
2 C 12 Delphi / Object Pascal
3 C++ 13 MATLAB
4 Java 14 Assembly language
5 C# 15 Scratch
6 JavaScript 16 Swift
7 SQL 17 Kotlin
8 Go 18 Rust
9 Visual Basic 19 COBOL
10 PHP 20 Ruby
{{{#!wiki style="margin:0 -10px -5px; min-height: 26px"
{{{#!folding [ 21위 ~ 50위 펼치기 · 접기 ]
{{{#!wiki style="margin: -6px -1px -10px"
21 R 36 Transact-SQL
22 SAS 37 VBScript
23 Classic Visual Basic 38 Haskell
24 Prolog 39 TypeScript
25 Ada 40 Logo
26 Perl 41 Bash
27 (Visual) FoxPro 42 Scheme
28 Dart 43 Solidity
29 D 44 ABAP
30 F# 45 ML
31 Scala 46 X++
32 Objective-C 47 PL/SQL
33 Lua 48 GAMS
34 Julia 49 PowerShell
35 LISP 50 RPG
}}}}}}}}} ||
⠀[ PYPL 2024 ]⠀
}}} ||
프로그래밍 언어 목록 · 분류 · 문법


(display "Hello, world!") (newline)


1. 개요2. 역사3. 특징4. 종류5. 기타

1. 개요

Lisp 계열의 언어 중 코먼 리스프(Common Lisp)와 함께 가장 유명하고 대표적인 프로그래밍 언어이다.

2. 역사

그 시초는 칼 휴잇(Carl Hewitt)의 액터(Actor) 모델을 이해하기 위한 시도에서 비롯되었다. 제럴드 서스먼(Gerald Sussman)과 가이 스틸 주니어(Guy Steele Jr)가 Maclisp에 기반한 작은 리스프 인터프리터를 만들면서 액터 모델을 구현하고 메시징 기능을 추가한 것이 바로 Scheme의 시초이다. 1975년 당시 이름은 Schemer였는데, 이는 Plannar, Conniver등 리스프에서 파생된 다른 언어의 이름이 ~er로 끝나서 이를 따라 명명했다고 한다. 이후 개발자들이 파일이름과 확장자가 각각 6글자로 제한되는 ITS 운영체제를 사용하면서 현재의 이름인 Scheme으로 이름이 변경되었다.

당시에는 프로그램에서 함수를 불러올 때 호출하고 끝나서 돌아오는 과정에서 시간이 오래 걸려서 많은 수의 함수를 쓰는 것은 비효율적이라는 것이 상식이었다.[1] 서스먼과 스틸이 하던 연구는 이 "상식"을 뒤집는 함수 호출 구조에 대한 것으로, 함수를 호출하고 값을 반환하는 대신 주어진 환경에서 메모리 주소를 점프하며 함수만 갈아끼우는 획기적인 방식을 구현하기 위한 프로토타입 언어였다. 둘은 처음에 (이후에 나온) 커먼 리스프와 같은 규모의 언어를 생각하고 있었지만 정작 나온 것은 극도의 미니멀리즘에 기반한 언어였다.

여기서 스킴의 행보가 여러 방향으로 찢어지게 되는데, 대표적으로 극단적으로 간소하면서도 이해하기 쉬운 언어를 교육용으로 사용하려는 방향은 서스먼의 명저 SICP(Structure and Interpretation of Computer Programs)에서 드러난다. 이 책은 MIT 컴퓨터 과학 전공의 동명의 입문 과목 교과서로 유명해졌고, 한동안 미국 전역에서 이를 따라 SICP와 스킴으로 입문을 가르치는 학교가 꽤 있었다.[2] 반면에 한편에서는 이 우아한 언어를 실제로 업무에 사용해보려는 노력으로, R5RS 표준의 제정 이후 SRFI(Scheme Request for Implementation, 스킴 구현 요청)을 통해 프로그래머들이 필요한 기능들을 요청하고 직접 구현하는 움직임이 활발해졌다. 간단한 구조 때문에 성능을 생각 않는다면 취미삼아 만들어볼만한 사이즈의 언어였기에 각종 컴파일러와 인터프리터가 우후죽순처럼 생겨났고, 각각의 부분은 호환되는 부분이 많지만 세세한 데에서 호환되지 않는 경우가 꽤 많았다.

이러한 분열의 와중에서 스킴에 가장 큰 타격을 준 것은 R6RS 표준의 제정이었다. 원래는 양쪽의 입맛을 모두 맞추기 위해 각종 기능을 넣은 새 표준이었지만, R5RS와 호환되지 않는데다 R5RS 표준에 비해 몇 배나 큰 기본 베이스에 교육자들은 사용을 거부했고, 기존에 사실상의 표준으로 사용되던 SRFI 라이브러리와 전혀 호환되지 않는 기능에 프로그래머들도 사용을 거부했다. 이 때문에 교육용 R5RS, 업무용 R5RS+SRFI, 업무용 R6RS로 스킴 커뮤니티는 완전히 분열해버렸다.

결국 스킴 제정 위원회는 R7RS 표준을 교육용 기본 언어와 이와 호환되는 업무용 방대한 언어로 나누어 두 표준을 따로 제정하기로 했다. 얼마 전에 새로 제정된 R7RS-small 표준은 R6RS를 완전히 흑역사로 묻어버리고 R5RS기반으로 만들어졌으며, 이후에 제정될 R7RS-large는 커먼 리스프보다 큰 규모의 언어를 목표로 삼는다는데... 글쎄, 위원회 언어는 듀크 누켐 포에버보다 나오기 힘들다. 어차피 SRFI 상당수를 공식으로 지정하는 것이 중점이 될 것이라 하니 SRFI가 잘 지원되는 스킴을 찾아보자.

3. 특징

다른 리스프 계열[3]보다 함수형 프로그래밍을 적극 장려하는 언어로, 언어 표준에 순수 함수형에서 벗어나는 함수 이름 뒤에는 꼭 "!"를 붙이는 것을 관례로 명시할 정도이다.[4] 그러나 그보다 더 핵심적인 특징은 최소한의 기본 명령만 기계어로 정의가 되어있고, 언어 표준에 명시된 다른 명령들은 기본 명령에 속한 람다(lambda)함수를 이용해 정의가 되어있다는 것이다. 이 때문에 스킴은 다른 프로그래밍 언어에 비해 매우 사이즈가 작으면서도, 기본만 사용해 필요에 따라 무엇이든 정의해 사용할 수 있는 독특한 디자인을 가지고 있다. 커먼 리스프를 109가지 기능이 붙어있는 다목적 공구에 비유하자면, 스킴은 딱 최소한의 10개 기능만 붙어있는 맥가이버 칼에 비유할 수 있다. 같은 뿌리에서 나온 다른 사이즈의 언어라는 점에서 C++와 C의 관계와도 비슷할지도 모르겠지만, C++의 기능을 C에서 구현하려면 오만가지 삽질을 해야하는데 비해 스킴은 커먼 리스프의 기능을 구현 가능한, Greenspun's Tenth Rule[5]에서 가장 안전한 언어라 할 수 있다.

위에 말했듯이 스킴은 워낙 표준에 따라 다양한 구현이 있고, 그마저도 표준은 그저 대충 거의 다 지키면 되는 것. 수준의 인식이 있어서 각각의 구현이 조금씩 다른 언어나 방언이라고 할 수 있다. 관계가 조금 먼 Racket을 제외하면, 스킴을 스킴으로 묶는 특성은 다음과 같다.

4. 종류

워낙 종류가 많아서 고르기 힘들지만 가장 특징적이고 메이저한 스킴은 다음과 같다.

5. 기타

브랜든 아이크 넷스케이프 시절 브라우저 내에 동적 웹페이지 구현하기 위해 스크립트 언어로 쓰려 한 게 바로 이 언어였다. 그러나 넷스케이프에서 일반인들도 웹페이지 개발 쉽게 할 수 있도록 하자고 하며 C, Java와 비슷한 문법의 언어로 만들어야 한다고 요구해서꼬장부려서 어쩔 수 없이 Scheme을 쓰려는 걸 포기하고 JavaScript라는 새로운 언어를 만들게 된다. 만약 본래 계획대로 스킴을 썼다면 웹은 어떻게 발전했을지, 웹프로그래밍 입문자가 많았을지, 현재 자바스크립트가 안고 있는 여러 문제점들은 생기지 않았는지, 그에 따른 제이쿼리 리액트, TypeScript 같은 것들이 생겨날 필요가 없었는지 모를 일이다.
[1] 그 때문에 GCC같은 C 컴파일러는 작은 함수를 여러개 호출하는 부분을 파악해 하나의 큰 함수로 합쳐버리고, 이를 inlining이라고 한다. [2] 국내에도 카이스트, 고려대, 동아대 등 몇몇 학교가 교육했다. 2020년대에는 MIT도 Python으로 갈아탔다. [3] Clojure 제외 [4] 예를 들어 (set! a 1)은 이미 만들어진 이름 a에다가 새로 1을 배정한다. [5] "Any sufficiently complicated C or Fortran program contains an ad hoc, informally-specified, bug-ridden, slow implementation of half of Common Lisp." 복잡한 C나 포트란 프로그램은 커먼 리스프에 이미 기본적으로 있는 기능을 직접 만들어 써야 할 가능성이 높은데, 큰 기능들을 여러 개 구현하려다보니 대충 끼워맞추고 상세도 불분명해 버그가 넘쳐나고 느릴 수밖에 없다는 말이다. [6] B를 부른 후에 할 것이 return밖에 없는 경우 [7] GCC에서 -O2를 하면 C에서도 제약이 많지만 TCE가 된다! [8] call-with-current-continuation [9] "..." 점 3개로 뭐든지 패턴매칭이 가능하다! [10] 알골 에뮬레이터가 내장되어있다!

분류