我最近进入了 IBM 的 RPG 世界,因此在编写一些代码并查看其他人的代码时,我发现有些人使用 Eval,而另一些人则使用 Move 来完成相同的事情。它们之间有什么区别吗?
谢谢。
我最近进入了 IBM 的 RPG 世界,因此在编写一些代码并查看其他人的代码时,我发现有些人使用 Eval,而另一些人则使用 Move 来完成相同的事情。它们之间有什么区别吗?
谢谢。
是的!这些操作代码之间有很大的不同。RPG 参考手册是一个很好的起点。
重要的是要了解 RPG 是一种强类型语言。给定的变量被声明为某种类型,具有一定的大小,并且在重新编译程序之前是永久的。对于字符变量,只允许字符操作。对于数值变量,只允许数值运算。编译器禁止不属于变量类型的操作。
MOVE(以及变体 MOVEL 和 MOVEA)旨在在内存中移动(复制)字节。某些 MOVE 操作的有意副作用是在字符数据类型和数字之间进行转换。描述 MOVEx 的无数用途需要一本书,但每一个用途都与它将字节从该内存位置移动(复制)到该内存位置这一事实密切相关。
EVAL 有一个非常不同的主要功能:EVAL 旨在评估表达式。大多数语言都允许使用 BASICs 之类的表达式LET N = X^2 + Y + Z
。在旧的(非常旧的)RPG 中,没有表达式。每一行代码只做了一次计算。可以将这个数字加到那个上,或者将这个变量与那个相比较。如果我们必须在(非常古老的)RPG 中实现上述计算,我们将需要类似的东西:
C X MULT X N
C N ADD Y N
C N ADD Z N
使用 EVAL,我们可以做到这一点:EVAL N = X*X + Y + Z
理解此 EVALuation 需要编译器创建一些内部工作变量以保存中间结果,这一点至关重要。在随意转换旧代码之前,了解这些中间字段的数值精度很重要。这是因为固定格式的代码操作 MULT 和 ADD 可能会很安静地截断,但 EVAL 会发出溢出信号。
为什么我花了这么多时间谈论表达式和 EVAL?因为其中一种可能的表达方式是“将这个变量复制到那个”。EVAL不会在数据类型之间进行转换。如果您需要转换,您将需要提供类似%dec()
或%editc()
执行此操作的代码。
这就是为什么你会在最近的代码中看到 MOVE 的原因;有人更喜欢让编译器使用 MOVE 进行隐式类型转换,而不是编写显式表达式来使用 EVAL 进行转换。
顺便说一句,即使是 EVAL 也是过时的。当前 (7.1) 版本的 RPG 允许完全自由的形式规范。第 6 列中没有“规范类型”,没有 /free 或 /end-free:但完全自由格式的文件、数据和计算描述。像 5.4 这样的旧版本允许在 /free 语句之后进行自由形式的计算。我已经有 10 年没有写过固定形式的计算线了。EVAL 在任何当前编译器中(大部分)都是可选的。
我喜欢巴克的回答,但解释起来有点不同......
MOVE的结果只能通过检查源变量和目标变量的属性才能知道;同时深入了解 MOVE 在各种场景中的工作原理。MOVE 有很多隐含性。
而 EVAL 基本上以一种方式工作。您最终可以得到与 MOVE 相同的结果,但您必须明确利用各种内置函数(也称为 BIF),例如 $dec()、%char()、%subst()。
从可维护性的角度来看,EVAL 胜出。因此,IBM 离开了 MOVE 及其兄弟姐妹的自由格式。