2016-04-26 3 views
2

Pourquoi n'utilise-t-on pas les indicateurs de processeur pour une exécution conditionnelle? Au lieu de cela, le résultat d'une comparaison est placé sur la pile de paramètres. Est-ce parce que la boucle de l'interpréteur interne peut modifier les drapeaux lors de la prochaine instruction? Ou est-ce simplement pour abstraire la logique conditionnelle?Drapeaux de processeur et de processeur

E.g. sur x86, le registre flags contient les résultats d'une comparaison car la plupart des processeurs auront tous un registre flags.

Répondre

2

Cela dépend du Forth et du niveau d'optimisation.

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

Dans 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 

Dans gforth:

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

Comme est Forth un langage à base de pile, afin de définir les opérations à l'intérieur du langue, vous devez définir le résultat pour modifier quelque chose qui est à l'intérieur de la langue. Le registre des drapeaux n'est pas dans la langue. Évidemment, dans le cas d'un compilateur optimiseur, toute approche qui donne le même résultat final est également acceptable.

+0

Bonne réponse. Cela signifie d'utiliser le registre flags comme une optimisation, la quatrième machine virtuelle doit être modifiée pour inclure le registre de drapeaux dans le cadre de la définition, en cassant le code existant. Cela peut ou peut ne pas être avantageux. La vitesse peut être augmentée au prix de la complexité. – Daryl

+1

@Daryl, l'optimisation du compilateur n'a pas besoin de modifications au niveau du code source, c'est-à-dire qu'il n'est pas nécessaire d'inclure des registres dans les définitions. Le compilateur Forth génère simplement un code machine qui utilise des indicateurs flags au lieu de stack dans certains cas. – ruvim