• [^] # Re: Du haut niveau pour gérer correctement du bas niveau

    Posté par (site web personnel) . En réponse au journal Un décalage de 64 bits, ça vous inspire comment ?. Évalué à 1.

    De l'arithmétique sur \mathbb{Z} ? Vraiment ? Ca me paraît impossible.

    Ada fait de l'arithmétique exacte dans \mathbb{Z}/N\mathbb{Z} avec N naturel compris entre 1 et 2^{64}. C'est déjà pas mal du tout (avec une arithmétique optimisée au plus bas niveau pour N=8, 16, 32 ou 64. Il y a la notion de type modulaire pour cela.

    Pour faire de l'arithmétique sur un minuscule sous ensemble de \mathbb{Z} (j'imagine que c'est ce dont tu parles) il y a le type (et des sous types) de Integer. Les opérations arithmétiques peuvent générer des exceptions si les résultats ne sont pas représentables (sortent des plages de représentation). Dans tous les cas, aucun résultat n'est donné s'il est incohérent avec l'arithmétique (ce qui n'est pas le cas de OCaml, C, C++, Pascal etc qui laissent des comportements indéfinis, sources de résultats inattendus pour celui qui n'a pas lu les moindres détails de la doc, et ils sont nombreux ceux là). Ceci est fait au prétexte de l'optimisation sur certains processeurs. Or ce prétexte s'explique par le fait que ces langages ne disposent pas de la notion de sous type contraint.

    En Ada, il y a deux options laissées au développeur:

    • être certain que les opérations ne provoquent aucun overflow et demander au compilo, par une pragma clairement écrite dans le code source, de ne pas les gérer pour optimiser les calculs.

    • laisser le compilo vérifier les "constraint errors" ce qui ralentit l'exécution mais permet de s'apercevoir, pendant la conception, d'éventuelles erreurs de programmation.

    Les choses sont ainsi parfaitement claires, toujours optimisées bas niveau (si besoin), aucun appel ne provoque de résultat indéfini silencieusement. A mon âge, quand je vois un langage qui ne propose pas ça, j'ai du mal à le considérer de "haut niveau" (même s'il possède d'autres qualités très intéressantes par ailleurs).

    C'est extrêmement formateur. Combien d'étudiants déclarent un integer pour manipuler des entiers sans se soucier de la cohérence arithmétique des résultats ? Chaque année, en C ou Pascal, avec les collègues, on en voit passer des boucles infinies par méconnaissance de la modularité du type integer dans ces langages de "haut niveau".