Comme le titre l'indique,
Une réponse typique que l'on obtiendrait est:
La règle qui autorise toutes les transformations de code qui ne changent pas le comportement observable du programme
De temps en temps, nous continuons à obtenir des comportements de certaines implémentations qui sont attribués à cette règle. Plusieurs fois à tort. Alors, quelle est exactement cette règle. La norme ne mentionne pas clairement cette règle sous la forme d'un article ou d'un paragraphe, alors qu'est-ce qui relève exactement de cette règle? Cela me semble être une zone grise qui n'est pas définie en détail par la norme. Quelqu'un peut-il élaborer sur les détails en citant les références de la norme?
Remarque: baliser ceci comme C et C ++ à la fois, car il est pertinent pour les deux langages.
Réponses:
Quelle est la règle du « comme si »?
Le " comme si règle » définit essentiellement les transformations qu'une implémentation est autorisée à effectuer sur un programme C ++ légal. En bref, toutes les transformations qui n'affectent pas le " comportement observable d' un programme (voir ci-dessous pour une définition précise) sont autorisées.
Le but est de donner aux implémentations la liberté d'effectuer des optimisations tant que le comportement du programme reste conforme à la sémantique spécifiée par le standard C ++ en termes de machine abstraite.
Où la norme introduit-elle cette règle?
La norme C ++ 11 introduit la règle " comme si " au paragraphe 1.9 / 1:
En outre, une note explicative ajoute:
Que prescrit la règle exactement?
Le paragraphe 1.9 / 5 précise en outre:
Il vaut la peine de souligner que cette contrainte s'applique uniquement lors de "l'exécution d'un programme bien formé" , et que les résultats possibles de l'exécution d'un programme qui contient un comportement non défini ne sont pas contraints. Ceci est également expliqué au paragraphe 1.9 / 4:
Enfin, concernant la définition du " comportement observable ", le paragraphe 1.9 / 8 se lit comme suit:
Y a-t-il des situations où cette règle ne s'applique pas?
Au meilleur de ma connaissance, la seule exception à la règle " as-if " est l'élision de copie / déplacement, qui est autorisée même si le constructeur de copie, le constructeur de déplacement ou le destructeur d'une classe ont des effets secondaires. Les conditions exactes à cet effet sont spécifiées au paragraphe 12.8 / 31:
la source
En C11, la règle n'est jamais appelée par ce nom. Cependant C, tout comme C ++, définit le comportement en termes de machine abstraite. La règle as-if est dans C11 5.1.2.3p4 et p6 :
la source
En C, C ++, Ada, Java, SML ... dans tout langage de programmation bien spécifié en décrivant le (s) comportement (s) (généralement de nombreux possibles, non déterministes) d'un programme (exposé à une série d'interactions sur les ports d'E / S) , il n'y a pas de règle du `` comme si '' distincte .
Un exemple de règle distincte est celle qui dit qu'une division par zéro lève une exception (Ada, Caml) ou un déréférencement nul lève une exception (Java). Vous pourriez changer la règle pour spécifier autre chose et vous vous retrouveriez avec une langue différente (que certains appelleraient plutôt un "dialecte" (*). Une règle distincte est là pour spécifier certaines utilisations distinctes d'un langage de programmation comme un les règles grammaticales couvrent certaines constructions de syntaxe.
(*) Un dialecte selon certains linguistes est une langue avec une "armée". dans ce contexte, cela pourrait signifier un langage de programmation sans comité et une industrie spécifique d'éditeurs de compilateurs.
La règle as-if n'est pas une règle distincte ; elle ne couvre aucun programme en particulier et n'est même pas une règle qui pourrait être discutée, supprimée ou modifiée de quelque manière que ce soit : la soi-disant «règle» réitère simplement que la sémantique du programme est définie, et ne peut être portable (universellement) défini, en terme d'interactions visibles d'une exécution du programme avec le monde "extérieur".
Le monde externe peut être des interfaces d'E / S (stdio), une interface graphique, voire un interpréteur interactif qui produit la valeur résultante d'un pur langage applicatif. En C et C ++, cela inclut les accès (vaguement spécifiés) aux objets volatils, ce qui est une autre façon de dire que certains objets à un moment donné doivent être représentés en mémoire strictement selon l'ABI (Application Binary Interface) sans jamais mentionner l'ABI explicitement.
La définition de ce qu'est une trace d'exécution , également appelée comportement visible ou observable, définit ce que l'on entend par "règle comme si". La règle as-si tente de l'expliquer, mais ce faisant, elle confond les gens plus qu'elle ne clarifie les choses car elle donne l'expression d'être une règle sémantique supplémentaire donnant plus de marge de manœuvre à l'implémentation.
Résumé:
la source