Ja! Es gibt einen großen Unterschied zwischen diesen Operationscodes. Die RPG Reference manual ist ein guter Anfang.
Es ist wichtig zu verstehen, dass RPG eine stark typisierte Sprache ist. Eine gegebene Variable wird als bestimmter Typ mit einer bestimmten Größe deklariert und ist dauerhaft, bis das Programm neu kompiliert wird. Für Zeichenvariablen sind nur Zeichenoperationen zulässig. Bei numerischen Variablen sind nur numerische Operationen zulässig. Der Compiler verbietet Operationen, die nicht zum Variablentyp gehören.
MOVE (und die Varianten MOVEL und MOVEA) sollen Bytes im Speicher verschieben (kopieren). Ein beabsichtigter Nebeneffekt einiger MOVE-Operationen ist die Konvertierung zwischen Zeichendatentyp und numerisch. Es würde ein Buch benötigen, um die unzähligen Verwendungen zu beschreiben, die MOVEx hat, aber jeder einzelne ist eng mit der Tatsache verbunden, dass er Bytes von diesem Speicherort zu diesem Speicherort verschiebt (kopiert).
EVAL hat eine ganz andere primäre Funktion: EVAL dient zur Auswertung eines Ausdrucks. Die meisten Sprachen erlauben einen Ausdruck wie BASICs . Im alten (sehr alten) RPG gab es keine Ausdrücke. Jede Codezeile hat eine und nur eine Berechnung ausgeführt. Man könnte diese Zahl HINZUFÜGEN, oder COMPare diese Variable dazu. Wenn wir die obige Berechnung in (sehr alt) RPG umzusetzen hätten, würden wir brauchten etwas wie haben:
C X MULT X N
C N ADD Y N
C N ADD Z N
mit EVAL, können wir dies tun: EVAL N = X*X + Y + Z
Es ist wichtig zu verstehen, dass diese Bewertung den Compiler erfordert Erstellen Sie einige interne Arbeitsvariablen, um die Zwischenergebnisse zu speichern. Die numeric precision dieser Zwischenfelder ist wichtig zu verstehen, bevor Sie alten Code willy-nilly konvertieren. Das liegt daran, dass die Operationen MULT und ADD mit festem Formatcode möglicherweise sehr leise abgeschnitten werden, EVAL jedoch einen Überlauf signalisiert.
Warum habe ich so viel Zeit damit verbracht, über Ausdrücke und EVAL zu sprechen? Weil einer der möglichen Ausdrücke 'diese Variable zu diesem kopieren' ist. EVAL wird NICHT konvertieren zwischen Datentypen. Wenn Sie konvertieren müssen, müssen Sie Code wie %dec()
oder %editc()
dafür bereitstellen.
Aus diesem Grund wird MOVE auch in neueren Codes verwendet. Jemand hat es vorgezogen, dass der Compiler die impliziten Typkonvertierungen mit MOVE ausführt, anstatt explizite Ausdrücke zu schreiben, um sie mit EVAL auszuführen.
Nebenbei ist sogar EVAL datiert. Die aktuelle (7.1) Version von RPG erlaubt völlig freie Formularspezifikationen. Kein 'Spezifikationstyp' in Spalte 6, nein/frei oder/endfrei: aber vollständig freie Formulardatei, Daten und Berechnungsbeschreibungen. Ältere Versionen wie 5.4 erlauben Freiformberechnungen nach einer/free-Anweisung. Ich habe in 10 Jahren keine feste Formberechnungslinie geschrieben. EVAL ist (meistens) optional in jedem aktuellen Compiler.
Bitte sehen Sie die Diskussion hier: http://archive.midrange.com/rpg400-l/200501/msg00329.html – Dennis