---
title: "프로그래밍 언어는 사실 7개 가족이 전부다 — ur-language로 본 언어 계보"
published: 2026-04-19T07:38:08.000Z
canonical: https://jeff.news/article/1821
---
# 프로그래밍 언어는 사실 7개 가족이 전부다 — ur-language로 본 언어 계보

madhadron은 세상의 모든 프로그래밍 언어가 ALGOL, Lisp, ML, Self, Forth, APL, Prolog 이렇게 7개 ur-language로 환원된다고 주장한다. 같은 가족 내 이동은 쉽지만 다른 가족으로 넘어가는 건 뇌의 신경회로를 새로 만드는 일이라 비싸다. 저자는 ALGOL 가족을 마스터한 다음 Prolog 가족(SQL)을 익히고, 그 후 매년 새 가족을 배우라고 권한다.

- "자바 배울까 파이썬 배울까 C# 배울까?" — 이런 질문을 받을 때마다 madhadron은 "뭘 해도 상관없다"고 답해왔다고 함
  - 왜냐하면 저것들은 전부 같은 "ur-language(원형 언어)" 가족이기 때문
  - 정작 중요한 건 내가 익숙한 ur-language와 **다른** 가족의 언어를 배우는 것. 거기서 뇌의 신경회로 자체가 달라진다는 게 저자의 주장
- 저자는 현재 소프트웨어에 7개의 ur-language가 존재한다고 봄
  - ALGOL / Lisp / ML / Self / Forth / APL / Prolog
  - 각 가족 내부의 언어를 익히는 건 쉽지만, 가족을 건너뛰는 건 시간과 노력이 상당히 든다고

### ALGOL 계열 — 대부분이 여기 속한다

- 특징은 단순함. 할당, 조건문, 반복문을 함수로 묶는 그 구조
  - C, C++, Java, C#, Python, Ruby, JavaScript, Pascal, Ada... 실무에서 쓰는 언어 대부분이 여기
  - 가장 오래된 가족이기도 함. Ada Lovelace가 Babbage 해석기관용 프로그램을 쓸 때부터 시작
- 흥미로운 건 ALGOL 가족이 다른 ur-language에서 기능을 꾸준히 훔쳐왔다는 점
  - 1980년대엔 Self에서 "클래스"를 가져왔고 (그게 우리가 아는 OOP)
  - 2010년대부턴 ML에서 타입 시스템/패턴 매칭 같은 걸 가져오는 중

### Lisp — 문법 자체를 재정의하는 언어

- 괄호 속 prefix 표현식이 전부. `(+ 2 3)` 이런 식
  - 코드 자체가 리스트 자료구조라서 매크로로 언어 문법을 직접 수정 가능
  - Common Lisp의 loop 문법도 사실은 내장 문법이 아니라 매크로로 정의된 것
- Fortran보다 1년 늦게 태어나서 지금까지 살아있는 두 번째로 오래된 언어
  - 1970년대 말~1980년대 초엔 Lisp 전용 머신까지 제작됨. 오늘날 IDE의 뿌리가 거기서 나옴
  - AI 연구의 주력 언어였지만 AI Winter와 함께 추락. 그래도 Clojure 같은 신흥 가지로 이어지는 중

### ML — 타입 시스템과 재귀의 가족

- 함수가 일급 값이고 Hindley-Milner 타입 시스템을 쓰는 게 핵심
  - 반복은 전부 재귀로. 아니면 반복 패턴을 캡슐화한 고차 함수로
  - Miranda와 Haskell은 "지연 평가(lazy)" 기본. 필요할 때까지 계산 안 함
- Cambridge에서 정리 증명기의 메타언어(meta-language)로 시작해서 ML이란 이름이 붙음
  - Standard ML, OCaml, Haskell, 그리고 의존 타입 언어인 Agda, Idris까지

### Self — 객체지향의 순수 형태

- 프로그램은 메시지를 주고받는 객체들의 집합. 그게 전부
  - 조건문조차 true 객체와 false 객체가 각자 다른 함수를 실행하는 방식
  - 적절한 객체를 끼워넣으면 언어 의미 자체를 재정의할 수 있음
- JavaScript가 Smalltalk가 아닌 Self 계열인 거 알고 있었음?
  - Smalltalk는 클래스 기반, Self는 클래스 없는 순수 프로토타입 객체 시스템
  - JS의 prototype chain이 여기서 나옴
- Strongtalk 프로젝트가 역사적으로 중요한 이유
  - Smalltalk를 빠르게 돌리려는 연구의 결과물이 Java의 HotSpot JIT 컴파일러 토대가 됨
  - Erlang도 Self 계열에서 갈라졌는데, "객체 간 메시지"를 "병렬 스레드 간 메시지"로 바꾼 버전

### Forth — Lisp의 거울상

- 스택 기반. `2 3 + 5 *` 처럼 거꾸로 쓰는 HP 계산기 문법
  - 함수는 명시적 파라미터 없음. 스택에서 꺼내쓰고 결과를 스택에 다시 푸시
  - 파서 자체를 프로그래머가 가로채서 교체 가능. 문법을 통째로 갈아엎을 수 있음
- 1970년 전파망원경 제어용으로 만들어진 뒤 임베디드에서 퍼짐
  - PostScript가 Forth의 사촌. 프린터에 문서를 기술하는 용도로 1980년대 등장
  - Factor, Joy도 같은 계열

### APL — 모든 게 배열

- n차원 배열이 기본 단위. 연산자는 심볼 1-2개
  - 너무 간결해서 심볼 시퀀스 자체가 연산의 이름이 됨 (변수명이 없음)
  - Kenneth Iverson이 1960년대 수학 표기법으로 시작해 컴퓨터에 이식
- APL의 후예 K는 금융권에서 엄청 인기가 있었음
  - MATLAB, NumPy, R도 APL의 고차 배열 연산을 부분적으로 수입한 결과

### Prolog — 사실과 추론의 언어

- 프로그램은 사실(fact)과 규칙의 집합. 질의를 던지면 런타임이 검색해서 답을 찾음
  - "Bob은 Ed와 Jane의 아버지다" 같은 ground fact와, 변수를 포함한 non-ground fact로 구성
  - 옳은 구조만 잡으면 튜링 완전함
- 1980년대 일본의 5세대 컴퓨터 프로젝트가 Prolog에 올인했다가 실패하면서 같이 추락
  - 그래도 지금도 틈새에서 생존. Java의 타입 체커가 오랫동안 Prolog로 구현됐고, Facebook 초창기 소스 검색 도구도 Prolog였음

### 저자의 학습 추천 순서

- 1순위: ALGOL 계열 하나를 확실히 익혀라 (어차피 다들 이미 하고 있음)
- 2순위: **SQL을 배워라**. SQL이 Prolog 계열이란 사실
  - "ALGOL 다음으로 경력에서 가장 많이 우려먹게 될 언어"가 SQL이라고 단언
- 3순위부터는 매년 한 가족씩 새로 배우기. 추천 언어
  - Lisp → PLT Racket / ML → Haskell / Self → Self 자체 / Prolog → Prolog 자체 / Forth → gForth / APL → K(via ok)
  - 수치 계산 많이 하면 K를 먼저, 임베디드 하면 gForth를 먼저

> [!TIP]
> SQL을 "DB 질의어"로만 보지 말 것. Prolog 계열 논리 언어의 사고방식을 익히는 통로로 접근하면 SQL이 완전히 다르게 보인다는 게 저자의 포인트.

---

## 기술 맥락

"ur-language"라는 표현이 낯설 수 있는데, 고생물학에서 "모식표본(type specimen)"이라고 부르는 개념에서 따왔어요. 어떤 종을 정의하는 대표 화석을 기준 삼아서 다른 화석들을 분류하는 방식이죠. 저자는 같은 논리를 프로그래밍 언어에 적용해서, "이 언어는 어떤 화석 가족에 속하는가"를 묻는 거예요.

왜 이 분류가 의미 있냐면, 언어를 배울 때 드는 진짜 비용이 "문법 외우기"가 아니라 "사고 패턴 바꾸기"라는 관찰 때문이에요. Java에서 C#으로 넘어가는 건 쉬워요. 둘 다 ALGOL 가족이거든요. 근데 Java 쓰던 사람이 Haskell이나 Prolog로 가면 뇌를 새로 만들어야 해요. 재귀 기반 사고나 통일(unification) 기반 사고는 반복문과 할당 패러다임과 완전히 다른 신경회로를 요구하니까요.

흥미로운 대목은 ALGOL 가족이 "순수한" 가족이 아니라는 점이에요. 클래스 개념은 Self에서, 패턴 매칭과 대수적 타입은 ML에서, 람다는 Lisp에서 훔쳐온 거거든요. 그러니까 우리가 쓰는 최신 Kotlin이나 Rust는 사실 여러 ur-language의 하이브리드라는 거죠.

저자의 SQL 추천이 특히 재밌는데, SQL을 Prolog 가족으로 분류한 건 많은 개발자가 놓치는 관점이에요. SQL을 "테이블에서 데이터 긁어오는 명령어"로 익히면 안 되고, "사실들로부터 규칙에 따라 도출(derivation)하는 논리 시스템"으로 접근해야 SQL의 진짜 표현력이 열린다는 거예요. 복잡한 JOIN과 CTE가 갑자기 다르게 보이기 시작하는 지점이죠.

## 핵심 포인트

- Java, C#, Python 중 뭘 배울지 고민하는 건 의미가 없다 — 전부 ALGOL 가족이라 실제 사고방식은 똑같다
- JavaScript는 Smalltalk가 아닌 Self 계열이다. JS의 prototype chain이 거기서 나왔다
- ALGOL 가족은 순수하지 않다. 클래스는 Self에서, 패턴 매칭은 ML에서, 람다는 Lisp에서 훔쳐왔다
- SQL은 사실 Prolog 가족이다. 저자는 ALGOL 다음으로 SQL을 배우라고 강력 추천한다
- Smalltalk를 빠르게 돌리려던 Strongtalk 프로젝트 성과가 Java의 HotSpot JIT 컴파일러 토대가 됐다

## 인사이트

언어 선택 논쟁의 대부분이 같은 ur-language 안에서의 셔플에 불과하다는 통찰이 신선하다. 진짜 생산성 상승은 가족을 건너뛸 때 온다.
