2014-03-25 20 views
6

Ich bin vor kurzem in die RPG-Welt von IBM gekommen, also während ich etwas Code schreibe und den Code anderer Leute überprüfe, habe ich festgestellt, dass einige Eval und einige andere Move verwenden, um die gleichen Dinge zu erreichen. Gibt es einen Unterschied zwischen ihnen?Was ist der Unterschied zwischen EVAL und MOVE in RPGLE

Danke.

+1

Bitte sehen Sie die Diskussion hier: http://archive.midrange.com/rpg400-l/200501/msg00329.html – Dennis

Antwort

15

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.

+0

Sie mit dieser Antwort Kumpel genagelt! Vielen Dank – Sebastian

+1

Dies ist eine nette Antwort, obwohl ich * Ziffern * und * Zeichen * hervorheben würde, wenn ich von 'MOVE' sprechen würde, und vermeide es * Bytes * und Speicher zu bringen. In den meisten Kontexten verhalten sich eine 3-Byte-gepackte Dezimalzahl und eine 5-Byte-dezimale Dezimalzahl ** beide ** wie eine 5-stellige/5-stellige Entität in Bezug auf "MOVE". –

+1

Es könnte nützlich sein, Erwähnung von (1) Padding und (2) Recht-Ausrichtung für 'MOVE' zu erwähnen. Beide sind wichtige Elemente der Operation, wenn Quell- und Zielfelder unterschiedliche Größen haben. – user2338816

6

Ich mag Buck Antwort, aber es ein wenig anders zu erklären ...

Die Ergebnisse der MOVE kann nur durch die Untersuchung der Eigenschaften der Quell- und Zielvariablen bekannt sein; Darüber hinaus weiß man genau, wie MOVE in verschiedenen Szenarien funktioniert. Es gibt eine Menge Selbstverständlichkeit gegenüber MOVE.

Während EVAL funktioniert grundsätzlich in eine Richtung. Sie können mit den gleichen Ergebnissen wie mit MOVE enden, aber Sie müssen explizit die verschiedenen eingebauten Funktionen (alias BIFs) wie $ dec(),% char(),% subst() nutzen.

Aus Sicht der Wartbarkeit gewinnt EVAL. Aus diesem Grund verließ IBM MOVE und seine Geschwister aus dem freien Format.