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 자체의 직접적인 사용 범위는 시대와 분야에 따라 달라졌지만, 프로그램을 단순한 명령의 나열이 아니라 변환 가능한 구조로 다루는 관점은 프로그래밍 언어 연구와 소프트웨어 설계에 계속 남아 있다.

역사

설계 배경

재귀 함수와 기호 표현식

최초의 Lisp 구현

LISP 1과 LISP 1.5

초기 인공지능 연구

Maclisp와 Interlisp

Lisp Machine

Scheme의 등장

Common Lisp의 통합과 표준화

현대 Lisp 계열

언어 계열과 주요 방언

Lisp 1.5

Maclisp

Interlisp

Common Lisp

Scheme

Emacs Lisp

Racket

Clojure

기타 Lisp 계열 언어

S-표현식과 기본 문법

원자와 목록

함수 호출과 전위 표기법

심볼과 값

특수 형식

인용과 quote

조건식

함수 정의

지역 바인딩

재귀

평가 모델

읽기·평가·출력 과정

REPL

자기 평가 형식

함수 적용

정상 순서와 적용 순서

엄격한 평가와 지연 평가

함수 위치와 값 위치

단일 이름 공간과 분리된 이름 공간

코드와 데이터

호모아이코니시티

코드의 목록 표현

프로그램 생성과 변환

매크로

매크로 확장

위생적 매크로와 비위생적 매크로

리더 매크로

도메인 특화 언어

함수형 프로그래밍

일급 함수

고차 함수

익명 함수

클로저

재귀와 반복

map, filter, reduce

불변성과 부수 효과

자료 구조

연결 리스트

cons 셀

심볼

연관 리스트

벡터와 배열

해시 테이블

문자열

영속 자료 구조

타입 체계

동적 타입

강한 타입 검사

Common Lisp의 타입 선언

Scheme의 타입 모델

점진적 타입과 Typed Racket

Clojure의 타입과 메타데이터

메모리 관리

동적 메모리 할당

가비지 컬렉션

초기 Lisp의 메모리 구조

cons와 힙

객체 수명

현대 구현체의 메모리 관리

객체 지향 프로그래밍

초기 객체 시스템

Common Lisp Object System

제네릭 함수

다중 디스패치

메서드 결합

메타객체 프로토콜

오류와 조건 처리

오류 처리

조건 시스템

핸들러

재시작

대화형 디버깅

모듈과 프로그램 구성

패키지와 이름 공간

라이브러리

모듈 체계

이미지 기반 개발

실행 중인 프로그램의 재정의

빌드와 배포

구현과 실행 방식

인터프리터

바이트코드 가상 머신

네이티브 컴파일

점진적 컴파일

이미지와 힙 저장

다른 런타임 위의 Lisp

개발 환경

REPL 중심 개발

구조적 편집

괄호 기반 코드 편집

디버거와 인스펙터

실행 중 코드 수정

Emacs와 SLIME

DrRacket

표준화

초기 Lisp 명세

Scheme 보고서

ANSI Common Lisp

Common Lisp HyperSpec

구현체 간 호환성

방언별 표준화 방식

주요 구현체

SBCL

Clozure CL

CLISP

ECL

LispWorks

GNU Emacs

Racket

Chez Scheme

Clojure

활용 분야

인공지능

기호 계산

자동 정리 증명

자연어 처리

컴퓨터 대수

언어 처리와 컴파일러

에디터 확장

교육과 연구

웹 서비스와 서버 프로그램

금융과 산업용 시스템

다른 프로그래밍 언어와의 관계

람다 대수

ALGOL

Smalltalk

ML

Prolog

Python

Ruby

JavaScript

Julia

Rust

Wave

영향

가비지 컬렉션

REPL과 대화형 개발

익명 함수와 클로저

고차 함수

동적 타입

조건식

메타프로그래밍

매크로와 코드 생성

함수형 프로그래밍의 확산

프로그래밍 언어 연구

장점과 한계

관련 문서

  1. IEEE Computer Society: John McCarthy
  2. Computer History Museum Software Preservation Group: LISP 1.5 Family
  3. LISP 1.5 Programmer's Manual
  4. Common Lisp HyperSpec: About the Common Lisp HyperSpec
  5. Racket 공식 웹사이트
  6. Clojure: Clojure as a Dialect of Lisp
  7. Clojure: Hosted on the JVM