REXX语言40周年

REXX在当时是一种相当古老的高级语言。 根据Wikipedia的说法,他于1979年出现,也就是说,他最近40岁了。 当然,这不是最老式的语言,而是一个体面的年龄。

Rexx是缩写,它表示重组扩展执行程序,它可能是指我们的祖先EXEC / EXEC2。 我在VM / SP 3操作系统中遇到了他,在那里他来替换这些脚本语言。 然后它在OS / 2中很流行,并在许多其他OS中使用,并且创建了许多实现和派生的方言。

图片

他对Habré并没有太在意,我会尽力填补本文中的空白。

祖先,起源,作者


最初的语言实现只有一位作者,IBM Mike Cowlishaw的一名员工。 此实现是用S / 360汇编程序编写的。

维基百科认为REXX受PL / 1,EXEC和EXEC2和Algol的影响。 总的来说,是的,该语言无疑是其语法-Algol(或Pascal,如果可以的话)的继承人。 也就是说,循环,块等。 例如,结构不是用大括号括起来,而是用关键字do / end包围。 至于EXEC和EXEC2,创建了REXX来替代它们,也许与它们无关。 但是相比PL / 1 REXX要简单得多,并且该语言的目的是完全不同的。

REXX代码如下所示:

/*    1  10 */ sum = 0 do count = 1 to 10 say count sum = sum + count end say "    " sum"." 

特色功能


我认为,该语言中最有趣或最不寻常的是什么?

1.该语言的语法是完全免费的,当然它不是Fortran。 Algol和Pascal看起来最多。 一般而言,基本也是如此。

有一些典型的结构化编程操作符。

有功能和程序。 在这里,该过程默认情况下会隐藏调用代码中的所有变量,这有点不寻常,但是可以使用暴露的<variable list>键结构使其中一些变量可用。

键入是动态的。 在执行的不同时刻,变量可以解释为字符串或数字,也可以不定义(可以检查,尽管它是歪斜的)。 实际上,该语言具有一种原始数据类型-字符串,如果字符串是正确的数字,则可以对其执行算术运算。

这是一个小的Wikipedia示例:

 say hello /* => HELLO */ hello = 25 say hello /* => 25 */ hello = "say 5 + 3" say hello /* => say 5 + 3 */ interpret hello /* => 8 */ drop hello say hello /* => HELLO */ 

这表明第一行(和最后一行)中的未定义变量以其名称以大写字母计算。 这是检查不确定性的方法。

解释语句类似于今天通常所说的eval。

错误处理可能与Basic最相似:

 signal on halt do forever ... /*   */ end halt: /* .    halt,    */ exit 

这是程序完成处理(通过终端上的按钮)。 除了暂停之外,还有其他“信号”,例如,语法(解释的代码中的语法错误)。 我不记得我实际上在应用它,但是检查语法正确性(例如,馈入解释输入的内容)是很合逻辑的。

2.它没有正则表达式,就像我们在Perl中所说的那样(但是,离Perl还剩10年了)。 正则表达式的概念很早就出现了,例如grep实用程序确实已经存在。 相反,有一个parse运算符,它是常规的简化模拟,将组替换为变量。

 parse [origin] [template] 

即 我们分析源的内容(可以是函数,变量,表达式等的参数),以确保与模板保持一致。 模板可以包含用于分隔值的文字和在这些分隔符之间从源接收值的变量。 在某种程度上,它看起来像正则表达式中的组。

 fio = ', ' parse var fio firstName ',' LastName say firstName say LastName 

当然,这仅是因为没有\ d这样的元字符,没有*或+形式的重复,没有其他选择,没有类似的东西而比正则表达式简单得多。

3. Rexx拥有一个API,该API不仅可以将其用作脚本语言,还可以用于OS(CMS),还可以用于支持该API的任何其他程序。 即 实际上,这是一种DSL编写语言。 可能是第一个。 同时,运行时可以实现解释程序,并为解释程序提供作为程序结果可用的其他功能或命令。

看起来是这样的:启动XEDIT文本编辑器时,他在可访问磁盘上的某个位置寻找一个名为PROFILE XEDIT的文件,其中包含REXX脚本。 该脚本可以分配功能键,并定义XEDIT可用的其他命令。 就含义而言,例如,今天它最接近.bashrc。 或Vim的类似物。

因此,在PROFILE XEDIT中定义的REXX过程和功能可以执行编辑器命令并访问有关打开文件的信息,包括文件本身的内容。

4.它不需要任何特殊语法即可将命令传输到主机环境(即OS或文本编辑器)。 相反,所有Rexx无法识别的表达式都传递给执行。 因此,要将OS命令写入脚本内,将其用引号引起来就足够了,例如:

 'list * * * (stack' 

可以通过串联字符串常量和变量来构建命令。 串联操作的符号只是一个空格。

要将命令传输到另一个应用程序,有一个地址声明。 例如,在环境中使用XEDIT文本编辑器时,为了不执行XEDIT命令,而是执行OS(CMS),必须执行以下操作:

 address cms 'list * * * (stack' 

5. CMS实施了API来访问OS命令堆栈,Rexx也使用该API交换数据。 上面的命令将文件的结果列表返回到堆栈,脚本可以从中拾取它们,并读取一行作为标准输入。 在某些方面,这类似于Unix管道,但与它们有所不同。 管道仍然是字节流,而CMS中的堆栈是字符串的集合。 通常,这是Unix意识形态与IBM操作系统之间的典型区别,在IBM操作系统中,文件主要面向固定或可变字符串(但同时已知)长度。

6.作为API的一部分,应用程序可以访问Rexx脚本变量,他们可以读取和修改它们。 这是交换数据的另一种方式。

7.实施了一种相当有效的任意精度算法。 任意-这意味着例如100个字符或更多-多少内存就足够了。

8.内存管理-自动。 例如,尽管有一个drop操作符可以删除变量(关联数组或其元素)的值,但是在任何情况下,您都不需要处理指针和块大小。

9.作为唯一但同时非常通用的数据结构,有关联数组,例如,与javascript非常相似。 也就是说,如果编写a.1,则它是键为1的数组a的元素。如果编写ab,则这是键为b的元素。

假设将单词添加到字典的过程:

 add_word: procedure expose dictionary. parse arg w n = dictionary.0 + 1 dictionary.n = w dictionary.0 = n return 

该片段中的dictionary变量是我们的关联数组。 该过程不返回此数组,而是使它可以从外部访问(使用暴露)。 dictionary.0存储字典中的元素数(这只是一个约定,正如您所看到的,我们自己执行),dictionary.n是字典的第n个字。

10.该语言没有低级访问内存或OC API的权限,尽管原则上很可能为它编写类似的东西。 我可以举几个语言扩展的例子,一个设计用于SQL / DS数据库(DB2),第二个设计用于在VM / SP中的虚拟机之间交换消息。 也就是说,原则上您可以布置为DSL的所有内容都可以实现。

应用程序中的REXX支持


除了CMS本身,REXX还立即支持主XEDIT文本编辑器。 它允许您在REXX上编写宏,该宏可以挂在功能键上,也可以从命令行或所谓的命令中调用命令。 在文本行的旁边输入“ Prefix”命令,并允许对其进行操作。 例如,使用d命令可以删除输入的行,复制或移动命令以及其他命令。 例如,REXX上的宏可以将字符串转换为大写或小写。

支持我的语言的第二个应用程序称为DMS(CMS的显示管理系统(DMS / CMS)),它是用于开发由面板组成的交互式程序的工具。 在REXX中,可以选择一种预先绘制的表格,在其字段中填入值,然后在屏幕上显示。 用户按下功能键后,程序将收到控制权,并且REXX变量包含已更改字段的值。 我将DMS的最接近的功能类似物称为HTML及其形式。 就开发的复杂性(简单性)而言,这也许甚至更容易一些,尽管HTML在表达能力方面无疑是赢家(例如,DMS中根本没有图像,文本终端可以理解)。

另一个值得一提的应用程序称为ISPF。 但是它已经比DMS宽得多,并且它看起来更像是针对文本终端进行了调整的集成开发环境。 是的,文本编辑器也已在REXX中编程。

从VM / SP 6开始,CMS引入了用于在终端屏幕上创建可变大小的虚拟窗口并在其中显示文本的工具。 对应于REXX的API出现了(更确切地说,它主要是REXX的扩展)。

REXX的另一个非常有趣的应用是所谓的自动操作器。 这是一个在操作系统操作员的虚拟机中运行的应用程序,该程序接收通常发送到操作员终端的所有消息,并允许它们由软件处理。 命令处理程序-REXX脚本。 因此,例如,可以为许多人提供一些操作员功能,这些人只需向操作员的虚拟机发送消息,然后处理程序(代表特权用户,操作员)就可以为他们执行一些命令。 好吧,例如,我在系统中安装了磁盘或磁带卷。

但是可能性不仅限于如此简单的事情。 例如,如果消息不在系统中,则无法将消息发送给用户。 将其发送给自动操作员,将其保存在队列中,然后(在收到用户登录消息后)将其发送给需要的人。 实际上,这是带有小REXX脚本的简单电子邮件实现。

发展影响


我要说的是,随着VM / SP 3中REXX的出现,我们开始在上面写过以前在PL / 1上写过的重要内容。 这是一种功能强大且同时仍然很简单的语言,可让您正确构造相对较大的应用程序。 首先,当它用作DSL时,可能是由于其集成功能。

完成数据库查询(SQL / DS),显示屏幕表单,读取和写入文件的能力涵盖了业务应用程序开发需求的重要部分。

显然,许多人喜欢这种语言。 他当时在OS / 2中,在Amigami,Windows下以及其他许多地方。 后来有带有对象扩展的对象REXX和用于JVM的NetREXX。 最主要的是,这种语言仍然存在。 通常,如果我今天必须选择编写脚本的内容,那么考虑使用Rexx,bash,完全鸟语的cmd.exe-我肯定会选择第一个。 但是与已经较新的语言(例如Perl,Python和许多其他许多语言)相比,一切都不那么明显。 可以说,Rexx关于将命令和变量传输到运行时的想法很好-但是,以COM为导向的面向对象的想法,仍然更具实用性。

尽管有40年的历史,但仍在IBM z OS中使用,据Wikipedia称,这本语言书是在2012年左右发布的。对于不同的OS,可以下载实时实现并自己尝试。

Source: https://habr.com/ru/post/zh-CN457182/


All Articles