历久弥新的技术
6月23日,我们庆祝 Mathematica 发布三十周年。大多数三十年前开发的软件现在已经消失了,但 Mathematica 依然在这里。事实上,从很多方面来看,我们感到三十年后的今天一切才刚刚开始。一直以来,我们致力于达成一个宏伟的目标:尽可能地让世界可计算,并为世间万物披上一层计算智能的外衣。
我们的第一大应用领域是数学(“Mathematica” 由此得名),我们一直在推动数学领域的发展。在过去的三十年中,基于在 Mathematica 1.0 中定义的框架,构建了现在称为 Wolfram 语言的整个计算功能高塔,这就是今天的 Mathematica。
从第一次设计 Mathematica 开始,我的目标就是要创建一个经得起时间考验的系统,并为我心目中计算技术的未来打下坚实的基础。这一切的成功实现着实令人兴奋。我最初的语言设计核心概念不断地注入到我们所做的一切,因此,这么多年来,我们得以在之前的基础上增砖添瓦,建造了一座精心集成了各种功能并不断成长的计算高塔。
在一个旧计算机上启动 Mathematica 1.0 并与今天的系统相比,真是非常有趣:
是的,早在版本 1 中,你就能看到 Wolfram 笔记本了。那么 Mathematica 代码(或者,今天我们称之为 Wolfram 语言的代码)呢?结果是,1988 年能运行的代码今天依然能够运行,而且完全一样!实际上,在过去三十年中我经常把以前编写的代码拿来使用并运行。
当然,在语言设计上需要长期遵从一定的原则才能达成这样的效果。如果原始设计理念不够强或不够清晰,这一切都不可能实现。但是,看到我在日常工作中坚定的指引和一致的语言设计使语言具有如此出色的长期稳定性,我也甚感欣慰。
茁壮成长
早在 1988 年,Mathematica 就在高级计算领域迈出了一大步,人们对它所能完成的事情惊叹不已。但与 Mathematica 和 Wolfram 语言今天的强大功能相比则不可同日而语。与 1988 年相比,今天各个主要功能领域的"闪耀"从下图中可窥一斑。
1988 年有 551 个内置函数;现在有超过 5100 个。而且每个函数的功能也大大增强。将多个算法一揽子自动化的 “超级函数” 概念早在 1988 年就已存在,但与我们现代的超级函数相比,它们的功能却大为逊色。
在 1988 年,符号表达和符号编程的核心思想已经存在,其工作原理与今天一样。还有各种与数学计算相关的函数,以及基本可视化等函数也已出现。但在随后的几年里,我们不断地开疆拓土,在新的领域前进。
部分原因是计算机原始能力的增长使进军新的领域成为可能,另一部分原因是
我们有能力理解什么事情是可以完成的。但最重要的是,通过系统的集成设计,我们能够在已有基础上逐步成长,从而以更快的速度攻克一个又一个新的领域。(以下是按版本计算的函数数量图。) 最近发现了我在 1991 年写的一份待办事项清单,现在,2018 年,我很高兴地看到基本上所有事情都已圆满完成。但是在很多情况下,为了达到我想要的水平,需要在长达数年的时间里建立一整套功能。
从一开始,甚至从 Mathematica 之前的项目开始,我的目标就是尽可能多地在系统中集入知识。最初,知识主要是有关算法的,而且是正规成文的。但是,自从通过网络连接到中央服务器成为日常,我们就开始认真构建如今关于现实世界的可计算数据的巨大知识库。
在 1988 年,我的一本 750 页的书就可以完整记录所有有关 Mathematica 的内容。今天,如果我们打印出在线文档,它可能会长达 36,000 页。尽管如此,系统的核心概念仍然像以往一样简单明了,即使是一本薄册,亦可尽述其精要。
世界如何改变
三十年,基本上是整个现代数字计算史的一半。在这期间,Mathematica 和 Wolfram 语言持之以恒,始终保持了其整体形式和结构,这一点令人瞩目,令人钦佩。
三十年前,Mathematica(共 2.2 兆字节)的软件盒出现在 “邻里软件商店” 中,并以软盘 (或者对于大型计算机而言,则是各种磁带) 的形式分发。今天,人们可以随时下载(大约 4 千兆字节),在线访问其知识库(若干兆兆字节),或者通过网页浏览器直接在 Wolfram Cloud 中运行整个系统。(在历史上一个奇特的脚注中,网络实际上是于 1989 年在一组 NeXT 计算机上发明的,而这些计算机是为了运行 Mathematica 而购买的)。
三十年前,运行 Mathematica 的 “工作站级电脑” 几乎只属于机构。1988 年,个人电脑使用 MS - DOS 系统,工作内存的极限是 640K,这不足以运行 Mathematica。Mac 系统可以运行 Mathematica,但它总是有点勉强 (“要求 2.5 兆内存;建议 4 兆字节”),并且在每个笔记本的页脚中都有一个内存量表,告诉你内存耗尽的程度有多大。对了,Mathematica 当时有两个版本,取决于你的机器是否有 “数字协处理器” (它允许在硬件而不是软件中进行浮点运算)。
早在 1988 年,我就拿到了我的第一部手机,大概是一只鞋的大小。而且像
Mathematica 这样的软件可以 “在手机上运行” 的想法想想就很荒谬。但是,我们今天在手机上使用 Wolfram Cloud 应用程序,并且在 iPad 上本机运行 Wolfram Player(并且,是的,它们没有虚拟内存,所以我们早年节约型的内存管理系统派上了用场)。 1988 年,运行 Mathematica 的电脑必须插入电源插座使用。像在飞机上使用 Mathematica 之类的想法是不可思议的 (当然,即使在1981 年,当我将运行 CP/M 的奥斯本 1 号计算机带到飞机上时,我确实在波音 747 的后面找到了一个电源插座)。直到 1991 年,我在一次讲话中第一次骄傲地展示了一台仅靠电池即可(吱吱嘎嘎)运行 Mathematica 的康柏笔记本电脑。而 Mathematica 像这样运行成为稀松平常的事情则又等了差不多十年。
多年来,当我在新机器上试用 Mathematica 时,曾经使用 1989^1989 作为测试计算。而在 1989 年,我通常会记录等待计算完成的秒数。(在 1988 年,1989^1989 的计算通常太慢而无法使用:可能需要几分钟时间才能完成。) 今天,当然,同样的计算瞬间就能完成。(实际在几年前,我在第一台 Raspberry Pi 电脑上再次进行了计算,这同样花了几秒钟时间,但那是一台价值仅为 25 美元的计算机,到今天,它的计算速度也非常快。)
近年来,计算机速度的显著提高对我们能做的事情不仅在数量上而且在质量上产生了深刻的影响。在 1988 年,执行计算和查看结果基本上是不能同步的。我们刚才谈到了实时与 Mathematica 计算进行交互的能力 (实际上早在 1989 年 NeXT 计算机上曾有一个这样的简单的演示程序)。但是,基本上花了 18 年的时间才使得计算机速度足够快,使我们借助 “Mathematica in the loop” 可以实现 Manipulate 和 Dynamic。
我从一开始就将图形和可视化视为 Mathematica 的重要功能之一。那时候有 “绘画”(位图)程序,还有 “绘制”(矢量)程序。我们决定使用当时最新的 PostScript 语言来表示所有的图形,与分辨率无关。
我们经历了各种各样的计算几何学挑战(想想所有那些零落的多边形),但是即使在 1988 年,我们就能够生成与分辨率无关的 3D 图形了,并且在准备 Mathematica 的首次发布时,我们发现了 “我们可以很容易生成的最复杂的 3D 图形”,并得到了最初的二十面体 “spikey”,这个图形演变成了我们今天使用的菱形六十面体图标:
在过去的软件时代,最初的 Spikey 图标为 Mac 系统上的 Mathematica 启动画面增添了优雅而又异想天开的色彩:
早在 1988 年,就有命令行界面(如 Unix shell),还有文字处理器(如 WordPerfect)。但是,拥有混合文本、输入和输出以及图形的 “笔记本”(我们称之为 “笔记本”)是一个新颖的想法,当时更常见的是分别在单独的窗口中甚至在单独的屏幕上生成。
其实早在 Mathematica 1.0 中,就已经出现了今天的 Wolfram 笔记本中很多熟悉的功能:单元、单元组、样式机制等等。甚至还有相同的双单元括号运算状态标识,尽管在那些日子里渲染时间更长意味着需要更多的 “娱乐”,Mathematica 是以 bouncing - string - figure 等候游标的形式提供,这是在与刷新 CRT 显示器相关的垂直回扫中断期间实时计算的。
Mathematica 的架构从一开始就分成两部分:一个执行计算的内核和一个支持笔记本界面的前端,这种结构现在已是优秀软件架构的标准。这两部分通过 MathLink 协议进行通信(今天仍然使用,现在被称为 WSTP),它以非常先进的方式来回发送符号表达式。
在 1988 年,像 Mac 这样的电脑运行 Mathematica,通常在本地台式机上运行前端,然后在更大型的机器上安装 “远程内核”。有时候这台机器将通过以太网连接,或罕见地通过互联网连接。人们更普遍会使用拨号连接,并且,版本 1.0 中拥有一整套机制来支持调制解调器和电话拨号。
第一次构建笔记本前端时,我们把它当作内核的一层薄薄的包装,不同计算机系统的不同用户界面可以对其匆匆略过。我们先为 Mac 制作了前端,然后(部分是同时进行地)为 NeXT 制作了前端。在随后的几年内,我们为当时还是很新的 Microsoft Windows 和 X Windows 构建了独立的代码库。
但是随着笔记本前端的不断改善,它变得越来越复杂。因此,当 1996 年我们终于设法创建了一个可在所有平台上运行的合并代码库时,这对于我们是一个很大的安慰。
这种模式持续了超过 15 年。然后出现了云端和移动端。而现在出于需要,我们又有了多个笔记本前端的代码库。也许几年后我们可以再次将它们合并。但有趣的是,看到同样的问题随着时间的流逝是如何周而复始的。
与前端不同,我们从一开始就将内核设计为尽可能稳健的便携式。多年来,它被移植到了一系列令人惊叹的计算机上,通常是作为新型计算机正式运行的第一个应用软件。
从 Mathematica 诞生之初,内核就有一个原始的命令行界面,直到今天它仍然存在。在一些新的和不熟悉的情况下,这种原始界面的存在往往非常必要,对我而言,这是非常令人赞叹的。早在 1988 年,它甚至可以制作图形,就像 ASCII 艺术一样,但是今天的需求并不那么多。但是,原始的内核接口仍被 wolframscript 用来提供对 Wolfram 语言的程序式访问。
软件考古学
有很多早期的计算历史正在消失。真正实际运行 Mathematica 1.0 并不容易。但是在尝试过一些早期的 Mac 机器之后,我终于找到了一个似乎仍然运行良好的。我们通过它的发行软盘加载了 Mathematica 1.0,是的,它启动成功了!(我想这些分发软盘是在 1988 年 6 月 23 日实际发行之前的一周发布的;我依稀记得赶着复制最后几张盘的情形。)
不用说,当我想做直播时,Mac 停止了工作,屏幕上只显示出一种奇怪的斑马图案。我使劲拍了一下计算机(典型的二十世纪八十年代补救措施),也没有任何反应。但就在我即将放弃的时候,这台机器突然又活了,让我再次运行Mathematica 1.0。
我进行了各种尝试,创造了一个相当长的笔记本文件。但我随即想知道:这个文件的兼容性怎样?所以我把笔记本保存在一张软盘上,然后把它放在一台现代计算机上的软盘驱动器(是的,这东西你仍然可以搞到)。一开始,现代操作系统并不知道如何处理笔记本文件。
然后我添加了旧的 “.ma” 文件扩展名,并将其打开。OMG!它工作了!最新版本的 Wolfram 语言能够成功读取 1988 年的笔记本文件格式,并渲染了该笔记本(同时创建了一个不错的现代 “.nb” 版本):
图形周围有一些奇怪的间距,反映了 1988 年图形处理的旧方式。但如果只选择笔记本中的单元,并按下 Shift + Enter 键,则会出现一个完全现代化的版本,并且是彩色输出!
前路漫漫
在 Mathematica 之前,复杂的技术计算领域只能是少数 “大师级” 计算专家的地盘。但 Mathematica 的出现让这一切都迅速发生了变化,瞬时间普通科学家或数学家也能亲自进行大量的实际计算,并将结果用笔记本保存或发布。
在过去的三十年中,我们逐步开启了越来越多的领域以便进行直接计算。通常其中具有很高的技术复杂性,但我们的目标是让人们能够将高级别的计算性思维,尽可能直接并自动地转化为实际计算。
由此产生的影响是巨大的,看看这些年来人们借助 Mathematica 发明和发现了多少东西,以及世界上最多产的创新者中有多少人在使用 Mathematica 和 Wolfram 语言,真是令人倍感欣慰。
但令人惊讶的是,即时这么多年之后,我认为 Mathematica 和 Wolfram 语言的真正强大之处才正在初露锋芒。
部分原因与人们逐渐认识到以系统且连贯的方式将知识构建于系统的重要性有关。这些年来,Wolfram 语言在这方面一直独树一帜。现在这意味着我们拥有一座巨大的计算智能高塔,可以随时应用于任何事物中。
坦白来讲,在这过去的三十多年里,Mathematica 和 Wolfram 语言主要部署的是桌面软件。但特别由于普通计算生态系统不断的复杂化,促使我们能够在过去的十年内构建了非常强大的部署通道,使得 Mathematica 和 Wolfram 语言能够在范围不断扩大的重要的企业设置中予以使用。
Mathematica 和 Wolfram 语言一向是研究、教育和计量金融等领域的标杆。但如今它们的计算智能能够应用到任何需要计算的领域。
从最初的 Mathematica 开始,我们便涉及了现今的人工智能,而且近年来我们一直是支持现代机器学习的领导者,并且还深度参与到了各种类型的数据以及现今的数据科学中。
直到现在才变得日益清晰的是,为了让数据科学和人工智能实现其更大潜力,Mathematica 和 Wolfram 语言的广度尤为重要。当然我很满足在过去三十年中我们所构建的所有这些功能,以及极力维持的统一性设计对于此类领域变得如此之重要。
计算概念的确是上世纪最重要的知识开发之一。并且我予以 Mathematica 和 Wolfram 语言的目标也是为将高级计算覆盖每个可知领域提供传播媒介。
在不久的将来,对于几乎每一个领域 X(从艺术到动物学),现在或不久的将来会有一个 “计算型 X”,通过使用计算范式来定义该领域的未来。令人兴奋的是见证有多少 Wolfram 语言的独有功能能帮助加快这个过程,并进化为 “计算 X 的语言”。
传统的非基于知识的计算机语言的基础是设定一种方法告诉计算机该如何进行,通常是较低级别的。但现今 Wolfram 语言逐渐被认可的侧重面之一则不是单纯告诉计算机该如何做,而是让其成为真正的计算交流语言,从而提供一种让计算机和人类都能够充分理解的计算型思维表现方法。
在过去,基本上仅仅是让计算机 “读取代码”。但如同大量的泛化数据注释的想法相同,Wolfram 语言的目标是让人们易于阅读并用于表示和理解计算思想。
将这个想法与笔记本相结合为我们带来了 Computational essays(计算写作)这一概念,我认为在 Wolfram 语言三十年历史的独特构建下,其注定会成为未来的核心交流工具之一。
三十年前,看到众多的科学家和数学家通过 Mathematica 来 “探索计算机” 而为之鼓舞。如今看到 “计算 X” 在更多新领域的开拓则更加令人激动。但是让人最兴奋的是看到,通过在 Wolfram 语言中实现的自动化等级,我们成功将复杂计算带入到了让几乎所有人都能够触手可及的阶段。尤其让人欣慰的是看到中学甚至更低年级的孩子,都逐渐开始熟练使用 Wolfram 语言并掌握计算型思维。
回顾计算的发展史, 它在许多方面都是一个功能不断叠加的故事, 并且正变得越来越普及。首先,是早期语言的出现,然后是操作系统。后来,大概在 Mathematica 出现的时候,用户界面开始变得无处不在。再往后, 出现了网络,然后是Web 和 Cloud 等大规模互联系统。
现在 Wolfram 语言所提供的是一个新的层面:计算智能的层面,使其被认为让计算和世界相关的高级内置知识,以及自动化应用的能力成为可能。
在过去的三十年中,很多人使用过 Mathematica 和 Wolfram 语言,更多的人也在通过构建类似 WolframAlpha 的系统中体验到了它的能力。现在可以让 Wolfram 语言来提供一个真正无所不在的横跨计算机世界的计算智能层面。我认为用数十年的时间来构建一座技术和功能的高塔是值得的,然而我们已经走到了这一步,是时候来让它成为现实了。
Mathematica 和 Wolfram 语言的历史不仅仅是一个科技故事。它还是一个关于由将其运用于工作和生活的个人组成的卓越社区的故事。现在,随着我们开始意识到 Wolfram 语言在未来世界的无限潜力,我们需要这个社区来帮助解释和实现 Wolfram 语言定义的范式。
毋庸置疑,将新的范例投入世界不是能轻易实现的事情,但是它将推进文明的进程,并且定义历史的轨迹。今天,我们处于一个能够将无所不在的计算智能引入世界的伟大时刻。
对于我而言,回顾 Mathematica 诞生以来的三十年,我感谢所有让我能够为今天的 Mathematica 和 Wolfram 语言而一心一意走下来的一切。并且期待我们的团队由此共同不断向前推进,最终为构成技术发展和我们的世界的这一重要部分作出贡献。