• [^] # 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é à 2.

    Côté statique

    with ada.text_io;use ada.text_io;
    procedure test_int_ada is
    begin
     put_line (natural'image(natural'last+1)); -- demander l'affiche du dernier naturel + 1 
    end test_int_ada;

    renvoie à la compilation:
    test_int_ada.adb:4:39: value not in range of type "Standard.Integer"
    test_int_ada.adb:4:39: static expression fails Constraint_Check

    Côté dynamique:

    with ada.text_io;use ada.text_io;
    procedure test_int_ada is
     i : natural := natural'last-1;
    begin
     for j in 1..2 loop
     i := i +1;
     end loop;
     put_line (i'img);
    end test_int_ada;

    Renvoie:
    raised CONSTRAINT_ERROR : test_int_ada.adb:6 overflow check failed

    Donc non le type natural n'est pas du tout cyclique. Mais...

    Ada gère les types modulaires

    Par exemple, si tu écris :

    type my_mod_7 is mod 7; -- ce type représente les éléments de Z/7Z
    [...]
    put_line (my_mod_7'img (my_mod_7'mod(8))); -- on affiche le représentant de la classe de 8

    alors ça t'affiche 1.

    Ada fait dont exactement ce qu'on lui demande dans la mesure du réalisable avec les types primitifs gérables par la machine.
    Si on veut un comportement modulaire, on définit comme ci-dessus le type, et on dispose de toute l'arithmétique (cohérente) sur ce type dans les limites offertes par la machine.
    Maintenant, si on veut dépasser les limites du jeu d'instruction du processeur et qu'on veut faire de l'arithmétique multi-précision ils existe bien évidemment un binding Ada pour gmp.

    Comparaison avec C++

    #include <iostream>
    int main()
    {unsigned char u=254;
     while (u<=255) u+=2;
     std::cout<<u;
     return 0;
    }

    Aucun warning, aucune erreur de compilation, aucune exception à l'exécution, et le programme boucle à l'infini car 'unsigned char' est vu comme un type modulaire (modulo 2^8) ce qui ne s'appuie sur aucun fait explicable (à part le fait de vouloir représenter la table ASCCI comme un cercle). Plus intéressant, il est impossible d'arriver à un tel comportement avec Ada.