Ce sont des instructions très bas niveau, cela permet d'avoir l'instruction la plus efficace sur chaque architecture et il est de la responsabilité de l'appelant de vérifier que le second paramètre se trouve bien dans les bornes où la fonction fait sens sans ambiguïté.
Tu peux très bien faire, comme en Ada, ou en Haskell, et laisser une instruction de haut niveau de décalage et une autre de bas niveau plutôt que de se contenter des limitations de bas niveau liées au fonctionnement du processeur.
Ce programme créée un type amount (sous type de natural) dont les éléments sont nécessairement entre 0 et 63 (si ce n'est pas le cas, une exception est levée).
Puis il crée une fonction de décalage qui permet au processeur d'optimiser au maximum le shift_right. Qu'est-ce qu'on y gagne ?
Celui qui code a maintenant obligatoirement conscience du problème du décalage qui doit être inférieur à 64 puisque s'il ne fournit pas un 'a' dans 0..63 alors le programme lancera une exception à l'exécution (et à la compilation, si la règle n'est pas respectée statiquement, ça passera pas)
La fonction my_clean_shr peut maintenant être optimisée par le compilateur et avoir la même efficacité que ce qu'on peut faire salement en C sans prévenir qui que ce soit.
Une fois le code pondu et testé, il sera toujours possible par la suite, de retirer l'option de compilation de vérification des ranges (avec l'option -gnatp donnée à gcc).
Au final, on a une fonction de haut niveau optimisée comme si on faisait du C mais avec du code qui est clair pour tout relecteur du code.
On pourra aussi plus simplement utiliser le décalage (nécessairement un peu plus lent) fourni par Ada qui ne souffre lui d'aucun problème de définition et renvoie toujours un résultat mathématiquement cohérent .
Ce n'est pas parce qu'on manipule des concepts de bas niveau qu'on doit les traiter en restant bas niveau au niveau du langage. J'aurais même tendance à dire le contraire. Pour cela il faut utiliser un langage qui le permet (c'est pour ça que j'adore l'Ada, vous l'aurez remarqué :) )
[^] # Re: Primitive en C pour OCaml
Posté par snowball (site web personnel) . En réponse au journal Un décalage de 64 bits, ça vous inspire comment ?. Évalué à 6.
Tu peux très bien faire, comme en Ada, ou en Haskell, et laisser une instruction de haut niveau de décalage et une autre de bas niveau plutôt que de se contenter des limitations de bas niveau liées au fonctionnement du processeur.
Exemple, en Ada, tu peux écrire ceci
Ce programme créée un type amount (sous type de natural) dont les éléments sont nécessairement entre 0 et 63 (si ce n'est pas le cas, une exception est levée).
Puis il crée une fonction de décalage qui permet au processeur d'optimiser au maximum le shift_right. Qu'est-ce qu'on y gagne ?
Au final, on a une fonction de haut niveau optimisée comme si on faisait du C mais avec du code qui est clair pour tout relecteur du code.
On pourra aussi plus simplement utiliser le décalage (nécessairement un peu plus lent) fourni par Ada qui ne souffre lui d'aucun problème de définition et renvoie toujours un résultat mathématiquement cohérent .
Ce n'est pas parce qu'on manipule des concepts de bas niveau qu'on doit les traiter en restant bas niveau au niveau du langage. J'aurais même tendance à dire le contraire. Pour cela il faut utiliser un langage qui le permet (c'est pour ça que j'adore l'Ada, vous l'aurez remarqué :) )