Lisp
Lisp는 1958년 존 매카시가 인공지능 연구와 기호 계산을 위해 설계한 프로그래밍 언어이자, 그 설계 원리를 계승한 프로그래밍 언어 계열이다. 이름은 List Processing에서 유래했으며, 프로그램과 데이터를 주로 괄호로 둘러싸인 목록 형태의 S-표현식으로 나타내는 것으로 알려...
| 분류 | 범용 프로그래밍 언어, 프로그래밍 언어 계열 |
|---|---|
| 패러다임 | 함수형 프로그래밍, 다중 패러다임 프로그래밍, 메타프로그래밍 |
| 설계자 | 존 매카시 |
| 개발 기관 | 매사추세츠 공과대학교 |
| 최초 개발 | 1958년 |
| 최초 구현 | 1959년경 |
| 주요 자료 구조 | 연결 리스트, 심볼, S-표현식 |
| 타입 체계 | 방언에 따라 다름 |
| 메모리 관리 | 주로 가비지 컬렉션 |
| 주요 방언 | Common Lisp, Scheme, Emacs Lisp, Racket, Clojure |
| 영향을 받은 이론 | 람다 대수, 재귀 함수 이론 |
| 파일 확장자 | .lisp, .lsp, .cl, .scm, .el, .rkt, .clj |
Lisp는 1958년 존 매카시가 인공지능 연구와 기호 계산을 위해 설계한 프로그래밍 언어이자, 그 설계 원리를 계승한 프로그래밍 언어 계열이다. 이름은 List Processing에서 유래했으며, 프로그램과 데이터를 주로 괄호로 둘러싸인 목록 형태의 S-표현식으로 나타내는 것으로 알려져 있다. 존 매카시는 Lisp를 발명한 인물로 기록되며, 초기 설계는 재귀 함수와 기호 표현식을 기계적으로 계산하는 방법을 바탕으로 형성되었다.[1][2]
Lisp에서는 프로그램 코드가 일반적인 데이터 구조와 같은 형태로 표현된다. 예를 들어 함수 호출은 함수 이름과 인수를 포함한 목록으로 작성되며, 이 표현은 프로그램이 다른 프로그램의 코드를 생성하거나 분석하고 변환하기 쉽게 만든다. 이러한 코드와 데이터의 구조적 동질성은 Lisp의 매크로 체계와 메타프로그래밍 능력의 기반이 되었다.
(+ 1 2 3)
위 표현식은 + 함수를 세 개의 인수에 적용한다. 첫 번째 요소가 연산을 나타내고 나머지 요소가 피연산자가 되는 전위 표기법을 사용하므로, 연산자의 우선순위를 위한 별도의 문법이 거의 필요하지 않다.
Lisp는 초기부터 연결 리스트, 심볼 처리, 재귀, 동적 메모리 할당과 가비지 컬렉션을 핵심 요소로 사용했다. LISP 1.5의 실행 환경에서는 사용 가능한 메모리의 상당 부분을 S-표현식을 이루는 리스트 구조를 저장하는 데 사용했다.[3] 이러한 구성은 인공지능, 자동 정리 증명, 자연어 처리와 컴퓨터 대수처럼 수치보다 기호와 구조를 중심으로 다루는 문제에 적합했다.
오늘날 Lisp라는 이름은 단일한 문법과 표준을 가진 하나의 언어만을 뜻하지 않는다. 초기 Lisp에서 갈라져 나온 Common Lisp, Scheme, Emacs Lisp, Racket, Clojure를 비롯한 여러 방언과 후손 언어를 포함하는 계열을 가리킨다. 이들은 S-표현식과 코드-데이터 동질성, 매크로, 대화형 개발 같은 전통을 공유하지만 함수와 변수의 이름 공간, 타입 체계, 모듈 구조, 객체 시스템, 불변 자료 구조와 실행 플랫폼에서는 서로 다른 방향으로 발전했다.
Common Lisp는 여러 기존 Lisp 방언을 통합하기 위해 만들어졌으며, 1994년 ANSI X3.226 표준으로 공식 표준화되었다. 이 표준은 Lisp 계열 전체가 아니라 Common Lisp라는 특정 방언을 정의한다.[4] Scheme은 작고 규칙적인 언어 핵심과 어휘적 스코프, 함수형 프로그래밍을 강조했으며, 이후 교육과 프로그래밍 언어 연구에 큰 영향을 미쳤다. Scheme에서 발전한 Racket은 언어를 만들기 위한 언어라는 방향을 강화하여 하나의 실행 환경 안에서 목적별 언어를 정의하고 사용할 수 있게 한다.[5]
Clojure는 Lisp의 코드-데이터 철학과 매크로 체계를 JVM 생태계에 결합한 현대적인 방언이다. 불변 영속 자료 구조와 함수형 프로그래밍, 동시성 지원을 강조하며 함수는 JVM 바이트코드로 컴파일된다.[6][7]
Lisp에서 발전한 개념은 Lisp 계열 밖의 프로그래밍 언어에도 널리 확산되었다. 가비지 컬렉션, 대화형 REPL, 고차 함수, 익명 함수, 동적 타입, 조건부 표현식, 재귀 중심의 프로그래밍, 프로그램을 조작하는 매크로와 코드 생성 기능은 여러 현대 언어와 개발 환경의 설계에 영향을 주었다. Lisp 자체의 직접적인 사용 범위는 시대와 분야에 따라 달라졌지만, 프로그램을 단순한 명령의 나열이 아니라 변환 가능한 구조로 다루는 관점은 프로그래밍 언어 연구와 소프트웨어 설계에 계속 남아 있다.