从计算资源的限制出发

Maple 在加拿大安大略省的滑铁卢大学诞生。基思·格迪斯研究数值分析,也使用符号计算系统处理代数问题。按他2006年在 Maple 会议上的回忆,早期系统的内存限制和使用成本妨碍了这类工作:输入与答案中的整数可能不大,求多项式最大公因式的中间步骤却会产生很长的整数。

1980年11月,格迪斯召集同事讨论,起初想申请购买能运行 Macsyma 的计算机。讨论转向自行开发占用较少资源的系统,加斯顿·戈内特成为最初的合作伙伴。同年12月第一周,戈内特做出了可运行原型,两人将它命名为 Maple。随后布鲁斯·查尔等研究人员加入,设计由原型逐步发展为符号计算组的共同工作。

参考:[3] [2]

1981年手册与1982年版本

1981年7月,格迪斯和戈内特以滑铁卢大学研究报告形式发布《MAPLE User’s Manual》。前言把它称为仍在设计与实现中的工作文件。手册已经说明赋值、条件和循环语句,以及微分、积分、求和、泰勒展开等函数接口,显示它既是交互式数学工具,也提供表达算法的程序语言。

格迪斯保存的版本记录把 Maple 1.0 列在1982年1月,2.0 列在同年5月,之后还有6月的2.1和12月的2.2。1982年对应早期编号版本的发布阶段。项目构思与初始程序在1980年已经出现,1981年的手册又留下了版本发布之前的具体技术证据。

参考:[1] [4]

变量可以保留在答案中

早期手册用一组赋值解释符号计算:先把 a 设为1,再输入 x:=a+b,系统得到含未知量的 b+1。随后若把 b 设为−1,再计算 sin(x),结果变成0;把 b 改为0后,同一表达式则得到 sin(1),保持精确符号形式,而非自动换成一个小数。

这里的关键是当前计算环境与化简规则。没有数值的名字仍能成为表达式的一部分,赋值又会影响后续求值。用户因而能够先推导公式,再代入参数。手册还为数据类型、内部表示、公共表达式处理和外部程序库分别安排章节,把数学对象的操作与程序执行机制放在同一系统中说明。

参考:[1]

把内核做小,把数学算法放进库

开发者没有把全部数学功能编译成一个庞大的常驻程序。1981年手册提出模块化结构:基本系统服务于分时计算,较高层功能按用户需要加入。系统主要用 C 语言在 UNIX 上实现,在 Honeywell TSS 环境中也有用 B 语言实现的版本;跨机器移植从早期就是现实需求。

1984年的设计论文进一步描述了约100KB的编译内核,以及用 Maple 语言编写、调用时才载入的外部库。内核处理解释执行、基本算术与化简等操作,分解、积分和解方程等高层算法可置于库中。这样使用者能够阅读和修改算法,而一次计算也不必为未用到的全部功能付出内存代价。

参考:[1] [2]

效率试验与更广的使用场所

1984年论文用斐波那契数列程序说明一种具体优化:直接递归反复计算相同的子问题;加入 option remember 后,系统把函数调用和结果存入表,再遇到相同参数即可复用。这把论文所示程序的增长方式从指数级降到线性级。哈希表还被用于共享相同子表达式,以节约存储和比较时间。

该论文记录,当时3.2版已向 VAX/Berkeley UNIX 和 DEC20/TOPS-20 用户分发;作者还计划在1985年1月开始面向约300名微积分和线性代数学生的教学试点。研究软件的传播因此兼有机器移植、算法库协作与课堂使用几条路径。早期 Maple 的成果,是把可编程的符号计算做成能够逐步扩展的工具,后续版本继续在这个结构上发展。

参考:[2] [4]