许多语言学家仍然忙于重建单一的原始语言,据推测,这种语言经过无数千年的演变,成为了数千种人类语言——活的和死的,口语的和书面的——这些语言后来被编目和分析。1 已知语言和方言的惊人多样性和复杂性,乍一看,似乎与这种单一的种子相矛盾。
然而,许多人从巴别塔的故事中找到了深刻的神话印证:“那时,天下人的口音、言语,都是一样。”(创世纪 11:1)。 并且,具有重要的计算机理论意义的是,请注意耶和华如何颠覆了这个世界语的天堂,并发起了他的语言之战:以狂怒的、非结构化的“GOTO!”开头,随后是“我们下去,在那里变乱他们的口音,使他们的言语彼此不通。”(创世纪 11:7)。 然而,其他人,尤其是迪杰斯特拉,认为这个 GOTO 是来自地狱的指令。2
说到“结构”(带着尊敬的大写 S),我们转向语言学理论的一个主要里程碑,这似乎与巴别塔的说法相悖。我指的是费尔迪南·德·索绪尔于 1916 年 posthumously 出版的《普通语言学教程》。讽刺再次发生。 这部被认为是结构语言学和符号学起源的著作,是从他的学生巴利和塞谢伊的零散讲义中拼凑而成的。3 为了简短地概括人类最复杂的一本书,索绪尔著名的要点是“能指和所指之间关联的本质任意性”——也就是说,能指(例如词语)和它们所指的对象之间。 因此,单词 tree 并没有特别像树的特征,甚至它的法语等价物 arbre 也没有。 您可能会提出拟声的异议,对此我说:法国猫不“purr”,它们“ronron”; 法国鸭子“ne quackent pas”,它们更喜欢“faire coin-coin”。
索绪尔的论点,现在已被普遍认可(不可避免地存在变化和改进),可以用来质疑是否曾经存在过一个原始词汇表,我们当前的“巴别塔”从中涌现。 许多语言确实属于看似合理的语系和语族。 事实上,比较语言学的诞生可以追溯到成功地为印欧语系(IE)超语系建立分类法。 虽然印欧语系成员分布广泛(英语,或者更确切地说是各种英语,已确立为国际话语的主导),但仍有大约 4,000 多种或多或少现存的非印欧语系语言。
将这些语言分组为越来越大的语系被证明是一项相当可疑的练习,因为在构建书面证据很少或没有的原始语言时,涉及许多“创造性”(如“创造性会计”)的猜测。 基于形状和声音的纯粹巧合的异想天开的跳跃永无止境。 即使在后代语言中发现相同的词根,也不意味着该词存在于原始母语中。 正如贾雷德·戴蒙德指出,“考古学家[不公平地?]对语言学家试图重建母语持怀疑态度,他们喜欢引用像‘可口可乐’这样的词,这些词在许多现代欧洲语言中通用。”4
我的读者更关心的是自然语言(NL)和所谓的编程语言之间的互动。 我之所以说“所谓的”,是因为许多语言学家认为编程“语言”是自大爆炸以来最离谱的误称(我狭隘地将大爆炸追溯到 1949 年,当时剑桥 EDSAC I
通过列出数百个随机数字,通过了完美的基准测试!)。 然而,无论我们是否喜欢,我们都陷入了在一个新语境中使用“语言”这个词:旨在精确控制机器的、具有人为“冻结”语法的符号序列。 这种用法并非完全是新的。 伽利略暗示了运行我们宇宙的柏拉图式算法:“如果一个人不理解宇宙这本书的语言,即数学语言,他就无法阅读这本书。”
我们面临着熟悉的、虚假的二分法:模糊、歧义的自然语言与精确、明确的数学符号和公理。 大卫·洛格·帕纳斯在 1972 年解释他的模块规范技术时,当时软件工程正以令人眼花缭乱的热情兴起,他强调,“应该清楚的是,虽然我们不能使用自然语言规范,但我们不能在没有自然语言解释的情况下进行管理。 对于我们大多数人来说,任何形式化的结构都是一个空壳,如果没有对其预期解释的描述。”5 在这里,我想补充说明动机的必要性。 (数学阐述中存在熟悉的欧拉-高斯文体差距:欧拉慷慨地展示了他的证明中的动机和中间论证。 高斯更喜欢直截了当的步骤序列,就好像在说,“跟着我,笨蛋!”)
帕纳斯走向相反的方向,从自然语言到
形式化,当为标识符选择名称时:“……如果一个人使用具有高助记价值的名称,读者和作者都倾向于变得草率,并使用助记名称所暗示的预期解释来回答应该由形式语句回答的问题。”6
在早期的“非扩展”Basic 时代,人们几乎没有机会构思令人难忘的、自我解释的标识符名称。 A$ 当然是一个字符串,可能是员工的名字,而她的总工资是整数 A(以美分为单位)! 后来匈牙利入侵来了,提醒我们 szTring 既看起来又听起来像一个匈牙利字符串!
因此,帕纳斯警告不要使用 gross_pay、deductions 和 net_pay。 但是,如果代码读取
net_pay := gross_pay + deductions;
该相信谁呢?
另一方面,编辑爱德华·尤尔登本人承认,他“经常对”一页又一页地阅读帕纳斯的斯巴达式模块感到“眼花缭乱”。 后者坚持帕纳斯的另一项结构化约束:“避免冗余。 规范应该准确地告诉程序员他们需要什么——不多也不少。”
既然我们别无选择,那么挑战就是使我们的自然语言陈述尽可能明确……无论这意味着什么。
“消除歧义”不仅仅是将逗号和撇号放在“正确”的位置。 当然,正如许多正确标点符号指南所指出的那样,错放的逗号和连字符可能会使作者的意图产生一些疑问。 林恩·特拉斯在她出乎意料的畅销书《Eats, Shoots & Leaves》中,以畅销的幽默方式传达了这一信息,但她的例子非常牵强,并且忽略了日常话语中最重要的语境问题。7 汉克·哈内格拉夫,CRI(基督教研究所)的《圣经解答人》,提醒我们,“脱离语境的文本仅仅是借口。” 特拉斯讨论的标点符号确实非常现代,她规范化的许多规则是排版员和规范语法学家做出武断决定的结果。 正如杰夫·拉斯金指出的那样,当引号用于定义计算机语言中的字符串时,将句号和逗号放在引号内的美国规则可能非常危险。8
人们可以怀着狂野的猜测回顾到书面语言不仅在没有标点符号的情况下,而且实际上在没有分隔符来指示单词或句子从哪里开始和结束的情况下应对的时代。 而且,特别具有挑逗性的是,由于主要的 theological 含义,最早的新约希腊语手稿是用 scripta continua 写成的,其中 uncial 字母“一个词接一个词,一句接一句地连续运行,没有中断,阅读辅助工具极少。”9 想知道(或关心!)特拉斯的熊猫在做什么是一回事,但在马可福音 10:40 中面对长串不间断的希腊语大写字母又是另一回事。 该字符串可以分为两种不同的方式,每种方式都给出两种完全不同的含义。 两种解释(allois 或 all ois)可能会影响西庇太的儿子雅各和约翰未来在天堂的座位安排。
在精彩的 Web URL 世界中,经常会出现陈腐的例子。 最近的一个例子是一家名为 Expressions Exchange 的公司,贸然建立了一个可以解析为 expression-sex-change.com 的 URL。
歧义真正危险的根源潜伏得更深。 多义性(多种含义10)并不总是从语境中显而易见的。 事实上,作者可能不如读者更了解他们产生的词语的语义范围。 我敢提醒您,关于那些表面上明确的词语,如 same、some、all、if、and,尤其是 is,已经流了很多血。
拉斯金正确地敦促程序员避免歧义,并在所有写作中培养可读性(优雅性可获得额外分数)。 在为计算机编码的情况下,有编译器和解释器来“强制执行”规则,然而,这些规则反过来又基于编译器编写者如何解释[原文如此]声称代表计算机语言设计者或标准委员会意图的自然语言文档。 我们无法逃脱自然语言的艰巨挑战——它真的是我们拥有的唯一语言,并且具有主要的递归怪癖(向一些乔姆斯基“形式主义者”致敬),即自然语言必须使用自然语言来描述。
1. 人们很想滥用 Panglossian 这个术语,尽管它在词源上很有吸引力[通用语言],但它已经变成了伏尔泰作品《老实人》中潘格洛斯角色的追随者的意思,这部作品是对莱布尼茨乐观主义的尖锐讽刺:“一切都是为了所有可能世界中最好的世界。”
2. Dijkstra, E. W. 1968. GOTO 语句被认为是有害的。 Communications of the 11(3 月): 147-148.
3. Harris, R. 1991. 阅读索绪尔——对《普通语言学教程》的批判性评论。 La Salle, Illinois: Open Court.
4. Diamond, J. 1992. 第三种黑猩猩——人类动物的进化和未来。 New York: HarperCollins.
5. Parnas, D. L. 1972. 带有示例的软件模块规范技术。 Communications of the 15 (5 月)。 重印并附有编辑评论,见《革命著作——软件工程精选读物》,编辑:E. Yourdon。 1982. New York: Yourdon Press.
6. 参见参考文献 5。
7. Truss, L. 2004. Eats, Shoots & Leaves. New York: Gotham Books.
8. Raskin, J. 2004. 因为一个逗号的缺失,含义丢失了。 2 (5 月): 14-16.
9. Aland, K., 和 B. Aland. 1987. 新约圣经文本。 E. F. Rhodes 译。 Grand Rapids: William B. Eerdmans.
10. 自然语言相当于 OOPS(面向对象编程)多态性。 英语中多义性记录似乎由单词 set 保持。 考虑到集合论在数学中的基础作用,这非常令人震惊。 哈尔莫斯经典著作《朴素集合论》早在 Trussed 连字符成为惯例之前就已问世。
喜欢它,讨厌它? 让我们知道
[email protected] 或 www.acmqueue.com/forums
斯坦·凯利-布特尔 (http://www.feniks.com/skb/; http://www.sarcheck.com),出生于英国利物浦,在 20 世纪 50 年代在剑桥大学攻读纯数学,之后在开创性的 EDSAC I 上研究了计算机科学的杂质。 他的许多著作包括《魔鬼的 DP 词典》(McGraw-Hill,1981 年)和《理解 Unix》(Sybex,1994 年)。 以他的艺名斯坦·凯利,他还享受着作为歌手和词曲作者的平行职业生涯。
© 2004 1542-7730/04/1200 $5.00
最初发表于 Queue vol. 2, no. 9—
在 数字图书馆 中评论这篇文章
马特·戈德博尔特 - C++ 编译器中的优化
在为编译器提供更多信息方面需要权衡:这会使编译速度变慢。 诸如链接时间优化之类的技术可以使您两全其美。 编译器中的优化不断改进,即将到来的间接调用和虚拟函数分派方面的改进可能很快会带来更快的多态性。
乌兰·杰根巴耶夫,迈克尔·利普奥茨,汉内斯·帕耶 - 作为合资企业的垃圾回收
跨组件跟踪是一种解决跨组件边界的引用循环问题的方法。 只要组件可以形成具有跨 API 边界的非平凡所有权的任意对象图,就会出现此问题。 CCT 的增量版本已在 V8 和 Blink 中实现,从而可以安全有效地回收内存。
大卫·奇斯纳尔 - C 不是低级语言
在最近的 Meltdown 和 Spectre 漏洞之后,值得花一些时间来研究根本原因。 这两个漏洞都涉及处理器推测性地执行超出某种访问检查的指令,并允许攻击者通过侧信道观察结果。 导致这些漏洞以及其他几个漏洞的功能被添加进来,是为了让 C 程序员继续相信他们正在用低级语言编程,尽管这种情况已经过去几十年了。
托比亚斯·劳因格,阿卜杜勒贝里·查巴内,克里斯托·威尔逊 - 你不应该依赖我
大多数网站都使用 JavaScript 库,其中许多库已知存在漏洞。 了解问题的范围以及包含库的许多意外方式,只是改进情况的第一步。 这里的目标是,本文中包含的信息将有助于为社区提供更好的工具、开发实践和教育工作。