一百年后,人类怎样编程?转:一百后
2021-07-23
一百年后,人类将如何编程?转:一百年后,人类如何编程? 2011 年 3 月 30 日 13:37:35 一百年后的人类生活很难预测,只有少数事情是确定的。到时候汽车就有了低空飞行的能力,城市规划规定会放宽,楼房可以建上百层,大街上整天都看不到太阳,所有的女人都学会了自我-防御。本文只想讨论一个细节:一百年后,人们将使用什么语言来开发软件?为什么这个问题值得思考?原因不是我们最终会使用这些语言,而是幸运的话,从现在开始我们将能够使用这些语言。我认为编程语言就像生物物种。有一个进化背景。许多分支最终将成为进化的死胡同。这种现象已经发生了。该语言流行了一段时间,但似乎没有后续语言继承其思想。就像尼安德特人一样,进化之路走到了尽头。我预测 Java 也会这样做。有人写道:“你怎么能说Java不会成功?它已经成功了。”我认为这取决于您的成功标准。如果标准是相关书籍的出版数量,或者认为学习Java可以找到工作的大学生数量,那么Java确实成功了。当我说Java不会成功时,我的意思是它和那个一样,进化之路已经走到了尽头。
这只是我的猜测,可能不正确。这里的重点不是看Java,而是建议编程语言有一个进化的上下文,从而引导读者思考某种语言在整个进化过程中的位置在哪里?提出这个问题,不是为了让后人感叹我们一百年这么聪明,而是为了找到进化的脊梁。它会激励我们选择接近主干的语言,这对当前的编程是最有利的。在任何时候,选择进化的主干都可能是最好的解决方案。如果您不幸选择了错误的人并成为尼安德特人,那就太糟糕了。你的对手克鲁马努会不时攻击你并偷走你所有的食物。这就是为什么我想在一百年后找出编程语言。我不想下错赌注。编程语言的进化与生物的进化还是有区别的,因为不同分支的语言会趋同。例如,该分支似乎与 的继任者会合。理论上,不同的生物物种也可能会汇合,但可能性非常低,所以很可能从来没有真正发生过。编程语言可能有聚合的一个原因是它的概率空间比较小,另一个原因是它的变异不是随机的。语言设计者总是有意识地借鉴其他语言的设计思想。对于语言设计者来说,识别编程语言的进化路径特别有用,因为这样他们就可以相应地设计语言。这时,认清进化的主心骨,不仅有助于识别现有的优秀语言,还可以作为设计语言的指南。
任何编程语言都可以分为两大组成部分:一组基本操作符(起到公理的作用)和除操作符以外的其他部分(原则上这部分可以用基本操作符表示)。我认为基本运算符是语言长期存在的最重要因素。其他因素不是决定性的。这有点像买房子首先要考虑地段。其他地方的问题以后会有办法弥补,但地理位置不能改变。仔细选择公理是不够的,但要控制其规模。数学家总是认为公理越少越好,我认为他们已经达到了这一点。您仔细检查语言的核心并考虑可以丢弃哪些部分。这至少是一个非常有用的培训。在我漫长的职业生涯中,我发现冗余的代码会导致更多的冗余代码。不仅是软件,像我这种懒惰性格的人,我发现这个命题在床底下和房间角落里也是有效的。一块垃圾会产生更多的垃圾。我的判断是,只有那些内核最小、最干净的编程语言才会存在于进化的主干上。语言的核心设计得越小越干净,它的生命力就越顽强。当然,猜测人们一百年后会使用什么编程语言本身就是一个很大的假设。也许一百年后,人类将不再编程,或者不再告诉计算机他们想要做什么,而计算机将自动执行。然而,到目前为止,计算机智能并没有取得太大进展。
我想一百年后,人们仍然会使用相同的程序来控制计算机。今天可能有一些问题需要我们编程来解决,那个时候也不需要编程,但是我想会有很多和今天一样的编程任务。您可能认为只有自以为是的人才能预测一百年后的技术。但是,请不要忘记,软件开发的历史已经走过了 50 年。在过去的 50 年里,编程语言的进化非常缓慢,所以期待一百年后的语言并不是一个徒劳的想法。编程语言进化缓慢的原因在于它们不是真正的技术。语言只是一种书写方式,而程序则是一种严格遵守规则的描述,以书面形式记录计算机应该如何解决您的问题。因此,编程语言的进化速度更像是数学符号的进化速度,而不是现实技术(例如交通或通信技术)的进化速度。数学符号的演变是缓慢的渐进变化,而不是真正技术的跨越式发展。不管一百年后计算机会是什么样子,我们基本上可以得出结论,它们会运行得更快。如果摩尔定律仍然成立,一百年后,计算机的速度将是现在 18 倍的 74 倍 10 倍(准确地说是 73 786 976 294 838 206 464 倍)。很难想象。但实际上,更现实的预测并不是速度会提升这么多,而是摩尔定律最终不会成立。
不管是什么,如果每18个月翻一番,最后很可能会达到极限。但毫无疑问,当时的计算机比现在快得多。即使最终只快了 100 万倍,它也会从根本上改变编程的基本规则。如果其他条件不变,现在被认为慢(也就是效率不高)的语言,未来会有更大的发展空间。届时,仍然会有一些应用程序需要高运行速度。我们希望计算机解决的一些问题实际上是计算机本身造成的。例如,计算机处理视频的速度取决于生成这些视频的另一台计算机。此外,还有一些问题需要无限快的处理能力,比如图像渲染、加解密、模拟运算等。由于现实中有些应用程序本身效率较低,而其他应用程序会耗尽硬件提供的所有计算能力,那么拥有更快的计算机意味着编程语言必须处理更极端的情况,涵盖更广泛的效率要求。我们已经看到这种情况发生。如果按照几十年前的标准来衡量,一些用新语言开发的流行应用程序会非常惊人地浪费硬件资源。编程语言不光有这种现象,其实是大势所趋。随着科技的发展,每一代人都在做上一代人觉得浪费的事情。 30 年前的人们看到我们今天这么随意地打长途电话会感到震惊。
100年前的人,如果看到一个普通的包裹,还可以享受从波士顿寄出,经过孟菲斯,一天到达纽约的待遇,会更加震惊。我已经预测到,一旦硬件的性能在未来得到极大的提升,将会发生什么。新增加的计算能力将被破坏。当我学习编程时,计算机仍然很少见。记得当时用的电脑型号是TRS-80,内存只有4K。为了将程序加载到内存中,我不得不删除源代码中的所有空格。一想到那些效率极低的软件,重复一些愚蠢的计算,消耗硬件的全部计算能力,就觉得难以忍受。然而,我的反应是错误的。我就像一个出身贫寒的穷孩子。我不愿意听到我要花钱。即使我把钱用在重要场合(比如去医院),我也很难接受。某些废物确实令人作呕。例如,有些人讨厌 SUV(运动型多功能车)。即使他们使用可再生清洁能源,他们也无法改变他们的看法,因为SUV来自一个令人作呕的想法(如何让小卡车看起来更有男子气概)。然而,并不是所有的浪费都是坏的。如今电信基础设施如此发达,随着时间的推移拨打长途电话有点问题。如果你有足够的资源,你可以把长途电话和本地电话当作一回事,一切都会变得更容易。
废物可分为好废物和坏废物。我感兴趣的是好的浪费,这意味着用更多的钱来获得更简单的设计。那么,问题就变成了我们如何才能充分利用新硬件更强大的性能并最有利地“浪费”它们?对速度的追求是人类内心深处根深蒂固的渴望。当您将计算机视为小工具时,您会不禁希望程序尽可能快地运行。抑制这种欲望需要付出很大的努力。在设计编程语言时,我们应该有意识地问自己,什么时候可以放弃一些性能来换取一点便利。许多数据结构存在的原因与计算机的速度有关。例如,今天的许多语言都有字符串和列表。从语义的角度来看,字符串或多或少可以理解为列表的一个子集,其中每个元素都是一个字符。那么,为什么我们需要将字符串作为数据类型分开呢?完全没有必要这样做。只是为了提高效率,所以字符串才会存在。但是,这种旨在加快运算速度,却让编程语言的语义变得非常复杂的行为,是非常不可取的。编程语言设置字符串似乎是过早优化的一个例子。如果我们将一门语言的核心设想为基本公理的集合,那么在核心中添加额外的公理只是为了提高效率,并不会带来表达能力的提升。这绝对是一件坏事。是的,效率很重要,但我认为修改语言设计并不是提高效率的正确方式。
正确的做法应该是将语言的语义与语言的实现分开。从语义上讲,不需要列表和字符串同时存在,仅列表就足够了。在实现中,编译器进行了优化,使其在必要时将字符串视为连续字节。对于大多数程序来说,速度并不是最关键的因素,所以你通常不需要担心这种硬件层面的微观管理。随着计算机的速度越来越快,这一点变得越来越明显。在设计语言时,对实现的限制更少,也会使程序更加灵活。语言规范的变化不仅是不可避免的,而且也是合理的。通过编译器的处理,按照以前的规范开发的软件将照常运行,提供了灵活性。 (论文)这个词来自法语动词,意思是“试一试”。在这个原始意义上,一篇文章是你写一篇文章并试图找出一些东西。软件也是如此。我认为一些最好的软件就像论文一样,这意味着当作者真正开始编写这些软件时,他们不知道最终会产生什么结果。 Lisp 语言黑客早就明白数据结构灵活性的价值。当我们编写程序的第一个版本时,我们经常以列表的形式处理所有内容。因此,这些初始版本的效率可能出奇地低。您必须克制以抵制优化它们。这就像吃牛排,所以你必须保持克制,以免去想牛排是从哪里来的,至少对我来说是这样。是这样的。
一百年后程序员最需要的编程语言是允许您毫不费力地编写程序的第一个版本的编程语言,即使以这种方式效率低得惊人(至少从我们今天的角度来看)。他们会说他们想要的是一种易于学习的编程语言。低效的软件并不意味着糟糕的软件。一种让程序员无用的语言真的很糟糕。浪费程序员时间而不是浪费机器时间才是真正的低效率。随着计算机越来越快,这将变得越来越明显。我认为放弃字符串类型是一个可以接受的想法。 Arc 语言已经做到了这一点,而且似乎运行良好。一些过去难以用正则表达式描述的操作,现在可以用回归函数非常简单地表达。这种数据结构扁平化的趋势将如何发展?我非常努力地想象所有的可能性,结果连我自己都感到震惊。例如,数组会消失吗?毕竟数组只是哈希表的一个子集,其特点是数组的键都是整数向量。此外,哈希表本身会被列表替换吗?还有比这更惊人的预测。从逻辑上讲,实际上没有必要为整数设置单独的表示,因为它们也可以看作是列表,整数n可以用n个元素的列表来表示。这样也可以完成数学运算,但是效率无法承受。编程语言的发展会不会抛弃整数这一基本数据类型?我并不是要你认真思考这个问题,而是要开阔你对未来的思考。
我只是提出一个假设的情况:如果一股不可抗拒的力量遇到一个不动的物体,会发生什么。专门针对本文:当一种难以想象的低效语言遇到一种难以想象的强大硬件时会发生什么。我认为放弃整数类型没有任何问题。未来相当长。如果我们想减少语言核心中基本公理的数量,我们不妨看得更远一些,想想如果时间变量 t 趋于无穷大会发生什么。一百年是一个很好的参考指标。如果你觉得一个想法在一百年后可能仍然不能被接受,那么它可能在一千年后仍然不能被接受。让我说清楚,我并不是说所有整数运算都使用列表来实现编程语言的发展,而是语言的核心(不涉及任何编译器实现)可以这样定义。实际上,任何执行数学运算的程序都可能以二进制形式表示数字,但这是编译器的优化,而不是语言内核语义的一部分。另一种消耗硬件性能的方法是在应用软件和硬件之间设置许多软件层。这也是我们看到的一个趋势,很多新兴语言都被编译成字节码。比尔伍兹曾经对我说,根据经验,每增加一层解释,软件的运行速度就会慢一个数量级。但是,额外的软件层可以使编程变得灵活。 Arc 语言的初始版本就是一个极端的例子。它的层数很多,运行速度很慢,但确实带来了相应的好处。
Arc 是典型的“”() 解释器,是在 Lisp 的基础上开发的,很像 John 在他的经典 Lisp 论文中定义的 eval 函数。 Arc解释器只有几百行代码,所以很容易理解和修改。我们使用的 Lisp 版本是,它本身是在另一个字节码解释器的基础上开发的。因此,我们总共有两层解释器。顶层的效率低得惊人,但语言本身是可用的。我承认它几乎不可用,但它确实有效。即使对于应用程序,使用多层开发也是一种非常强大的技术。自底向上的编程方式是将软件分成若干层,每一层都可以作为其上一层的开发语言。这种方法倾向于生成更小、更灵活的程序。它也是通向软件可重用性 () - 圣杯的最佳途径。根据定义,语言是可重用的。在编程语言的帮助下,您的应用程序以这种多层形式开发的越多,其可重用性就越好。可重用性的概念或多或少与 1980 年代出现的面向对象编程有关。无论你如何寻找证据,都不可能将这两件事完全分开。一些使用面向对象编程开发的软件确实是可以复用的,但这并不是因为它使用了面向对象编程,而是因为它的开发方式是自下而上的。
以函数库为例。它们是可重用的,因为它们是语言的一部分,而不是因为它们使用面向对象或其他编程方法。顺便说一句,我不认为面向对象编程在未来会消亡。我觉得,除了某些特定的领域,这种编程方式实际上并没有给优秀的程序员带来多少好处,但对大公司却有着不可抗拒的吸引力。面向对象编程为您提供了一种可持续开发乱码代码的方法。通过不断的打补丁,让你一步步把软件做大。大公司总是倾向于以这种方式开发软件。我预计一百年后也是如此。既然我们在谈论未来,那么最好谈论并行计算(),因为似乎并行计算是为未来而存在的。不管你怎么想,并行计算似乎是未来生活的一部分。未来会实现吗?在过去的二十年里,人们一直在说并行计算即将到来。但是,到目前为止,它并没有对编程实践产生太大影响。这是真的吗?芯片设计人员必须考虑到这一点,为多 CPU 计算机开发系统软件的程序员也必须考虑到这一点。然而,真正的问题是,并行计算可以达到什么抽象级别?会不会影响一百年后开发应用软件的程序员?还是只是编译器作者需要考虑的东西,在应用软件的代码中无处可寻?一种可能是,在大多数可以使用并行计算的情况下,人们会放弃使用并行计算。
尽管我的一般预测是未来的软件将浪费大部分新硬件性能,但并行计算是一个特例。我估计随着硬件性能的惊人提升,如果你明确说你想要并行计算,你肯定可以得到它,但你通常不会使用它。这意味着,除了一些特殊的应用,一百年后的并行计算不会是那种大规模并行计算()。我期望对于普通程序员来说,一切更像是fork一个进程,然后让多个进程在后台并行运行。这是在编程的非常后期阶段要做的事情。它是对程序的优化,类似于你想如何开发一个特定的数据结构来替换现有的数据结构。程序的第一个版本通常会忽略并行计算提供的各种好处,就像您在编程开始时忽略特定数据结构的好处一样。除了一些特定的应用软件,并行计算在一百年内不会很流行。如果应用软件真的大量使用并行计算,那就是过早的优化。一百年后会有多少编程语言?从最近来看,出现了大量的新语言。硬件性能的提升是原因之一,这让程序员可以根据使用目的在运行速度和编程便利性之间做出不同的权衡。如果这是未来的趋势,强大的硬件只会在一百年内增加语言的数量。然而,另一方面,一百年内可能只有几种通用语言。
部分原因是基于我的乐观。我相信以后,如果你的作品真的很优秀,你可能会选择一种易于开发的语言。用这种语言编写的软件第一版运行速度很慢,只有编译器优化后运行速度才会提高。既然我这么乐观,那我就得做出预测了。有些语言可以达到机器的最高效率,而另一些语言则很慢,只能运行。两者之间存在巨大差距。我预测,在一百年后,这个差距的每一个点都会有相应的编程语言。因为这个差距越来越大,所以性能分析器()会变得越来越重要。目前,性能分析并未受到太多关注。许多人似乎仍然认为,提高程序速度的关键在于开发能够生成更快代码的编译器。代码效率和机器性能之间的差距越来越大。我们会越来越清楚地看到,提高应用软件运行速度的关键是要有一个好的性能分析器来帮助指导程序开发。我说以后可能只有几种常用的语言,但具体领域使用的“小众语言”()不算在内。我认为这些嵌入式语言的想法非常好,肯定会蓬勃发展。但我判断这些“小众语言”会被设计成相当薄的一层,让用户一眼就能看到底层的通用语言,从而减少学习时间和使用成本。
谁来设计这些未来的语言?过去 10 年最令人兴奋的趋势之一是开源语言的兴起,例如 Perl 和 Ruby。语言设计已被黑客接管。目前尚不清楚这是好是坏,但发展势头令人鼓舞。例如,Perl 有一些很棒的创新。然而,它也包含一些可怕的想法。这对于充满侵略性和大胆探索的语言来说也是正常的。按照目前的变化速度,可能只有天知道 Perl 一百年后会是什么样子。有句话说,如果你自己做不到,那就当老师。这在语言设计领域并非如此。我认识的一些最优秀的黑客正在担任教授。但是,老师也有很多事情是做不到的。研究职位对黑客施加了一些限制。在任何学术领域,都有一些题目可以做,有些则不能做。不幸的是,这两种主题的区别通常取决于它们写完后是否看起来很深,而不是它们对软件行业的发展是否重要。也许最极端的例子是文学。文学研究者的任何成果对文学创作者几乎没有影响。虽然科学状态要好一些,但研究人员可以做的主题和可以帮助设计好的语言的主题之间的交叉点小得令人沮丧。 (Olin 曾对这一点表示不满,他说对了。
) 例如,关于变量类型的论文似乎层出不穷,尽管静态类型语言似乎无法真正支持宏(在我看来,不支持宏的语言不值得使用)。新语言更多以开源项目的形式出现,而不是研究项目。这是语言发展的趋势。另一个发展趋势是,新语言的设计者更多是需要使用它们的应用软件作者,而不是编译器作者。这似乎是一个好趋势,我希望它会继续下去。一百年后的物理学基本上是无法预测的。但是计算机语言是不同的。从理论上讲,设计一种能在一百年内吸引用户的新语言似乎是可能的。设计一种新语言的方法之一是直接编写你想编写的程序,而不管是否存在编译器,或者是否有支持它的硬件。这是假设您可以使用无限的资源。无论是今天还是一百年后,这样的假设似乎都有道理。你应该写什么程序?无论你想要什么,只要你能用最少的努力写出来。但请注意,这必须是在您的想法不受当前使用的编程语言影响时。这种影响无处不在编程语言的发展,必须付出巨大的努力来克服。您可能会认为,对于像人类这样的懒惰生物来说,喜欢以最省力的方式编写程序是很自然的。但实际上,我们的思想可能往往仅限于某种现有的语言,只采用这种语言的更简单的形式,其对我们思想的抑制作用将是惊人的。
新语言必须靠自己去发现,而不是靠让你自然沉沦的心态。使用程序的长度作为它消耗的工作量的近似指标是一种非常有用的技术。这里的程序长度当然不是指字符数,而是各种句法元素的总长度,基本上就是整个解析树的大小。可能不是说最短的程序就是编写最省力的程序,但是当你想把程序写得简洁而不是松散时,你就离省力的目标更近了,你的生活也会变得更好。所以,设计一门语言的正确方法就变成了,看一个程序,然后问问自己,你能不能把它写得更短?事实上,一百年后用想象的语言编写程序,这件事的可靠性取决于你对语言核心的估计是否足够正确。常规排序,现在就可以写了。但是,很难预测一百年后该语言将使用什么库。图书馆所针对的许多领域可能根本不存在。例如,如果 SETI@home 项目成功,我们将需要一个用于联系外星人的图书馆。当然,如果外星文明高度发达,已经达到了以XML格式交换信息的地步,那么就不需要新的函数库了。在另一个极端,我认为今天你可以设计一个一百年后的语言核心。事实上,在某些人看来,大多数语言核心是在 1958 年设计的。
如果一百年后我们可以使用一种编程语言,我们会用它来编程吗?观察过去,了解现在。如果今天的编程语言可以用在1960年,那个时候的人会用吗?在某些方面,答案是否定的。今天的编程语言所依赖的硬件在1960年并不存在。比如在这样的语言中,正确的缩进()在书写时是非常重要的,但是1960年的计算机没有显示器,只有打印机终端,所以写的不是很流畅。但是,如果排除这些因素(您可以假设我们只是在纸上编程),那么 1960 年代的程序员会喜欢使用当前语言进行编程吗? ,我想他们会的。一些缺乏想象力并且深受早期编程语言思想影响的人可能会觉得不可能。 (没有指针运算,怎么复制数据?没有goto语句,流程图怎么实现?)但我认为当时最聪明的程序员一定能够轻松使用今天的大多数语言,假设他们能拿到。如果一百年后我们现在可以拥有一种编程语言,那么它至少可以用来编写出色的伪代码。我们会用它来开发软件吗?因为一百年后的一种编程语言需要为某些应用程序生成快速的代码,所以它生成的代码很可能可以在我们的硬件上运行,而且速度是可以接受的。与一百年后的用户相比,我们可能需要对这种语言做更多的优化,但总的来说,它仍然应该给我们带来净收益。
现在,我们的两个观点是:1)一种一百年后理论上可以设计到今天的编程语言; 2)((如果今天能设计出这样的语言,很可能是适合编程,可以产生更好的结果。如果我们把这两个观点联系起来,那么就得出了一些有趣的可能性。为什么不尝试 a a from now? When When you your , it's good to keep this goal in mind. When to , one to is to the car , not by the body with the line on the , but By at a in the . Even if your is only a few away, this is . I we do the same when a .