编程行业中一个持久的经验法则是 80/20 法则:“80% 的有用工作是由 20% 的代码完成的。” 与汽油里程一样,您的性能统计数据可能会有所不同,并且考虑到诸如拇指之类的身体部位的测量上的随意性(除非您将法式英寸 pouce 视为精确的非度量英寸),您可能更喜欢 90/10 的劳动分配。对于一些臃肿的代码生成元框架,愤世嫉俗者建议采用 99/1 法则——如果您能找到那忙碌的 1%。无论比例如何,这个概念已被证明在性能调优中非常有用。
在自然语言(NL)中存在一个有趣的类比。例如,在英语中,通过计算《牛津英语词典》(OED) 中那些具有盎格鲁-撒克逊词根的词条,已经找到了相当精确的 99/1 分割。您会意识到,英语以肆无忌惮地从其他语言借用词汇而(臭名昭著),但借用的程度可能会让您感到惊讶。我们当前词汇中只有 1% 是真正“本土”的古英语,来自公元 500-700 年左右,即使是那种语言也是掠夺性的古诺斯语和其他日耳曼语的复杂混合体,并带有色彩鲜艳的本土凯尔特语的点缀。然而,更令人吃惊的事实是,这 1% 的本土衍生词构成了日常用语的约 60%。您可能已经猜到原因了,除了许多常见的名词,如斧头、盾牌和血液(使《贝奥武夫》生动起来!)之外,大多数简短而常用的词,如 the、a/an、I/me、if、and、but 和 not,都起源于盎格鲁-撒克逊语!
构成《牛津英语词典》(OED) 中另外 99% 的借用和同化词汇反映了诺曼法语和拉丁语的主要影响,并因塞缪尔·约翰逊注意到和嘲笑的大量人为“墨水瓶词汇”而膨胀。这些词汇是由精英学者从古典希腊语和拉丁语词根中创造出来的,他们鄙视地位低下的农民盎格鲁-撒克逊语。因此,富人航行(navigated),而穷人仅仅是航行(sailed)。我在这里松散地使用了“借用”一词。通过接触和通婚实现的语言演变过程要复杂得多,并且涉及微妙的语法交流以及词汇共享。
我们能否将编程劳动分工规则的好处转移到自然语言(NL)论述中?如果我们能够通过找到和改进更高效的例程来更好地调整系统性能,我们是否不应该更多地关注我们词汇中那个活跃的 1%,它主导着我们的词频图表?
我提醒您注意两个动机。首先,迪克斯特拉呼吁自然语言(NL)的掌握应该先于您的编程语言课程。其次,杰夫·拉斯金的论点是“注释比代码更重要。”1 虽然有点拉斯金式的玩笑,但他的信息实际上是:“彻底使用内部文档是提高软件质量和加速实现的最被忽视的方法之一。” 这种说法很难证伪,并且带有足够的平淡无奇的推诿,让人想起彼得·费尔格特的“煮至熟透”通用菜单:“在一个干净的盘子里,放入干燥的配料,然后加入液体,直到获得合适的稠度。倒入合适的容器中,煮至熟透……”2
IT 等价物是“按下相应的键”,或“为手头的任务组建尽可能最好的程序员团队”。
我对这场争论的贡献是 YACC(又一个注释编译器)3,这是一种极其极端的解决方案,它忽略您的代码并编译您的注释。例如,在第一步中,YACC 转换
i++; // post-increment counter by 1
to
post-increment counter by 1 // i++;
第二步仍在开发中。
逻辑论述(因此,编写代码)必不可少的基本词汇,如 if、and、or 和 not,确实是盎格鲁-撒克逊语,并且已经经历了几个世纪的诠释。我提议进行长期研究的词是 but。这个看起来无辜的标记主要用作连词,分隔两个对比的从句:“我喜欢 Algol 但讨厌 Fortran。” 这种结构非常普遍,有时隐藏在近同源词 yet 和 however 之下。但是,4 but 也可以用作介词,意思是 except 或 excluding。因此,“我喜欢所有语言,除了 Fortran。”
but 的合理使用应排除不相关从句的连词,如“我喜欢巧克力但讨厌 Fortran”。有时,在更仔细的解析后,您可能会发现一个句子断言“p but not-p”,这有点像通过用“是和否”来回答问题来对冲您的赌注。人们通常可以在自然语言(NL)修辞中为这种情况辩护,因为命题可能缺乏二元真值(“Fortran 很糟糕!”),但在其他地方,人们无法逃脱排中律的严格性:p 和 not-p 中只能有一个为真(另一个为假),即使某些逻辑允许无法证明哪个是哪个5。
所有这些可能解释了为什么 but 在您的注释中很有用,但在您的代码中却作为逻辑关键字而缺失。一个罕见的例外是我自己的 LEGOL 语言6,它使用 #include 指令的变体
#including_but_not_limited_to
LEGOL 在简洁性方面有所欠缺,但在反映了几个世纪痛苦的法理学的精确性方面有所弥补。因此,草率的声明
int i = 1;
被呈现为
特此声明并承认:在此创建的新对象在此命名并称为 i,其范围由先前提交的命名空间专利的优选实施例确定,该专利在此通过引用并入,并且进一步地,i 是声明为已知且被广泛认可为整数的类型,它应立即毫不迟疑地被分配和分配 ne quid nimis 值 1(一),并且应在 sub tegmine fagi 下保留该值,直到任何时候,类型安全(提升)法案管辖范围内的某个其他值可能被分配和分配给它为止。
您也可以争辩说,XOR 带有 but 的灵魂,如“A XOR B”,意思是“A OR B BUT not BOTH”。这个 but 实际上是一个 and,让我想起了那个可怜的家伙,他的汽车被盗了,但他的保险索赔被拒绝了。保单涵盖火灾 AND 盗窃,但无法证明发生火灾。我个人最喜欢的布尔特性是 A 与非 B (A XAND B),定义为“A AND B but not BOTH”。
最后,我必须感谢许多读者回复了我的专栏“Anything Su Doku I Can Do Better”(,2005年12月/2006年1月)。Paul Eggert (GNU Prolog)、Peter Klammer (VB6) 和 Marc Auslander (C++) 提供了解决该谜题的程序。Bjarne Stroustrup 发来了评论,其他人则指出了唐纳德·克努特对该问题的贡献。毫无疑问,暴力回溯在理论上可以解决所有数独谜题。报纸上出现的“结构良好”的谜题有 25 个或更多线索和一个唯一解,读者的程序可以快速解决这些谜题。开放的计算机科学问题,将我们拖入 P-NP 难题,是如何处理“结构不良”的谜题。给 Eggert 的程序一个空网格(没有线索),它将生成所有 1021 个(大约!)答案,前提是宇宙运行足够长的时间并且纸张供应充足。问
斯坦·凯利-布特尔 (http://www.feniks.com/skb/; http://www.sarcheck.com) 出生于英国利物浦,在 20 世纪 50 年代在剑桥大学攻读纯数学,之后在先驱 EDSAC I 上研究了不纯粹的计算机科学。他的许多著作包括《魔鬼的 DP 词典》(McGraw-Hill,1981 年)和《理解 Unix》(Sybex,1994 年)。《软件开发杂志》授予他首届斯坦·凯利-布特尔电子技术奖年度奖项,以表彰他在“技术和文学领域的终身成就”。诺贝尔和图灵都没有获得如此珍贵的同名认可。在他的艺名斯坦·凯利下,他还作为歌手和词曲作者享受着平行的职业生涯。
最初发表于《Queue》杂志第4卷第2期—
在 数字图书馆 中评论本文