NEO.K / PLDST程式語言設計師風格譜系
編號PLDST-012
版本v1.0
日期2026-07-30
作者Neo.K
狀態公開版/第三部設計師個案正式研究

下載 PDF ↓回到論文索引 ↗

John McCarthy:極小核心、符號計算與語言可延展性

摘要

John McCarthy 的程式語言設計風格通常被濃縮成幾個標籤:LISP、List、Recursion、eval、程式即資料。然而,這些特徵若脫離其原始問題,就容易被誤解成純粹的語法極簡或無限制元程式設計。

LISP 最初並不是為了展示一種漂亮的括號語法,而是為人工智慧研究建立一個能操作符號表達式、邏輯句子、可變大小結構與遞迴定義的計算系統。McCarthy 在 1960 年論文中明確說明,該系統源自 Advice Taker 所需要的形式化宣告與命令表達,並經多次簡化,最後建立在與特定 IBM 704 獨立的 S-expression 與 Recursive function 表示上。[R1]

LISP 的設計核心包含:

然而,把這些成果全部歸於 McCarthy 一人同樣失真。Steve Russell 看到 McCarthy 作為數學練習寫出的 eval 可以直接實作為 Interpreter,並將其手工編成 IBM 704 機器碼;Daniel J. Edwards、Timothy Hart、Michael Levin、Paul Abrahams、Phyllis Fox、Klim Maling 等人對 Interpreter、Garbage collector、Compiler、Reader/Printer、Manual 與實際系統作出關鍵貢獻。[R3][R4]

本文使用 PLDST 模型,把 McCarthy 的語言設計分成四個相位:

  1. 符號問題形成期:AI、Advice Taker、邏輯表達與可變結構;
  2. 遞迴形式核心期:S-expression、S-function、Lambda、Conditional 與 applyeval
  3. 可執行元語言期:程式作為資料、Interpreter、互動環境與系統自我延展;
  4. 多分支語族期:LISP 1.5 之後由不同實作、機構和社群形成多條 Lisp 路線。

本文的核心判斷是:

McCarthy 的極簡不是「功能越少越好」,而是尋找一組能同時表示資料、程式與語言定義的生成性核心,使語言能由其使用者和實作者繼續擴張。

其深層風格可表示為:

統一表示+遞迴定義+可執行語義+系統自我延展\boxed{ \text{統一表示} + \text{遞迴定義} + \text{可執行語義} + \text{系統自我延展} }

但這種風格也有代價:

關鍵詞: John McCarthy、LISP、符號計算、S-expression、eval、遞迴、垃圾回收、程式即資料、語言延展、PLDST


第一部分 研究邊界與歸因

一、本文研究對象

本文主要研究:

本文不把 Scheme、Common Lisp、Interlisp、Maclisp、Emacs Lisp、Clojure 等後代語言的全部設計歸於 McCarthy。


二、創始設計與實作必須分開

LISP 1.5 Programmer’s Manual 的原始歸因指出:

因此:

問題設定與核心形式:McCarthy 高
eval 的形式定義:McCarthy 高
eval 成為實際 Interpreter:Russell 關鍵
運行系統與 Compiler:團隊共同
Lisp 語族後期演化:多共同體

三、McCarthy 自己也承認歷史歸因不完整

他在〈History of Lisp〉開頭直接指出:

這使 McCarthy 個案非常適合 PLDST 的多主體歸因模型。


第二部分 相位一:問題先於語言

四、Advice Taker 與符號推理

LISP 的起點是建立能操作:

的系統。

這要求資料不是固定數值陣列,而是具有:

的表達。


五、為什麼是 List

McCarthy 在口述歷史中說明,List 能讓程式的結構與資料結構相互對應。

例如一個和式可以表示為:

PLUS
├── term1
├── term2
└── term3

程式不需要先把整個表達式解析成固定長度陣列,而可以:


六、Recursion 不是裝飾功能

形式微分的定義天然具有遞迴結構:

D(a+b)=D(a)+D(b)D(a+b) = D(a)+D(b)

如果表達式是一個和,微分程式就對各子表達式再次呼叫自己。

McCarthy 回顧,他在 1958 年發現 FORTRAN 不允許這種遞迴,因此判斷需要新語言。[R3]


七、問題—資料—控制三者對齊

McCarthy 的重要設計方式是讓:

StructureproblemStructuredataStructureprogramStructure_{\text{problem}} \approx Structure_{\text{data}} \approx Structure_{\text{program}}

這是 Lisp 可讀性與元編程能力的共同來源。


第三部分 相位二:遞迴形式核心

八、S-expression

S-expression 提供:

其核心能力不是括號本身,而是規則化樹狀表示。


九、S-function 與 M-expression

McCarthy 原本區分:

1960 年論文承認,S-expression 表示可寫且有一定可讀性;若為提高表面可讀性而改變符號,也會降低結構規則性。[R1]

原計畫是由 M-expression 翻譯為 S-expression,但這套外部語法沒有完成及普及。

結果是:

IntermediateRepresentationSurfaceLanguageIntermediateRepresentation \rightarrow SurfaceLanguage

這是一個典型的事故性穩定。


十、少量基本函數

早期核心包括:

這些機制本身不多,卻能組成:


十一、Conditional expression

條件不是只作為控制陳述,而被放入表達式和函數定義。

因此:

BranchExpressionBranch \in Expression

而不需把計算分裂成表達式世界與陳述世界。


十二、Lambda 與 Recursive definition

Lambda expression 提供匿名函數與參數綁定;label 等機制使函數能以名稱遞迴引用自己。

這讓語言核心同時具有:


第四部分 eval:形式定義變成可執行系統

十三、原始意圖

McCarthy 說明,他寫出 Universal function eval,主要是數學練習:


十四、Russell 的實作洞見

Steve Russell 看出:

若把 eval 寫成機器程式
它就是 LISP Interpreter

McCarthy 起初有所懷疑,Russell 仍完成實作。[R3]

因此:

FormalDefinitionRussellExecutableInterpreterFormalDefinition \xrightarrow{\text{Russell}} ExecutableInterpreter

這不是單純把 McCarthy 的完整計畫照表實作,而是實作者對形式定義作出的關鍵再解讀。


十五、形式語義與實作合一

eval 同時是:

McCarthy 後來把「eval 同時作為形式定義與 Interpreter」列為 LISP 長期存續的重要特徵。[R6]


十六、這不是完整的自我實作神話

早期 Interpreter 仍依賴:

所以:

語言可用自己的表示描述語義
≠
整個系統不需要外部基礎

第五部分 程式與資料共享表示

十七、統一表示的能力

當程式也以 List/S-expression 表示,程式可以:


十八、元編程與語言延展

統一表示使使用者可以建立:

McCarthy 1980 年總結認為,程式作為 LISP 資料,降低了 System programmer 與 Application programmer 的分隔,許多使用者的「改進」最後成為語言改進。[R6]


十九、不是所有語法樹都等同 Lisp

現代語言也有 AST,但 Lisp 的特殊之處在於:


二十、表達自由的代價

同一能力可能造成:

因此:

ExtensibilityGovernanceNeedExtensibility\uparrow \Rightarrow GovernanceNeed\uparrow

第六部分 Garbage collection 與責任配置

二十一、Erasure problem

List structure 會動態建立大量節點。

若要求每個 AI 程式設計者手工追蹤:

符號計算的抽象就會被記憶體管理摧毀。


二十二、自動回收

McCarthy 將 Garbage collection 列為 LISP 的長期核心特徵;早期實際 Garbage collector 則由 Daniel J. Edwards 等團隊成員完成。[R4][R6]

複雜度配置為:

Cmanual lifetimeCruntimeC_{\text{manual lifetime}}\downarrow \qquad C_{\text{runtime}}\uparrow

二十三、與符號計算模型一致

GC 不是與語言無關的附加便利,而是使:

可以實際運作的 Runtime 責任。


第七部分 互動式語言

二十四、最少前置宣告

McCarthy 把「最少 Declaration,讓 LISP statement 可在 Online environment 中直接執行」列為 LISP 存續特徵。[R6]

這使語言適合:


二十五、互動性與動態性

互動環境需要:

它提高研究生產力,也增加:

的治理問題。


第八部分 相位三:可延展系統

二十六、極小核心不是封閉核心

McCarthy 的核心是生成性的:

SmallKernel+ProgramDataUnity+Eval+GC+InteractiveEnvironmentOpenEndedSystemSmallKernel + ProgramDataUnity + Eval + GC + InteractiveEnvironment \rightarrow OpenEndedSystem

二十七、擴展能力放在哪裡

LISP 把大量能力放在:

因此語言核心可以小,整個 Lisp 系統卻可以極大。


二十八、可擴展性與標準化張力

當不同機構各自改進 Lisp,便產生:

這既是 Lisp 生命力,也形成方言分裂。


第九部分 相位四:從 LISP 到 Lisp 語族

二十九、1962 後的多分支

McCarthy 自己將 LISP 歷史分為:

這表示:

StyleMcCarthyStyleall Lisp descendantsStyle_{\text{McCarthy}} \neq Style_{\text{all Lisp descendants}}

三十、後創始者制度

不同 Lisp 路線後來由:

共同發展。

McCarthy 很早便不再是所有 Lisp 的直接治理者。


三十一、Lisp 存續的判斷

McCarthy 1980 年把多項特徵視為某種程式語言空間中的近似局部最優:

這是後期回顧,不應被當成 1958 年已完整預見的固定設計藍圖。


第十部分 風格時間相位

三十二、問題形成期

目標:讓機器操作形式知識與邏輯句子
核心需要:可變結構、符號、遞迴

三十三、形式核心期

目標:以少量遞迴函數描述符號計算
核心:S-expression、Lambda、Conditional、Recursion

三十四、可執行語義期

目標:讓語言定義直接成為 Interpreter
轉折:Russell 實作 eval

三十五、系統延展期

目標:讓使用者以程式操作程式、增量改進系統
機制:Program as data、eval、GC、Online environment

三十六、多分支語族期

結果:可延展性產生大量 Dialect 與制度
權力:由創始者轉向多個共同體

第十一部分 PLDST 風格指紋

三十七、問題 framing

McCarthy 從問題結構出發:

若計算對象是形式句子與符號結構,語言本身就應能自然表示、分解、重組和遞迴處理這些對象。


三十八、價值優先序

VMcCarthy(FormalGenerality,SymbolicRepresentation,Recursion,Uniformity,Extensibility,Interactivity,MathematicalSemantics)V_{\text{McCarthy}} \approx ( FormalGenerality, SymbolicRepresentation, Recursion, Uniformity, Extensibility, Interactivity, MathematicalSemantics )

三十九、核心—擴張配置

核心:少量表達與列表操作
擴張:函數、程式生成、Macro、Interpreter、Dialect

這是 生成式極簡,不是功能貧乏。


四十、複雜度配置

Csyntax coreC_{\text{syntax core}}\downarrow Cruntime+Cdynamic reasoning+Cextension governanceC_{\text{runtime}} + C_{\text{dynamic reasoning}} + C_{\text{extension governance}} \uparrow

四十一、責任配置

語言與 Runtime 承擔:

使用者承擔:


四十二、顯式—推導偏好

McCarthy 不是以靜態型別推導為主,而是:


四十三、安全—自由配置

LISP 的自由來自:

安全主要依賴:

這不是以現代 Memory-unsafe 意義為中心,而是語義、效果與元編程權力的治理問題。


第十二部分 反例與限制

四十四、LISP 不只是 McCarthy 的作品

若沒有 Russell、Edwards、Hart、Levin、Fox、Abrahams、Maling 等人的工作,形式核心不會自動變成可使用系統。


四十五、S-expression 的表面成功具有偶然性

McCarthy 原本預期使用 M-expression 作外部語法;S-expression 長期成為 Lisp 表面,部分來自:

因此括號語法不能完全被解釋成創始者預先規劃的最終美學。


四十六、eval 不是所有延展性的必要條件

Macro、Compiler API、Module、Template 與 AST transformation 也可提供延展性。

eval 的優勢與風險取決於:


四十七、小核心可能形成巨大有效語言

Lisp 的每個專案都可能:

這證明:

SmallKernel⇏SmallEffectiveLanguageSmallKernel \not\Rightarrow SmallEffectiveLanguage

四十八、動態符號模型不適合所有問題

數值密集、硬即時、靜態安全、嵌入式記憶體限制等領域,可能需要不同配置。


四十九、歷史回顧有記憶偏差

McCarthy 自己承認其 1978 歷史回憶並非所有細節最可靠版本,因此本文以:

交叉使用。


第十三部分 設計決策語料

時期 問題 決策 複雜度去向 風格
1956–1958 AI 需操作形式句子 List/symbolic structure Runtime representation 問題對齊
1958 FORTRAN 缺遞迴 新語言+Recursive functions 語言語義 遞迴核心
1959–1960 需要通用形式定義 applyeval Interpreter 可執行語義
1960 動態 List 回收 GC Runtime 自動管理
1960s 使用者需改進語言 Program as data 使用者/系統共同 可延展
1962 後 多機構需求 多 Dialect 社群與標準 分支演化

第十四部分 人物原型判定

五十、主要原型

McCarthy 同時屬於:


五十一、不適合的簡單標籤

不應只稱:

括號語言發明者
動態語言設計者
函數式程式設計者
eval 發明者
AI 語言之父

較精確的描述是:

把符號資料、程式表示與語言定義壓縮到同一個遞迴結構中,從而讓語言能操作並延展自身的設計者。


第十五部分 統一評價

五十二、最重要的設計連續性

從 Advice Taker 到 LISP:

KnowledgeStructureSymbolicDataRecursiveProgramExecutableRepresentationKnowledgeStructure \rightarrow SymbolicData \rightarrow RecursiveProgram \rightarrow ExecutableRepresentation

五十三、最重要的制度不連續性

LISP 的核心由 McCarthy 強烈塑造,但 Lisp 語族的長期演化迅速進入:


五十四、最重要的事故性穩定

S-expression 從:

統一內部表示

變成:

長期表面語法與文化身份

這不是單純錯誤,而是實作、形式規則與使用者採用共同選出的結果。


第十六部分 結論

John McCarthy 的程式語言設計不是從「想做一門極簡語言」開始,而是從一個需要:

的問題開始。

他最深刻的設計不是任何單一關鍵字,而是建立以下閉環:

資料可表示程式程式可操作資料語言定義本身可執行使用者可繼續擴展語言\boxed{ \text{資料可表示程式} \rightarrow \text{程式可操作資料} \rightarrow \text{語言定義本身可執行} \rightarrow \text{使用者可繼續擴展語言} }

本文對 McCarthy 的 PLDST 判定為:

Symbolic Problem ModelerRecursive Core ArchitectExecutable Metalanguage Designer\boxed{ \text{Symbolic Problem Modeler} \rightarrow \text{Recursive Core Architect} \rightarrow \text{Executable Metalanguage Designer} }

其核心優勢是:

其核心風險是:

最終原則為:

以最少核心統一資料、程式與語義讓系統可由使用者繼續生長承認生長必須帶來新的治理與安全邊界\boxed{ \text{以最少核心統一資料、程式與語義} \quad\land\quad \text{讓系統可由使用者繼續生長} \quad\land\quad \text{承認生長必須帶來新的治理與安全邊界} }

附錄 A PLDST 個案卡

人物:John McCarthy
主要語言/系統:LISP、Advice Taker 相關形式
核心時期:1956–1962
主要問題:符號、邏輯與可變結構的計算
主要策略:List、Recursion、Lambda、Conditional、eval
核心擴張:Program as data、GC、Interactive environment
複雜度去向:Runtime、動態推理、語言治理
責任去向:Interpreter 與 GC 承擔執行細節
主要保護對象:AI 研究者、符號程式設計者
主要限制:方言分裂、安全、工具與動態錯誤
歸因信心:高

附錄 B 來源與參考文獻

[R1] John McCarthy, “Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I,” Communications of the ACM 3(4), 1960, pp. 184–195.
— LISP 原始形式、S-expression、S-function、Lambda、Conditional、applyeval 與 IBM 704 實作。

[R2] John McCarthy, “History of Lisp,” HOPL I draft, 1978/1979.
— LISP 前史、思想形成、實作、分支、M-expression 與歸因不確定性。

[R3] Nils J. Nilsson, “Oral History of John McCarthy,” Computer History Museum, 2007.
— FORTRAN 遞迴限制、List 選擇、eval 原意及 Steve Russell 的 Interpreter 洞見。

[R4] John McCarthy et al., LISP 1.5 Programmer’s Manual, MIT Press, 1962; Computer History Museum LISP 1.5 preservation materials.
— 整體設計、Interpreter、GC、Compiler、Reader/Printer、Manual 與團隊歸因。

[R5] John McCarthy historical pages, Stanford Formal Reasoning Group.
— McCarthy 對自身記憶限制、Herbert Stoyan 文件研究及歷史資料的說明。

[R6] John McCarthy, “LISP—Notes on Its Past and Future,” ACM LISP and Functional Programming Conference, 1980.
— LISP 長期存續特徵、Program as data、eval、GC 及 Online environment。

[R7] Computer History Museum Software Preservation Group, “LISP History Collection.”
— 原始程式、手冊、方言、實作、人物與多分支歷史。

[R8] John McCarthy, “A Basis for a Mathematical Theory of Computation,” 1961–1963.
— 遞迴函數、語言形式與程式變換的數學理論背景。


附錄 C PLDST 標記

[T-P] Symbolic problem formation
[T-R] Recursive formal core
[T-E] Executable semantics
[T-X] Extensible system
[T-D] Dialect/community divergence

[S-S] Symbolic representation
[S-M] Minimal generative kernel
[S-R] Recursive architecture
[S-E] Eval/executable semantics
[S-P] Program-data unity
[S-I] Interactive extensibility

附錄 D 第二輪史實與歸因校對紀錄

D.1 LISP 的形成時期

第二輪重新核對 McCarthy 的〈History of Lisp〉:

本文因此把「問題形成」「形式核心」「可執行系統」「多分支語族」分開,而沒有把後期 Lisp 特徵全部回寫到第一天。


D.2 eval 與 Interpreter 歸因

第二輪重新核對 1960 原始論文、McCarthy 口述歷史與 LISP 1.5 Manual:

因此本文不使用「McCarthy 單人寫出第一個 Lisp Interpreter」的說法。


D.3 LISP 1.5 團隊歸因

第二輪直接核對 Programmer’s Manual Preface:

整體設計:John McCarthy
Manual:Michael I. Levin
Interpreter:Stephen B. Russell、Daniel J. Edwards
Read/Print:McCarthy、Klim Maling、Edwards、Paul W. Abrahams
Garbage collector/Arithmetic:Daniel J. Edwards
Compiler/Assembler:Timothy P. Hart、Michael I. Levin
較早 Compiler:Robert Brayton
LISP I Manual:Phyllis A. Fox

本文保留 Manual 的當時正式歸因,也承認後來文件研究可能對更細部貢獻作出修正。


D.4 Garbage collection

第二輪核對 McCarthy 1980 年回顧與 LISP 1.5 保存資料:

本文沒有把 GC 的所有發明與後續演算法全部歸於 McCarthy。


D.5 M-expression 與 S-expression

第二輪重新核對 1960 論文與〈The Implementation of LISP〉:

本文已用「事故性穩定」描述結果,而不是聲稱 McCarthy 完全反對 S-expression 語法。


D.6 「程式即資料」的邊界

第二輪核對 McCarthy 1980 年的存續特徵清單:

本文沒有把後來成熟 Macro system、Common Lisp Reader macro、Scheme hygiene 等全部歸於 McCarthy 的原始設計。


D.7 McCarthy 的歷史自我修正

McCarthy 的 Stanford 歷史頁明確說:

因此本文將:

同期論文與手冊
>
保存程式與正式 Preface
>
後期口述與回憶

作為史實校準順序,而不是以創始者回憶壓過全部文件。


D.8 「極小核心」的分析邊界

「生成式極簡架構師」是 PLDST 推論,而不是 McCarthy 本人正式使用的流派名稱。

它依據:

共同產生高擴展能力。

它不表示 LISP 1.5 完整系統、後代 Lisp 或所有 Lisp 程式都很小或容易理解。