2016-04-26 14 views
2

Warum verwendet Forth keine Prozessor-Flags für die bedingte Ausführung?Forth- und Prozessor-Flags

Stattdessen wird das Ergebnis eines Vergleichs auf den Parameterstack gesetzt. Liegt es daran, dass die innere Interpreterschleife Flags ändern kann, wenn sie zur nächsten Anweisung geht? Oder ist es einfach, bedingte Logik zu abstrahieren?

z. auf x86 hält das Flag-Register Ergebnisse eines Vergleichs, da die meisten Prozessoren, wenn nicht alle ein Flag-Register haben werden.

Antwort

2

Es hängt von der Forth und dem Grad der Optimierung ab.

: tt 0 if ." true" else ." false" then ; 

In SwiftForth (x86_64 GNU/Linux):

see tt 
808376F 4 # EBP SUB     83ED04 
8083772 EBX 0 [EBP] MOV    895D00 
8083775 0 # EBX MOV     BB00000000 
808377A EBX EBX OR     09DB 
808377C 0 [EBP] EBX MOV    8B5D00 
808377F 4 [EBP] EBP LEA    8D6D04 
8083782 808379D JZ     0F8415000000 
8083788 804D06F ((S")) CALL   E8E298FCFF 
808378D "true" 
8083793 804C5BF (TYPE) CALL   E8278EFCFF 
8083798 80837AE JMP     E911000000 
808379D 804D06F ((S")) CALL   E8CD98FCFF 
80837A2 "false" 
80837A9 804C5BF (TYPE) CALL   E8118EFCFF 
80837AE RET       C3 ok 

In gforth:

see tt 
: tt 
    0 
    IF  .\" true" 
    ELSE .\" false" 
    THEN ; ok 
2

Wie weiter eine stapelbasierte Sprache ist, um die Vorgänge im Inneren des zu definieren, Sprache, müssen Sie das Ergebnis definieren, um etwas zu ändern, das innerhalb der Sprache ist. Das Flaggenregister ist nicht in der Sprache. Offensichtlich ist im Falle eines optimierenden Compilers jeder Ansatz, der das gleiche Endergebnis liefert, gleichermaßen akzeptabel.

+0

Große Antwort. Dies bedeutet, dass die vierte VM geändert werden muss, um das Flag-Register als einen Teil der Definition zu verwenden, wodurch der Legacy-Code aufgebrochen wird. Dies kann oder kann nicht vorteilhaft sein. Die Geschwindigkeit kann auf Kosten der Komplexität erhöht werden. – Daryl

+1

@Daryl, Optimierung Compiler braucht keine Änderungen auf der Quellcode-Ebene - d. H. Es ist nicht notwendig, Register als Teil der Definitionen enthalten. Der Forth-Compiler erzeugt nur Maschinencode, der in bestimmten Fällen Flags anstelle von Stacks verwendet. – ruvim

Verwandte Themen