RPGLE中EVAL和MOVE之间的区别是什么

时间:2014-03-25 17:00:44

标签: ibm-midrange rpgle rpg

我最近进入了IBM的RPG世界,所以在编写一些代码并查看其他人的代码时,我发现有些人使用Eval而其他一些人使用Move来完成同样的事情。它们之间有什么区别吗?

感谢。

2 个答案:

答案 0 :(得分:15)

是的!这些操作代码之间存在很大差异。 RPG Reference manual是一个很好的起点。

了解RPG是一种强类型语言非常重要。给定变量被声明为某种类型,具有一定的大小,并且在重新编译程序之前它是永久的。对于字符变量,仅允许字符操作。对于数字变量,仅允许数字运算。编译器禁止不属于变量类型的操作。

MOVE(以及变体MOVEL和MOVEA)用于在内存中移动(复制)字节。某些MOVE操作的故意副作用是在字符数据类型和数字之间进行转换。它需要一本书来描述MOVEx具有的无数用途,但每一个都与它从这个内存位置移动(复制)字节到该内存位置的事实密切相关。

EVAL具有非常不同的主要功能:EVAL旨在评估表达式。大多数语言都允许使用类似BASIC 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需要编译器创建一些内部工作变量以保存中间结果,这一点至关重要。在转换旧代码之前,这些中间字段的numeric precision非常重要。这是因为固定格式代码操作MULT和ADD可能会非常默默地截断,但EVAL会发出溢出信号。

为什么我花了这么多时间谈论表达和EVAL?因为其中一个可能的表达方式是将此变量复制到该'。 EVAL将 NOT 在数据类型之间进行转换。如果您需要转换,则需要提供%dec()%editc()等代码才能执行此操作。

这就是为什么你会在最近的代码中看到MOVE的原因;有人希望让编译器使用MOVE进行隐式类型转换,而不是使用EVAL来编写显式表达式。

顺便说一句,甚至EVAL都已过时了。当前(7.1)版本的RPG允许完全自由的表单规范。没有'规格类型'在第6列,no / free或/ end-free:但完全免费的表单文件,数据和计算描述。较早版本(如5.4)允许在/ free语句后进行自由格式计算。我还没有在10年内写出固定形式的计算线。在任何当前的编译器中,EVAL(大多数)都是可选的。

答案 1 :(得分:6)

我喜欢巴克的答案,但要解释一下......

只有通过检查源变量和目标变量的属性才能知道MOVE的结果;以及对各种情况下MOVE如何工作的深入了解。 MOVE有很多隐含性。

而EVAL基本上只有一种方式。您最终可以获得与MOVE相同的结果,但是您必须明确地利用各种内置函数(也称为BIF),例如$ dec(),%char(),%subst() 。

从可维护性的角度来看,EVAL获胜。因此IBM离开MOVE及其兄弟姐妹的原因是免费格式的。