LISP (1958)
LISP (1958)
1. 한 줄 요약
LISP(LISt Processor)는 1958년 MIT 의 John McCarthy 가 IBM 704 위에서 람다 계산법(λ-calculus)을 컴퓨터에서 실행 가능한 형태 로 만든 언어로, 함수형 프로그래밍·재귀·가비지 컬렉션·동질성(homoiconicity, 코드와 데이터가 같은 형식) 같은 현대 언어의 거의 모든 핵심 개념 을 한꺼번에 제시한 사실상 컴퓨터 과학의 원초 언어 이다.
2. 등장 시기·배경
위키피디아는 LISP 의 시점을 1958년 으로 명시하며, John McCarthy 가 MIT 에서 "to create an AI programming language that would work on the IBM 704" 라는 동기로 개발했다고 기록한다. McCarthy 는 당시 인공지능 연구를 위해 기호 처리(symbolic computation) 에 적합한 언어가 필요했고, 기존의 FORTRAN(같은 IBM 704 위에서 1957년 출시)이 수치 계산에는 적합했지만 기호 조작 에는 부적합하다는 판단을 내렸다.
LISP 의 설계 토대는 두 가지로 압축된다.
- 람다 계산법 (Alonzo Church, 1930년대) — 위키피디아 표현 "drew inspiration from the notation of Alonzo Church's lambda calculus". 이는 결정적이다. 람다 계산법은 1930년대에 Church 가 수학적 형식 체계 로 박은 것이며, 1958년 McCarthy 는 그 형식 체계를 컴퓨터에서 실행할 수 있게 옮긴 것뿐이다. 즉 언어보다 30년 앞서 형식 체계가 종이 위에 존재했고, 코드는 그것을 따랐다.
- IPL (Information Processing Language) — 위키피디아 표현 "Information Processing Language, which was also based on list processing". Newell·Simon 의 IPL 이 리스트 처리의 직접적 선조.
핵심 인물은 위키피디아가 명시하는 John McCarthy(설계자), Steve Russell(eval 함수 구현자). McCarthy 가 종이 위에 적은 eval 함수를 Russell 이 기계어로 직접 구현 해 첫 LISP 인터프리터를 만들었다는 일화가 유명하다. McCarthy 자신은 "이론적인 글로 적은 것이지 실행할 의도는 없었다" 고 회상했다 — 형식 체계가 곧 실행 가능한 코드가 되었다는 결정적 사례.
3. 핵심 특징
- S-expression (괄호 표기) — 위키피디아 표현 "All program code is written as s-expressions, or parenthesized lists". 모든 코드가
(함수 인자1 인자2 ...)형태의 괄호 리스트.(+ 1 2)는 1+2,(if (> x 0) 'positive 'negative)는 조건 분기. - 재귀 (recursion) — 위키피디아 표현 "The language supported recursion, which earlier systems lacked". 1958년 시점에 재귀를 언어 차원에서 지원한 첫 언어. FORTRAN II 가 1958년 등장했으나 재귀를 지원하지 않았다. 재귀는 LISP 에서 반복(loop) 대신 사용하는 표준 흐름 제어.
- ★ 가비지 컬렉션 (garbage collection) — 위키피디아 표현 "Garbage collection routines were developed by MIT graduate student Daniel Edwards, prior to 1962". 1962년 이전, 즉 LISP 등장 4년 안에 세계 최초의 자동 메모리 관리 시스템 이 구현됨. 60년이 지난 지금 Java·Python·JavaScript·C# 의 모든 GC 가 LISP 의 후손.
- ★ 동질성 (homoiconicity, code-as-data) — 위키피디아 표현 "the first language where the structure of program code is represented faithfully and directly in a standard data structure". 코드 자체가 리스트(=언어의 자료 구조). 코드를 데이터처럼 다루고, 데이터를 코드로 실행 가능. 매크로(macro)·메타프로그래밍·자기 수정 코드의 직접 기반.
- 동적 타이핑 (dynamic typing) — 위키피디아 표현 "dynamic typing". 변수에 타입 선언이 없고 값에 타입이 붙어있다. Python·JavaScript 의 동적 타입 시스템의 직접 조상.
4. 주 용도
위키피디아 표현 "quickly became a favored programming language for artificial intelligence (AI) research". 1960~1990년대 AI 연구의 사실상 단일 언어. MIT AI Lab·Stanford AI Lab·CMU 의 모든 AI 프로젝트가 LISP 로 작성. 전문가 시스템(MYCIN, DENDRAL), 자연어 처리(SHRDLU), 정리 증명기, 게임 AI(체스·체커) 모두 LISP.
상업적 영향도 작지 않다. AutoCAD 의 매크로 언어 AutoLISP, Emacs 의 확장 언어 Emacs Lisp, Common Lisp 와 그 후예 Clojure(JVM 위), Scheme(MIT 표준 교과 언어) — LISP 가족은 60년이 지난 지금도 살아있다.
본 강의 맥락에서 결정적인 점은 AI 첫 시대(1960~80년대)의 단일 언어가 LISP 였다 는 사실이다. 즉 AI 와 코드의 관계 는 1958년부터 이미 특별했다.
5. 그 시대의 설계 도구 매핑 ★
LISP 시대(1958~1960년대)의 설계 도구는 그 람다 계산법 자체였다. 이는 다른 언어와 구별되는 결정적 특징이다.
| 설계 도구 | 역할 |
|---|---|
| ★ 람다 계산법 (1930년대 Church) | LISP 의 직접적 형식 명세. 람다 계산법으로 알고리즘을 종이 위에 박은 다음, 그것을 LISP 코드로 기계적으로 옮기면 됨. 코드와 명세가 거의 일치 한 첫 사례. |
| ★ 재귀 정의 (recursive definition) | 모든 알고리즘이 기저 조건 + 재귀 단계 두 줄로 기록됨. 수학적 귀납법을 그대로 코드로. McCarthy 의 1960년 논문 Recursive Functions of Symbolic Expressions 가 LISP 의 종이 위 명세 그 자체. |
| ★ 트리 다이어그램 (tree diagram) | S-expression 이 본질적으로 나무 구조 이므로, 알고리즘을 종이 위에 나무로 그리는 것이 표준 설계. 후일 AST(추상 구문 트리)의 직접 조상. |
| ★ 패턴 매칭 표 (pattern matching table) | 함수의 입력에 대한 분기를 표로 정리. 후일 ML·Haskell·Erlang 의 패턴 매칭 문법의 시각적 선조. |
| eval/apply 다이어그램 | LISP 자체의 평가 모델을 도식화. 언어가 자기 자신을 어떻게 해석하는가 를 그림으로 그림. 메타 인터프리터의 표준 도구. |
핵심은 LISP 가 형식 체계 → 코드 의 가장 직접적 매핑을 보여준 언어라는 사실이다. 람다 계산법이 1930년대 종이 위에 먼저 있었고, 1958년 코드가 그것을 따랐다. 강의 핵심 명제 — 설계 없이는 코딩이 안 된다 — 의 가장 극단적 사례. 설계가 30년 앞서 종이 위에 있던 언어.
6. 언어 그룹 분류
함수형(functional)·선언형(declarative) 언어의 출발점. 위키피디아 표현 "first functional language". 명령형(FORTRAN·COBOL·ALGOL) 가족과 완전히 다른 패러다임 의 출발. 함수형 가족의 후손: Scheme(1975), ML(1973), Haskell(1990), OCaml(1996), Erlang(1986), Clojure(2007), Elixir(2011), F#(2005), Scala(부분, 2004).
함수형 패러다임은 60년간 주류는 아니었지만 항상 살아있던 흐름이다. 2010년대 이후 React·Redux·Rx·반응형 프로그래밍·동시성 처리(Erlang·Akka)에서 함수형 사상이 다시 주류로 복귀. AI/ML 시대의 순수 함수·불변성·고차 함수 가 다시 LISP 의 사상을 호출.
7. 강의 도입 활용 포인트
LISP 의 한 줄 코드 — (define (factorial n) (if (= n 0) 1 (* n (factorial (- n 1))))) — 와 그 람다 계산법 표기 — λn. if (n=0) then 1 else n × factorial(n-1) — 를 나란히 보여주면, 형식 명세와 코드가 거의 일치하는 모습이 한눈에 기록된다. 30년 전 Church 가 종이에 적은 식이 1958년 McCarthy 의 코드가 되었다 — 이것이 설계가 코드보다 먼저 라는 명제의 가장 깊은 사례. 강의 후반부에서 현대 LLM 의 자연어 프롬프트도 결국 형식 명세의 한 형태 라는 통찰로 자연스럽게 이어진다.
출처
- Wikipedia, Lisp (programming language), https://en.wikipedia.org/wiki/Lisp_(programming_language)
- Wikipedia, Lambda calculus, https://en.wikipedia.org/wiki/Lambda_calculus
- John McCarthy, Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I, Communications of the ACM, 1960.
그룹 시리즈
→ synthesis/group-g2 (시대 그룹 종합 카드)