你如何设计一种功能强大且易于使用的编程语言? Rexx 提供了一个例子。本文介绍了 Rexx 如何调和这两个看似矛盾的目标。
Rexx 编程语言的历史
几十年前,计算机正在从批处理转向交互处理。开发人员需要一种脚本或“胶水”语言将系统连接在一起。 该工具需要执行从支持应用程序开发到发出操作系统命令到充当宏语言的所有操作。
IBM Fellow Mike Cowlishaw 用一种他命名为 Rexx 的语言创建了一个解决方案。 它被广泛认为是第一种通用的脚本语言。
Rexx 非常易于使用且功能强大,因此它迅速渗透到 IBM 的所有软件中。 如今,Rexx 是 IBM 所有商业操作系统(z/OS、z/VM、z/VSE 和 IBM i)上的捆绑脚本语言。 毫不奇怪,在 20 世纪 90 年代,IBM 将 Rexx 与 PC-DOS 和 OS/2 捆绑在一起。 在 Windows XP 资源工具包中出现了 Rexx(在 Microsoft 决定使用其专有的脚本语言 VBScript 和 PowerShell 锁定客户之前)。 Rexx 也成为流行的 Amiga PC 的脚本语言。
开源 Rexx
随着 Rexx 在各个平台上蔓延,标准化是必要的。 美国国家标准协会 (ANSI) 于 1996 年介入。
这打开了闸门。 开源 Rexx 解释器开始出现。 如今,超过六个解释器可以在每个可以想象的平台和操作系统上运行,以及许多开源工具。
有两个 Rexx 变体值得一提。Open Object Rexx 是过程式或“经典” Rexx 的兼容超集。ooRexx 是基于消息的,并提供了人们希望的所有类、对象和方法。 例如,它支持多重继承和混入类。
与 Java 的流行同步,Mike Cowlishaw 发明了NetRexx。 NetRexx 是 Rexx 的一个变体,它与所有 Java(包括其对象模型)完全集成,并在 Java 虚拟机上运行。
ooRexx 于 2004 年开源; NetRexx 于 2011 年开源。 如今,Rexx 语言协会增强并支持这两种产品。 RexxLA 还支持 *Regina*,最流行的经典 Rexx 解释器,以及 *BSF4ooRexx*,一种将 ooRexx 与 Java 完全集成的工具。 一切 Rexx 都是开源的。
分层设计
所以,回到最初的难题。 编程语言如何将功能和易用性结合起来?
解决方案的一部分是分层架构。 运算符和最少的一组指令构成了经典 Rexx 语言的核心

(Howard Fosdick,CC BY-SA 4.0)
围绕核心的是该语言的 70 多个内置函数
- 算术
- 比较
- 转换
- 格式化
- 字符串操作
- 杂项
额外的功能以外部函数库的形式添加。 您可以像调用内置函数一样从 Rexx 程序中调用外部函数。 只需在脚本顶部通过正确的引用使它们可访问即可。
函数库可用于所有内容:GUI、数据库、Web 服务、OS 服务、系统命令、图形、访问方法、高级数学、显示控制等等。 结果是一个功能强大的开源生态系统。
最后,回想一下 Open Object Rexx 是经典 Rexx 的超集。 因此,您可以使用过程式 Rexx,然后通过迁移到 ooRexx 将您的技能和代码转换为对象编程。 从某种意义上说,ooRexx 是 Rexx 的另一个扩展,这次是进入面向对象编程。
Rexx 是一种以人为本的语言
Rexx 以一致、极其简单的语法将所有指令、函数和外部库粘合在一起。 它不依赖于特殊字符、神秘语法或保留字。 它不区分大小写且形式自由。
这种方法将编程的负担从程序员转移到机器上,尽可能地转移。 结果是一种相对容易学习、编码、记忆和维护的语言。 Rexx 旨在成为一种以人为本的语言。
Rexx 实现了最小惊讶原则,即系统应该以人们假设或期望的方式工作。 例如,Rexx 的默认十进制算术(具有您控制的精度)意味着您不会因舍入误差而感到惊讶。
另一个例子:所有变量都包含字符串。 如果字符串表示有效的数字,则可以使用它们执行算术运算。 这种动态类型的简单概念使所有数据都可见,并简化了跟踪和调试。
Rexx 利用解释器的优势来简化程序开发。 跟踪工具允许开发人员以各种方式指导和见证程序执行。 例如,可以单步执行代码、检查变量值、在执行期间更改它们等等。
Rexx 还会引发程序员可以轻松捕获的常见错误条件。 此功能使代码更加标准化、可靠。
数组
Rexx 的数组(或表)方法很好地说明了它如何将简单性与功能结合起来。
与所有 Rexx 变量一样,您不必提前声明它们。 它们会自动扩展到可用内存的大小。 此功能减轻了程序员的内存管理负担。
要形成一个数组,一个所谓的复合变量将一个词干变量与一个或多个下标缝合在一起,如下例所示
my_array.1
my_table.i.j
my_list.index_value
my_list.string_value
my_tree.branch_one
my_tree.branch_one.branch_two
下标可以表示数值,就像您在标准表处理中习惯的那样。
或者,它们可以包含字符串。 字符串下标允许您使用与普通表相同的简单语法来构建关联数组。 有些人将关联数组称为键值对或内容可寻址内存。 允许通过任意字符串而不是简单数值访问数组内容,开辟了一个全新的算法解决方案世界。
使用这种灵活但一致的语法,您可以构建几乎任何数据结构:列表、二维或三维或 n 维表、键值对、平衡树、非平衡树、密集表、稀疏表、记录、行等等。
美妙之处在于简单性。 这完全基于复合变量的概念。
总结
将来,我将演练一些 Rexx 程序示例。 一个真实世界的示例将展示使用关联数组的简短脚本如何将旧程序的运行时从几个小时减少到不到一分钟。
您可以免费加入 Rexx 语言协会。 有关免费 Rexx 下载、工具、教程等信息,请访问 RexxInfo.org。
7 条评论