计算机语言-编程语言如何模仿人类语言?(11/16)
引言
语言是认知压缩(cognitive compression)的核心工具——用有限的符号表达无限的思想。但当程序员试图用编程语言模仿这种压缩能力时,他们发现了一个根本性的矛盾:自然语言的压缩是"有损"的,而编程语言要求"无损"。1956年,诺姆·乔姆斯基(Noam Chomsky, 1928-)的形式语言理论(formal language theory)用数学证明了这场模仿为何注定是部分的、渐进的。本文通过"压缩"这一核心框架,重新审视编程语言与自然语言的本质差异。

自然语言与编程语言的本质差异:有损压缩 vs 无损压缩
一、语言作为压缩:形式语言理论的核心洞见
1.1 压缩的本质:用有限表达无限
想象一个场景:一位母亲对孩子说"把鞋子穿上,我们出门"。这句话只有十几个字,却传达了完整的意图——穿鞋、准备离开、目的地是户外。这是一种认知压缩:说者将复杂的场景、因果关系、情感色彩压缩进简短的语句,听者则依靠语境和常识解压缩。
1956年,27岁的诺姆·乔姆斯基(Noam Chomsky, 1928-)在麻省理工学院提出了一个革命性的问题:这种压缩能力能否被形式化?他发现,语言的压缩能力可以通过生成式文法(generative grammar)来刻画——有限的规则可以生成无限的句子。这种"压缩"不是简单的数据缩减,而是一种递归的符号系统:用符号的组合与替换,表达无穷多的意义。语言的本质不是词汇的堆砌,而是有限规则对无限表达的压缩。乔姆斯基的洞见在于:这种压缩能力本身可以被形式化——用数学来描述人类最基本的认知能力。
1.2 Chomsky层级在编程语言中的应用
如 Part 6 中详细讨论的,Chomsky层级(Chomsky hierarchy)揭示了不同形式文法具有不同的压缩能力:正则文法(Type 3)最弱但最高效,上下文无关文法(Type 2, context-free grammar)允许递归结构,上下文有关文法(Type 1, context-sensitive grammar)允许规则依赖上下文,递归可枚举语言(Type 0, recursively enumerable)与图灵机等价。这个层级结构揭示了压缩能力越强,分析(parsing)的代价越高这一深刻洞见。
编程语言的设计者们早就意识到这一规律。大多数现代编程语言选择上下文无关文法(Type 2)作为语法基础——它足够强大以表达嵌套结构,又不会带来过高的解析复杂度。例如,大多数编程语言的语法可以用BNF(巴科斯-诺尔范式, Backus-Naur Form)来描述,这是一种与Chomsky的上下文无关文法等价的形式系统。
1.3 正则文法的极限:泵引理与自然语言的复杂性
正则文法(Type 3)是Chomsky层级中最弱的形式系统。尽管正则表达式在文本搜索、词法分析中极其高效,但它无法捕捉自然语言中的递归结构。这一根本性局限可以用泵引理(pumping lemma)来严格证明。
泵引理的核心思想是:对于任何正则语言,存在一个"泵长度"p,使得长度不小于p的字符串,可以被分解为xyz三部分,且对所有i≥0,字符串xyiz仍属于该语言。换句话说,正则语言中的字符串具有某种可预测的重复结构。
考虑一个简单的例子:语言L = {anbn | n ≥ 0}(n个a后跟n个b)。这个语言不是正则的。假设L是正则的,设泵长度为p。取字符串s = apbp。根据泵引理,s可以分解为xyz,其中y非空且|xy| ≤ p。因此y只能由a组成(因为前p个字符都是a)。于是xy2z = ap+|y|bp,其中a的个数多于b的个数,不属于L。矛盾。因此anbn不是正则语言。
这个结论对自然语言处理有深远影响。类似"n个修饰语后跟n个中心词"的递归结构(如"非常非常……非常高的大楼")在自然语言中普遍存在,但正则文法无法生成这种结构。这正是自然语言复杂性的数学根源。
1.4 上下文无关文法的局限:歧义与交叉依赖
上下文无关文法(CFG)比正则文法更强大,能够处理嵌套结构和括号匹配等递归模式。然而,CFG在处理自然语言时仍面临两个根本性局限:固有歧义(inherent ambiguity)和交叉依赖(cross-serial dependencies)。
固有歧义:某些语言同时存在多种解析树,无法通过消歧规则消除。例如,"Old men and women"可以理解为"年长的男人和所有女人"或"所有年长的人和女人"——这是英语中的著名歧义句。上下文无关文法无法消除这种歧义,因为歧义源于语义层面而非句法结构。
交叉依赖:自然语言中存在跨越句子边界的长距离依赖关系。例如,在"The author of the book about the city that the researcher liked sent a message."中,"author"和"sent"之间的主谓关系需要追踪整个名词短语链才能确定。这种长距离依赖超出了上下文无关文法的能力范围。
舒斯特·谢伯(Stuart Shieber)在1985年的论文中证明,上下文无关文法无法处理某些语言现象,如瑞士德语中的交叉依赖结构。这促使研究者求助于更强大的形式系统——上下文有关文法(Type 1),甚至递归可枚举语言(Type 0)。然而,更强大的文法意味着更高的解析复杂度,这构成了理论与实践之间的根本张力。
1.5 属性语法:突破CFG限制的尝试
为了克服上下文无关文法的局限,研究者提出了属性语法(attribute grammars)——在CFG的基础上添加语义规则。属性语法由Donald Knuth在1968年提出,每个文法符号可以携带"属性",属性之间通过规则进行约束和推导。
例如,考虑一条简单的英语句子规则:S → NP VP。一个NP(名词短语)的属性可能包括"数"(单数/复数)和"人称"(第一/第二/第三人称)。属性规则确保:如果NP是复数,VP也必须是复数(如"They are"而非"He are")。这种约束超出了上下文无关文法的能力范围。
然而,属性语法同样面临挑战:属性之间的约束可能导致推导过程中的循环依赖,解析复杂度也会显著增加。在实践中,属性语法被用于特定领域(如编译器前端类型检查),但在通用NLP任务中,其效果有限。

Chomsky层级在编程语言设计中的应用:压缩能力与解析效率的权衡
1.6 巴科斯-诺尔范式:用形式符号压缩语法结构
1959年,IBM的约翰·巴科斯(John Backus, 1924-2007)为了精确描述ALGOL 58的语法,在UNESCO会议上提出了巴科斯-诺尔范式(Backus-Naur Form, BNF)。BNF是一种用递归定义来压缩语法结构的方式:
<expr> ::= <term> | <expr> + <term> <term> ::= <factor> | <term> * <factor> <factor> ::= <ident> | ( <expr> )
这里,::= 表示"定义为",| 表示"或"。一个表达式可以是项,也可以是表达式加项;一个项可以是因子,也可以是项乘因子;一个因子可以是标识符,或用括号包围的表达式。这个递归定义用三个规则,压缩了无限多算术表达式的语法结构。
BNF与Chomsky的上下文无关文法惊人地相似——它们都是用递归规则压缩无限语法结构的方式。Donald Knuth在1964年的一篇短文中指出了这种对应关系,并建议将"巴科斯范式"更名为"巴科斯-诺尔范式"以纪念丹麦计算机科学家Peter Naur的贡献。历史学家后来发现,BNF的思想源头可以追溯到约公元前4世纪的印度。语言学家波你尼(Panini, 约公元前4世纪)在《八章书》(Ashtadhyayi)中发明了一套类似的元语言符号系统,用递归定义来描述梵语语法。这比BNF早了约2300年。
二、编程语言的诞生——为何计算机需要语言?
2.1 机器码时代的困境
1950年代,计算机诞生初期,程序员直接用机器码(0和1的序列)与机器交流。每条指令都是一串二进制数字,例如 `10110001 01010010` 可能代表"将寄存器A的值加到寄存器B"。这种交流方式对人类极为不友好:难以记忆、容易出错、无法在不同型号的机器之间移植。
机器码的困境本质上是认知带宽的不匹配:人类的认知压缩能力习惯于用符号和规则表达复杂操作,而机器只能理解最原始的0/1信号。程序员必须将高级算法"解压"成机器指令,这个过程既缓慢又容易出错。
2.2 FORTRAN的革命(1957)
约翰·巴科斯(John Backus, 1924-2007)在IBM工作时,意识到这个问题的严重性。1957年,他主导设计的FORTRAN(Formula Translation)成为第一种广泛应用的高级编程语言。FORTRAN的核心创新是让科学家可以用接近数学的语法Y = X + 1来编程,而不是一串难以理解的二进制指令。
C FORTRAN 代码示例 REAL X(100), Y(100) DO 10 I = 1, 100 Y(I) = X(I) + 1.0 10 CONTINUE
编译器(compiler)是这场革命的关键技术:它负责将高级语法翻译成机器指令。程序员用人类可读的语法编写程序,编译器自动完成"解压"过程。这标志着认知压缩工具首次进入计算机领域——人类用压缩的符号表达,机器负责解压缩执行。
2.3 LISP与函数式传统(1958)
同年,约翰·麦卡锡(John McCarthy, 1927-2011)在麻省理工学院设计了LISP(List Processing)。与FORTRAN不同,LISP的灵感来自阿隆佐·邱奇(Alonzo Church, 1903-1995)的lambda演算——一种关于函数定义与应用的数学理论。麦卡锡认为,邱奇的lambda演算是编程语言最优雅的理论基础。
; LISP 代码示例 - S表达式 (defun factorial (n) (if (<= n 1) 1 (* n (factorial (- n 1)))))
LISP的核心哲学是"一切皆函数":程序即函数,函数即数据。LISP用S-expression(符号表达式)统一了代码和数据,这种设计比当时的其他语言更具数学美感。S-expression是LISP实现认知压缩的载体——用统一的树形结构表示知识和操作。
2.4 ALGOL与块结构(1958-1960)
ALGOL(Algorithmic Language)由一个国际委员会在1958-1960年间设计,它引入了两个关键概念:块结构(block structure)和词法作用域(lexical scoping)。块结构用 `begin...end` 界定代码块,使得代码可以嵌套;词法作用域则规定变量只在其定义的块内可见。这两项创新深刻影响了后来的编程语言设计。
更重要的是,ALGOL的设计催生了BNF(巴科斯-诺尔范式)——正是在描述ALGOL语法的过程中,约翰·巴科斯发明了这套影响深远的形式化语法描述方法。BNF将ALGOL的语法压缩成一套简洁的递归规则,这本身就是对Chomsky形式文法的致敬。
三、自然语言的压缩困境:有损压缩的本质
3.1 歧义性:不可消除的"有损"痕迹
编程语言的设计目标是消除歧义(ambiguity)——这是一种"无损压缩"的追求。但在自然语言中,歧义性是普遍存在的,有时甚至是不可或缺的。这正是自然语言作为认知压缩的"有损"特征。
句法歧义(syntactic ambiguity):"The chicken is ready to eat." 压缩后可以有两种解压缩方式——鸡肉煮熟了可以吃,或者鸡准备好自己去吃东西。这种歧义在自然语言中不仅无害,反而增加了表达效率。如果每句话都必须消除歧义,语言将变得冗长而笨拙。
词汇歧义(lexical ambiguity):"Bank"可以指银行或河岸。在"A river bank"中,压缩的信息需要上下文来解压缩——没有上下文,我们无法确定这个词的含义。这种多义性是自然语言压缩的代价:同一个符号,根据语境可以激活完全不同的概念网络。
语义歧义(semantic ambiguity):"Every student did not pass." 可以理解为部分否定(不是所有学生都通过了)或全部否定(所有学生都没通过)。这种压缩产生的歧义,需要语用推理(pragmatic inference)来消除——而这超出了形式文法的能力范围。
有损压缩不是缺陷,而是自然语言在认知资源约束下的最优策略。人脑在处理语言时,会自动利用语境和世界知识来"填补"丢失的信息,这种填补往往是下意识的、即时的。
3.2 上下文依赖:解压缩的语境绑定
自然语言的压缩效果依赖于语境——这是形式语言理论无法充分捕捉的另一个维度。同一句话在不同的语境中可能传达完全不同的含义,而听者必须依靠共享的背景知识和当下的交际情境来还原说者的真实意图。
考虑这个段落:"John gave Mary a book. She thanked him for it. The book was very interesting." 在这个语篇中,"it"指代"book"。但上下文无关文法只考虑单个句子内部的结构,无法处理这种跨句子的照应关系(anaphora)。解压缩这段话需要追踪前文提到的实体,建立代词与其先行词之间的关联——这超出了形式压缩的范围。
更复杂的例子是隐含因果关系的理解:"The dog bit the postman." 和 "The postman was bitten by the dog." 压缩了相同的事件,但预设的焦点不同——前者强调施事(agent),后者强调受事(patient)。这种语义差异需要世界知识来解压缩。
形式语言理论的处理单元是单个句子,而自然语言的压缩跨越句子边界,形成语篇层面的连贯(discourse coherence)。这种压缩需要话语层面的推理——这不是形式文法能够独立完成的任务。
3.3 递归的模糊性:无限表达的背后
Chomsky用递归(recursion)定义了语言的无限表达能力:有限的语法规则可以生成无限的句子。这个洞见对形式语言理论至关重要。
然而,自然语言的递归与编程语言的递归有本质的不同。编程语言的递归是良定义的:递归调用的深度是有限的,终止条件是明确的,计算资源是有上限的。但自然语言的递归往往是模糊的:嵌套从句可以有多深?一个句子可以有多少层修正?这些都没有形式化的边界。
这种模糊性是自然语言作为认知压缩的另一特征:递归的边界不是形式规则决定的,而是认知资源决定的。人类处理递归的能力受限于工作记忆(working memory)的容量——George Miller在1956年发表于《心理学评论》的实验研究中证明,这一容量大约为7加减2个组块(chunk)。这意味着,虽然形式上语言可以无限递归,但实际使用中,过深的嵌套会造成理解困难。
四、编程语言的启示:形式压缩的极限与突破
4.1 无歧义的要求:歧义破坏压缩的完整性
编程语言必须无歧义——这是因为歧义会破坏压缩的完整性。如果程序员写 x = y + z,编译器必须精确知道这是加法还是正号还是其他什么。歧义会导致编译失败,或者更糟糕的是——生成错误的行为。
这个要求揭示了编程语言与自然语言的本质分歧:编程语言追求"无损压缩",而自然语言接受"有损压缩"。在无损压缩中,信息可以完整地还原;在有损压缩中,丢失的信息需要依靠额外的信息(语境、常识)来填补。
1957年,约翰·巴科斯(John Backus, 1924-2007)设计FORTRAN时面临的核心问题是:如何让机器理解人类的指令?答案是,用形式规则消除自然语言中的歧义性和上下文依赖。程序员用接近数学的语法编写程序,编译器负责将这种精确的压缩形式还原为机器指令。
编程语言的历史,就是人类不断寻找"无损压缩"最优解的历史:如何用最少的符号,最精确地表达计算意图,同时保证机器能够完整还原程序员的本意。
4.2 类型系统:防止压缩失败的机制
类型系统(type system)是编程语言防止"压缩失败"的关键机制。在一个强类型的语言中,每个表达式都有一个类型,类型检查器确保操作符作用于兼容的类型。这类似于在压缩数据时附加校验位——确保解压缩能够正确还原原始信息。
例如,在Java中,int x = "hello"; 会导致编译错误——因为字符串无法赋值给整数类型变量。这种错误不是语法错误,而是类型错误:类型系统在编译阶段就检测到"压缩"后的信息在"解压缩"时无法正确还原。
Benjamin C. Pierce在其经典教材《类型与编程语言》(Types and Programming Languages, 2002)中指出,类型系统的引入是编程语言设计的一次重大突破。它将运行时错误提前到编译时检测,大幅减少了程序崩溃的概率。更重要的是,类型系统允许程序员用更抽象的方式思考程序——关注"是什么"而非"怎么做"。
4.2.1 LR(k)与LL(k)解析器:设计权衡的数学本质
解析器(parser)是编译器的前端,负责将Token流转换为抽象语法树(AST)。不同的解析算法有不同的能力范围,这可以用形式语言理论来刻画。
LR(k)解析器是最强大的确定性解析器。"L"表示从左到右扫描输入,"R"表示反向构造最右推导,"k"表示向前看k个Token。LR(k)解析器可以处理任何由上下文无关文法生成的语言,只要该文法是LR(k)的——即可以用 lookahead k 个Token来消除所有歧义。
经典的LR解析器包括LR(0)、SLR(1)、LALR(1)等变体。LALR(1)( lookahead LR with size 1)是大多数工业级编译器(如Yacc、Bison)使用的解析算法,能够高效处理C、Java等语言的语法。LR(k)解析的优点是:没有回溯,时间复杂度为O(n),其中n是输入长度。
LL(k)解析器是自顶向下的解析器,适用于"可预测"的语法。"L"表示从左到右扫描,"第二个L"表示从左到右构造推导,"k"表示向前看k个Token。LL(1)解析器常用于教学语言和小型DSL,其核心优势是实现简单、易于理解。
然而,LL(k)解析器有明显的局限:它要求语法是"无歧义的",且不能处理左递归。例如,左递归规则"Expr → Expr + Term"无法用LL解析器直接处理,需要转换为右递归形式。这一限制意味着某些自然语言结构无法用LL语法高效描述——这也是形式语言理论与NLP实践之间的张力之一。
4.2.2 Hindley-Milner类型系统:ML与Haskell的基础
在类型系统的发展历程中,Hindley-Milner类型系统(又称多态类型推导系统)是一个里程碑。1968年,罗杰·欣德利(Roger Hindley, 1938-)在论文"The Principal Type-Scheme of an Object in Combinatory Logic"中提出了这一框架,随后罗宾·米尔纳(Robin Milner, 1934-2010)证明了其完备性,并将其应用于ML语言(Meta-Language)。
Hindley-Milner系统的核心特征是参数化多态(parametric polymorphism):同一个函数可以作用于多种类型,而无需显式声明。例如,ML中的-identity函数:
fun id x = x (* identity function: works for any type *)
这个函数的类型是 ∀α. α → α(全称量化类型),表示"对任何类型α,函数接受α类型的值并返回该类型的值"。类型推导算法能够自动推断出这种多态类型,而无需程序员显式注解。
Hindley-Milner系统的另一重要特征是let多态(let-polymorphism):在let绑定中,变量可以被赋予多态类型。例如:
val x = [1, 2, 3] (* x is inferred to have type: int list *) val y = [x, x] (* y is inferred to have type: int list list *)
Hindley-Milner系统实现了"压缩"与"安全"的平衡:程序员可以用简洁的语法编写多态函数,编译器自动推导类型,确保运行时不会发生类型错误。这种自动化推导本身就是一种"智能压缩"——用更少的声明表达更多的约束。
4.2.3 强类型语言如何处理"有损压缩"
强类型语言通过类型系统来处理"有损压缩"问题。不同语言的策略各异:
Rust的所有权系统:Rust通过"借用检查器"(borrow checker)在编译时追踪内存的所有权关系。如果一段代码试图使用一个已被"移动"(move)到其他地方的值的引用,编译器会报错。这种机制防止了"压缩丢失"导致的内存安全问题。
Haskell的纯函数与惰性求值:Haskell通过引入"纯函数"概念,确保函数没有副作用。类型签名本身就包含了丰富的语义信息——例如,IO Int表示一个返回Int的I/O操作。这种类型级别的压缩,使得程序行为更容易推断和验证。
TypeScript的结构化类型:TypeScript采用"结构化子类型"(structural subtyping),类型兼容性基于结构而非名义。这使得TypeScript能够灵活处理来自JavaScript的"有损"类型信息——例如,从外部API接收的JSON数据,其类型可能不完全确定,但TypeScript仍能提供编译时检查。
4.3 领域特定语言:针对特定压缩需求的设计
领域特定语言(Domain-Specific Language, DSL)是为特定应用领域设计的专用语言,如SQL(数据库查询)、HTML/CSS(网页描述)、MATLAB(数值计算)、LaTeX(排版)。
DSL的设计者需要回答一个根本问题:如何在语言的表达力和易学性之间取得平衡?过于强大的语言会变得复杂难学,过于简单的语言又会限制表达能力。这个权衡与自然语言中的"丰富性vs可学性"争论有相似性。
以SQL为例:SELECT * FROM users WHERE age > 18; 这条语句用接近英语的语法,压缩了复杂的数据查询操作。用户不需要理解底层的数据结构、索引机制、连接算法——这些细节被SQL语言"压缩"掉了,程序员只需要表达"想要什么"。
这种"声明式"(declarative)的压缩哲学,与自然语言中的概念压缩有异曲同工之妙。当我们说"去超市买面包"时,我们压缩了"出门、走向超市、挑选面包、支付、回家"等一系列动作。SQL的SELECT语句同样是这种压缩思维的体现:描述目标,而非路径。
4.4 自然语言处理的困境:无法克服的有损压缩
形式语言理论在自然语言处理(Natural Language Processing, NLP)中的应用揭示了一个持续的困境:形式文法能够描述编程语言的语法,但无法完全捕捉自然语言的复杂性。NLP的发展史,就是一部不断尝试、不断碰壁、不断转向的历史。
1980年代是形式语言学派的黄金时代。基于Chomsky理论的NLP系统主导了学术研究。这些系统使用手工编写的语法规则,分析输入句子的句法结构,然后进行语义解释。然而,规则派的局限性很快暴露出来:手工编写规则的代价极高、规则脆弱、跨语言迁移困难。
1990年代:统计革命。1990年,IBM的彼得·布朗(Peter F. Brown, 1955-)团队在《计算语言学》期刊上发表了开创性论文,发起了统计革命。统计翻译模型完全绕过了句法分析:收集大量双语语料,统计词汇对齐的概率分布,给定输入,利用统计信息生成最可能的翻译。1993年,肯尼斯·丘奇(Kenneth Church, 1955-)与罗伯特·默瑟(Robert Mercer, 1946-)为《计算语言学》期刊编辑了关于大规模语料库方法的特刊导言,标志着统计方法在NLP领域的影响力日益增长。统计方法逐渐占据上风,并在1990年代末主导了整个NLP领域。
量化数据:统计方法的性能。在1990年代,基于统计方法的机器翻译系统逐渐取代了规则系统。以NIST MT评估为例,1999年的MT系统BLEU分数约为0.18(满分1.0),到2003年提升至0.34。早期的统计机器翻译系统(如IBM Model 1-5)在句子级别翻译尚可,但无法处理长距离依赖和语序调整问题。
2000年代:机器学习的深化。统计方法的成功催生了更复杂的机器学习模型。支持向量机(SVM)、条件随机场(CRF)、最大熵模型等方法被广泛应用于词性标注、命名实体识别、句法分析等任务。这些方法的共同特征是:用人工设计的特征(feature engineering)将语言现象转化为数值向量,再用统计模型学习分类边界。特征工程本身就是一种压缩——研究者需要判断哪些语言信息是"有用的",哪些可以丢弃。
量化数据:传统ML方法的准确率。在Penn Treebank词性标注任务上,条件随机场(CRF)的准确率约为97%(1998年)。命名实体识别(NER)任务上,基于特征的CRF模型F1值约为89%(2003年)。然而,这些方法依赖人工设计的特征,难以捕捉语言的深层语义结构。
2017年:Transformer的出现。2017年,谷歌团队发表了"Attention Is All You Need"一文,提出了Transformer架构。这一架构彻底改变了NLP的技术路线。Transformer的核心创新是自注意力机制(self-attention):模型不再按顺序处理文本,而是同时关注输入序列中所有位置之间的关系。这种并行处理方式使得模型能够捕捉长距离依赖关系——而这正是形式文法长期难以处理的问题。从压缩的视角看,Transformer学会了一种新的压缩方式:将整个句子的上下文信息压缩进每个词的向量表示中。
量化数据:Transformer带来的性能飞跃。在WMT14英语-德语翻译任务上,Transformer基线模型达到28.4 BLEU(相比上一代最好的RNNseq2seq模型提升超过2 BLEU)。到了2018年,"Attention Is All You Need"论文中的大型模型将BLEU分数提升至41.8。在GLUE基准测试(涵盖9项NLU任务)上,BERT-Large在2018年达到80.5%(远超基于特征的基线方法的69%)。这些数据证明了Transformer架构在学习语言表征方面的巨大优势。
当前:大语言模型对形式语言理论的挑战。基于Transformer的大语言模型(GPT、BERT等)在几乎所有NLP基准测试上取得了突破性成绩。这些模型没有显式的语法规则,没有Chomsky层级的概念,却能生成语法正确、语义连贯的文本。这对形式语言理论提出了根本性的挑战:如果一个没有形式文法的系统能够"掌握"语言,那么形式文法对于理解语言究竟有多重要?2021年,本德(Emily M. Bender, 1973-)等人在"On the Dangers of Stochastic Parrots"一文中提出了尖锐的批评:大语言模型的"流利"输出可能只是统计模式的复现,而非真正的语言理解。这场争论至今未有定论,但它迫使我们重新思考:语言的本质究竟是形式结构,还是统计规律,还是两者兼而有之?
五、大模型时代的启示:重新审视压缩的关系
5.1 大语言模型与压缩的统一
2020年代,大语言模型(Large Language Model, LLM)的兴起为编程语言研究带来了新的可能性。GitHub Copilot、ChatGPT等工具可以根据自然语言描述生成代码,引发了关于"程序员是否会被AI取代"的广泛讨论。
从压缩的视角看,LLM代表了自然语言与编程语言融合的一种可能:通过大规模训练,LLM学会了将自然语言的"有损压缩"映射为编程语言的"无损压缩"。当用户说"写一个函数来排序列表",LLM将这个模糊的指令"解压缩"为精确的代码实现。
然而,LLM生成的代码面临一个根本挑战:如何保证正确性?自然语言描述往往是模糊的、歧义的,同一个描述可能对应多种不同的实现。例如,用户说"按时间排序",但没有说明是升序还是降序,也没有说明时间戳的格式。这种歧义性正是自然语言作为有损压缩的体现。
5.2 神经符号编程:两种压缩的融合
未来的编程语言可能会更加智能化,能够自动理解和处理模糊的自然语言描述。一个重要的发展方向是"神经符号编程"(neuro-symbolic programming):将神经网络的模式识别能力与符号系统的推理能力结合起来。
这种混合方法可能能够同时处理自然语言的歧义性和编程语言的精确性:神经网络负责处理"有损压缩"的不确定性,符号系统负责验证"无损压缩"的正确性。类型系统、形式验证(formal verification)、程序分析等技术,可以用来检查LLM生成的代码是否符合规范。
另一个方向是"意图编程"(intent-based programming):用户用自然语言描述目标,系统自动生成实现。这种愿景早在1960年代就被提出,但直到大语言模型时代才看到实现的可能。从压缩的视角看,意图编程是让机器学习如何将"有损压缩"(自然语言描述)转换为"无损压缩"(精确代码)的过程。
大语言模型的出现,模糊了两种压缩的边界。LLM能够将自然语言描述转换为精确代码,但这种转换是不稳定的——因为自然语言的有损压缩无法被完全消除。在这个意义上,编程语言对人类语言的模仿,永远只能是部分的、近似的。
六、结语:认知压缩的最优解
编程语言对人类语言的模仿,揭示了形式压缩的极限与自然语言压缩的智慧。Chomsky的语类阶层证明了不同形式文法有不同的压缩能力——正则文法最弱但最高效,上下文无关文法更强但代价更高,递归可枚举语言对应计算的终极边界。
自然语言的压缩是有损的——歧义性、上下文依赖、递归的模糊性,都是这种有损压缩的特征。但这并非缺陷,而是在认知资源约束下的最优策略。人脑能够在实时处理中利用语境和常识"填补"丢失的信息,这种能力是自然语言作为认知压缩工具的核心优势。
编程语言必须追求无损压缩——歧义会破坏压缩的完整性,导致编译失败或错误行为。类型系统、形式验证、编译时检查等技术,都是为了确保这种完整性。从FORTRAN到Java,从BNF到类型系统,编程语言的设计者一直在探索如何在保持表达力的同时实现无损压缩。
形式语言理论揭示的,不是语言的边界,而是认知压缩的可能性边界。在这个边界内,人类语言找到了最优解:用有损压缩实现最大化的表达效率。这个洞见,或许比任何编程语言的设计都更深刻。
七、下期预告
数学公式是语言吗?Part 12-1 将探讨数学符号系统的起源与特征——弗雷格、罗素如何将数学语言从自然语言中分化出来,形式系统如何实现更高的压缩精度。
八、参考文献
[1] Chomsky, N. (1956). "Three Models for the Description of Language." IRE Transactions on Information Theory, 2(3), 113-124.
https://doi.org/10.1109/TIT.1956.1056813
[2] Chomsky, N. (1957). Syntactic Structures. Mouton Publishers, The Hague.
https://doi.org/10.1515/9783112316009
[3] Backus, J. W. (1959). "The Syntax and Semantics of the Proposed International Algebraic Language of the Zurich ACM-GAMM Conference." Proceedings of the International Conference on Information Processing, UNESCO, 125-131.
https://www.softwarepreservation.org/projects/ALGOL/paper/Backus-Syntax_and_Semantics_of_Proposed_IAL.pdf
[4] Miller, G. A. (1956). "The Magical Number Seven, Plus or Minus Two: Some Limits on Our Capacity for Processing Information." Psychological Review, 63(2), 81-97.
https://doi.org/10.1037/h0043158
[5] McCarthy, J. (1960). "Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I." Communications of the ACM, 3(4), 184-195.
https://doi.org/10.1145/367177.367199
[6] Knuth, D. E. (1964). "Backus Normal Form vs. Backus Naur Form." Communications of the ACM, 7(12), 735-736.
https://doi.org/10.1145/355588.365140
[7] Kiparsky, P. (1993). "Paninian Linguistics." In R. E. Asher (Ed.), The Encyclopedia of Language and Linguistics. Pergamon Press, 2918-2923.
https://web.stanford.edu/~kiparsky/Papers/paninian.pdf
[8] Aho, A. V., Sethi, R., & Ullman, J. D. (1986). Compilers: Principles, Techniques, and Tools. Addison-Wesley. ISBN: 0-201-10088-6.
https://doi.org/10.5555/6448
[9] Brown, P. F., Cocke, J., Della Pietra, S. A., Della Pietra, V. J., Jelinek, F., Lafferty, J. D., Mercer, R. L., & Roossin, P. S. (1990). "A Statistical Approach to Machine Translation." Computational Linguistics, 16(2), 79-85.
https://aclanthology.org/J90-2002/
[10] Church, K. W. & Mercer, R. L. (1993). "Introduction to the Special Issue on Computational Linguistics Using Large Corpora." Computational Linguistics, 19(1), 1-24.
https://aclanthology.org/J93-1001/
[11] Pierce, B. C. (2002). Types and Programming Languages. MIT Press. ISBN: 0-262-16209-1.
https://doi.org/10.7551/mitpress/6946.001.0001
[12] Hopcroft, J. E., Motwani, R., & Ullman, J. D. (2006). Introduction to Automata Theory, Languages, and Computation. 3rd Edition. Addison-Wesley. ISBN: 0-321-45536-3.
https://doi.org/10.5555/1177300
[13] Vaswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez, A. N., Kaiser, L., & Polosukhin, I. (2017). "Attention Is All You Need." Advances in Neural Information Processing Systems, 30.
https://doi.org/10.48550/arXiv.1706.03762
[14] Bender, E. M., Gebru, T., McMillan-Major, A., & Shmitchell, S. (2021). "On the Dangers of Stochastic Parrots: Can Language Models Be Too Big?" Proceedings of the 2021 ACM Conference on Fairness, Accountability, and Transparency (FAccT), 610-623.
https://doi.org/10.1145/3442188.3445922
[15] Hindley, R. (1968). "The Principal Type-Scheme of an Object in Combinatory Logic." Proceedings of the American Mathematical Society, 20(1), 21-28.
https://doi.org/10.2307/2045965
[16] Milner, R. (1978). "A Theory of Type Polymorphism in Programming." Journal of Computer and System Sciences, 17(3), 348-375.
https://doi.org/10.1016/0022-0000(78)90014-4
[17] Papadimitriou, C. H. (1994). "Computational Complexity." Addison-Wesley. ISBN: 978-0201530827.
[18] Sutskever, I., Vinyals, O., & Le, Q. V. (2014). "Sequence to Sequence Learning with Neural Networks." Advances in Neural Information Processing Systems, 27.
https://doi.org/10.48550/arXiv.1409.3215
