JMP etiquette
Elles suffisent pour générer du code pour les structures conditionnelles et itératives
On suppose que l'expression booléenne possède un attribut place (lieu) et que les valeurs booléennes sont représentées par un octet qui vaut 1 (vrai) ou 0 (faux).
Première idée:
I ® if E then I
I1.etiquette = nouvelle.etiquette()
I1.code = E.code
||gen(BZ, E.place, ¢,¢, I1.etiquette)
||I2.code||gen(I1.etiquette )
Pour éviter la possibilité d'avoir plusieurs étiquettes sur une instruction on peut ajouter un attribut suit pour l'instruction qui suit une I.
I ® if E then I
I2.suit = I1.suit
I1.code = E.code ||
gen(BZ, E.place, ¢,¢, I1.suit)
||I2.code
I® I I
I2.suit = nouvelle.etiquette()
I3.suit = I1.suit
I1.code = I2.code ||gen(I2.suit )
||I3.code
Pareil pour if-then-else
L1 Expression.code BZ Expression.place, L2 Instruction.code JMP L1 L2et
L1 Instruction.code Expression.code PBP Expression.place, L1Le deuxième est plus court et plus efficace!
JMP L2 L1 Instruction.code L2 Expression.code PBP Expression.place, L1est une version du code de while qui est plus efficace (si le nombre moyen d'itérations est supérieur à 1!)
A noter les deux choix orthogonaux pour les boucles:
nombre minimal d'itérations =0 ou 1? (un choix algorithmique)
écrire la condition de terminaison ou la condition de continuation?
(un choix stylistique)
Pascal et C ont chacun deux des quatre possibilités
(B)CPL en avaient les 4.
plus les règles de calcul pour E.suit...
ET et OU sont comme les opérateurs arithmétiques
Donc l'idée de deux attributs hérités, l'étiquette à laquelle
il faut aller dans le cas d'un résultat vrai (ou faux);
Aucun besoin de représentation explicite de la valeur calculée.
GO $X, $Y, $Z