REstructured eXtended eXecutor (Rexx) 语言可为担任 AIX® 开发人员或管理员的您做什么呢?它的功能非常强大,甚至超乎您的想象,特别是在 2006 年末由官方首次发布的 AIX 变种——Open Object Rexx (ooRexx) 更是如此。
您需要对此脚本语言有更多的了解,清单 1 显示了其中的一个方面:
清单 1. 使用 Rexx 进行字数统计
parse arg filein
count. = 0
do while lines(filein) > 0
input = linein(filein)
do n = 1 to words(input)
w = word(input, n)
count.w = count.w + 1
if count.w = 1 then word_list = word_list w
end
end
do i = 1 to words(word_list)
w = word(word_list, i)
say w count.w
end
|
这是一个取消注释的 Rexx 程序。您能猜到它将执行什么操作吗?我相信您可以,即使您从未学习此语言也能看出来。此程序将执行下列操作:
- 打开其名称显示在命令行上的文件
- 读取该文件中的每行内容
- 将每行内容分成单个的字
- 累计字数
- 报告出现的总字数
在安装了 Rexx 的 UNIX® 计算机上,如果将此程序作为 Rexx word_count.Rexx draft.xml 运行,则输出将类似于清单 2。
清单 2. 字数统计程序的典型输出
.
.
.
included 3
in 55
file 3
.
.
.
|
如果您的桌面上未 安装 Rexx,请不用担心,我稍后还将谈到这些可用性问题。
清单 1 为我们上了第一课,我们从中可以看出 Rexx 程序易于理解:它们与您已编写过的 Shell 程序非常相似,只不过它们的算法更为高级,关联数组也十分有效。关联数组(又称为哈希、字典、stem 变量 等)是一种建立了索引的数据类型,其索引可以是“任意”字符串,而不仅局限于 C 数组所使用的整数。在 count 示例程序中,它使用一个 stem 变量将单个字映射到该字的出现次数。
要让自己有效地使用 Rexx,您需要学习此语言并访问它的各种参考资料。这也十分容易:现在有大量的 Rexx 资源,包括在线版本和打印版本,您可以免费获取它们。下面的参考资料部分提供了多篇 developerWorks 文章,其中包含的参考资料十分丰富,足以让您使用这一出现将近 30 年的语言踏上 Rexx 编程之路。
不过,如果您在大多数桌面的命令行中键入上面的 Rexx word_count.Rexx draft.xml,您会很快发现这些桌面上并未安装 Rexx。如果现代计算机很少在缺省安装中提供 Rexx,还有学习它的必要吗?让我们看一下 Rexx“文化角色”的其他重要方面,以便您可以自行决断。
Rexx 对 Amiga 和 OS/2® 桌面至关重要,并且它仍然是 System z™、CICS® 等 IBM 大型主机的标准脚本语言。在 AIX 操作系统的生存期内,IBM 曾使用几个不同的名称将 Rexx 作为 AIX 的一个产品提供。无论您运行的是哪个特定版本,都至少可在您的主机上下载两个主要的实现(多数情况下是 Regina 和 ooRexx)。这是关于此语言的另一个重要事实:您可以为计算机下载 Rexx,只有少数例外情况。而且,除 Rexx 的“本机”实现外,每个支持 Java™ 虚拟机 (JVM) 的系统都可以运行 Rexx,因为 NetRexx 变种可直接编译为 Java 字节码。
这种可移植性意义重大,其中一个方面是如果您在某个计算机或网络上使用 Rexx 工作,则无论您到其他任何位置,也都可以应用这些知识。对于既负责大型机、又负责小型系统的人而言,由于这两种系统在编程或维护模型方面缺乏共同点,因此这种可移植性就显得格外重要。
让我们看看清单 1 还给我们提供了什么内容。假设您要对报告排序;Rexx 如何实现此目的呢?
ANSI Standard Rexx 不包括任何排序例程、函数或关键字。这可能会使您感到惊讶,因为多数甚至最简单的应用程序也需要提供排序功能。然而,Rexx 的策划师并未忽略这一现实。实际上,Rexx 的部分要旨就是要与其主机操作系统的命令行环境紧密集成。Rexx 会将每个无法解析为分配或指令的语句视为“本机”命令。要调整清单 1 以产生排序结果,只需编写以下内容:
清单 3. 用 Rexx 对字数统计排序
parse arg filein
count. = 0
do while lines(filein) > 0
input = linein(filein)
do n = 1 to words(input)
w = word(input, n)
count.w = count.w + 1
if count.w = 1 then word_list = word_list w
end
end
tmpfile = "/tmp/mytempfile"
stream(tmpfile, 'c', "open write replace")
do i = 1 to words(word_list)
w = word(word_list, i)
oneline = w count.w
call lineout tmpfile, oneline
end
command = "sort" tmpfile
address system command
do i = 1 while queued() \= 0
parse pull line
say line
end
|
此示例先写出 tmpfile 外部文件的字数统计表,然后依赖 sort 外部系统命令对所得到的报告排序。AIX 和其他风格的 UNIX 都内置于 sort 命令行实用工具。
清单 4. 清单 3 的示例排序报告
...
along 1
alongside 1
already 3
also 7
...
|
现在,大多数 Rexx 安装都内置了自己的排序扩展,因此可以方便地为缺少快速排序或冒泡排序的安装定义实现这些排序方法的子例程。清单 3 很有启发意义,因为 Rexx 主要用于对来自其他工具的结果进行解析、管理和重新排列。在处理大型数据集的环境中,最好为 Rexx 团队提供专门的外部 sort 命令。因此,下一个有关 Rexx 的事实是 Rexx 希望与系统命令“合作”。
这是否说明 Rexx 难以使用?因为使用程序 Shell 产生的排序字数统计列表将非常简单,如下所示:
清单 5. 用 Shell 对字数统计排序
FILE=$1
TMPFILE=/tmp/$$
for word in `cat $FILE`
do
echo $word >> $TMPFILE
done
sort $TMPFILE | uniq -c
|
此 解决方案不是更好吗?
在目前这个问题上,我们承认,Shell 的表现更为出色;它很好地利用了内置的 uniq -c 命令。即使在对报告重新格式化或进行简单的筛选时,也可能只需要向 sh 源代码添加另一行代码即可。
但是,在需要执行算术运算或管理比空格分隔的记录更为复杂的数据结构时,Shell 将开始变得难堪重负。Rexx 适用于比 sh 要求更高的项目。ooRexx 更是如此,它内置了一个基本类集,其中包括:
- QUEUE
- TABLE
- ALARM
- SET
- MESSAGE
- 以及另外六个类
ooRexx 完全支持多态性、继承性和重要的库(例如 TCP/IP 和算法)等面向对象的方面,从而使 Rexx 程序可以满足较为复杂的要求。使用 Rexx/Tk、Rexx/DW 或其他 GUI 库之一,还可以进行图形用户界面编程。
现在,您已了解了有关 Rexx 的基本事实。如果您已熟悉多种动态语言和现代 Shell,则 Rexx 可能不会为您提供太多便利。但另一方面,如果您的日常工作属于其他领域,而并不要求考虑元编程或连续性,特别是当您跨多种 IBM 系统工作时,您将希望阅读参考资料部分,以便了解有关 Rexx 的更多信息。
请记住:
- Rexx 程序易于理解。
- 您可以找到大量可用的 Rexx 资源。
- 现代计算机很少在缺省安装中提供 Rexx。
- 您可以为计算机下载 Rexx。
- Rexx 希望与系统命令“合作”。
- Rexx 适用于比
sh要求更高的项目。
祝您的 Rexx 编程之路一帆风顺。
学习
- 您可以参阅本文在 developerWorks 全球站点上的 英文原文 。
-
Open Object Rexx 网站:此网站具有重要价值并得到精心维护。要在 Rexx 编程领域中快速入门,请从下载页面检索 ooRexx 的适当版本。请注意,尽管 AIX 用户曾有一段时间需要支付 Rexx,但开源“ooRexx 从 3.1 版起将可用于 AIX”。
- “人人可用的 Rexx”(developerWorks,2004 年 2 月):此文章引入了堆栈和字符串解析等重要的 Rexx 概念。
- Rexx 可在大型机、手持设备以及处于这两者之间的几乎所有系统上运行,其中包括 Java 虚拟机和 Apache Web 服务器。它甚至具有控制 DB2® 数据库的功能,详情参见 Howard Fosdick 在 2005 年发表的文章“Script for DB2 Universal Database using Rexx:Quick DB2 UDB scripting”。不仅 Rexx 产品支持多种“从外部”访问数据库管理系统 (DBMS) 的不同标准,DB2 的某些实现还允许用 Rexx 表示存储过程(但不是触发器或函数)。
-
comp.lang.Rexx:Usenet 新闻组是我最青睐的 Rexx 学习资源之一。
- "Awk by example(developerWorks,2001 年 1 月):此文章逐渐引入了关联数组。在此研讨会教程中,将 Rexx 的关联数组概念描述为“stem 变量”。
-
Rexx Language Association:此网站维护了一个关于标准的页面,其中包括 1996 ANSI 规范 X3.274-1996。
-
rexx/Tk 和 Rexx/DW:Rexx/TK 和 Rexx/DW 是主要的 GUI 库。
- “NetRexx ... 允许您为 Java 环境创建应用程序和 applet,可比用 Java 编程更加轻松快捷。”:这是一个大胆的断言,但 IBM 得出此结论却合情合理,因为 NetRexx 确实是那样强大。NetRexx 还提供了 Rexx 的所有标准功能。
-
Rexx 历史文档:这些文档介绍了 Rexx 自 1979 出现以来的重要发展历程。
- 查看 Cameron Laird 撰写的其他文章和教程:
- 按主题搜索“AIX and UNIX®”库:
-
AIX and UNIX:“AIX and UNIX developerWorks”专区提供了大量与 AIX 系统管理的所有方面相关的信息,您可以利用它们来扩展自己的 UNIX 技能。
-
New to AIX and UNIX:访问“New to AIX and UNIX”页面可了解更多关于 AIX 和 UNIX 的内容。
-
AIX 5L Wiki:AIX 相关技术信息的协作环境。
-
Safari 书店:访问此电子参考资料库可查找特定的技术资源。
-
developerWorks 技术事件和网络广播:了解最新的 developerWorks 技术事件和网络广播。
-
Podcast:收听 Podcast 并与 IBM 技术专家保持同步。
获得产品和技术
-
IBM 试用软件:从 developerWorks 可直接下载这些试用软件,您可以利用它们开发您的下一个项目。
讨论
- 参与 developerWorks blog,从而加入到 developerWorks 社区中来。
-
AIX 超级用户组:参与并加入 AIX 社区。
- 参与“AIX and UNIX”论坛: