Partage
  • Partager sur Facebook
  • Partager sur Twitter

Qu'est-ce qu'une "implémentation" ?

On retrouve souvent "...dépend de l'implémentation..."

    14 septembre 2021 à 15:03:29

    Bonjour le monde,

    Je suis actuellement entrain de lire le livre "Le guide complet du langage C" et souvent, l'auteur rappel une règle en faisant référence à l'implémentation : 

    "... mais on ne perdra pas de vue que celui-ci peut varier d’une implémentation à une autre...".

    S'agit-il du système d'exploitation ?

    De la version du GCC ? 

    De "l'implémentation" d'une norme en fonction de la version ...

    J'ai vraiment du mal à en saisir complètement le sens.

    • Partager sur Facebook
    • Partager sur Twitter
      14 septembre 2021 à 15:17:25

      La comme ça , une phrase hors contexte , ça peut être tout et n'importe quoi.
      • Partager sur Facebook
      • Partager sur Twitter
        14 septembre 2021 à 15:18:02

        Hello,

        C'est un terme très générique. Une implémentation c'est simplement «un programme/une bibliothèque/une fonctionnalité/un algorithme» particulier dont on considère le code.

        Linux est une implémentation d'un OS unix, freebsd en est une autre implémentation.
        GCC est une implémentation d'un compilateur C, clang en est une autre.
        Voici trois implémentations de la fonction swap qui échange deux nombres en C :

        void swap_v1(int *a, int *b)
        {
            int tmp=*a;
            *a=*b;
            *b=tmp;
        }
        
        void swap_v2(int *a, int *b)
        {
            *a ^= *b;
            *b ^= *a;
            *a ^= *b;
        }
        
        void swap_v3(int *a, int *b)
        {
            int olda=*a;
            int oldb=*b;
            *a=oldb;
            *b=olda;
        }

        Tu as également différentes implémentations de la libc, comme la gnu libc, musl, bionic c, diet c …

        suivant l'implémentation tu n'auras pas forcément les mêmes comportements car certains sont laissés libre à l'implémentation par la norme. Par exemple deux versions différentes de la même bibliothèque ou deux implémentations différentes de la libc peuvent choisir entre un quicksort, un mergesort, un timsort ou tout autre algorithme de tri pour implémenter la fonction qsort (tant que l'algo est en O(n log n) si mes souvenirs ne me font pas défaut).


        Edit : typos

        -
        Edité par White Crow 14 septembre 2021 à 15:19:47

        • Partager sur Facebook
        • Partager sur Twitter
          14 septembre 2021 à 16:56:24

          Ce terme est un anglicisme. Un synonyme en français serait : "réalisation", "codage" ou plus génériquement "mise en oeuvre".

          Tu as une assez bonne définition des sens de cette expression là : https://fr.wiktionary.org/wiki/impl%C3%A9mentation

          Dans le contexte d'un livre sur l'apprentissage du langage C, il est probable que l'on te parle, d'un côté, de la norme standard définissant le langage. Cette norme définit un certain nombre de choses, plus ou moins précisément. Lorsque le norme du C ne définit pas quelque chose en particulier, c'est la personne (l'organisme) responsable de la conception et réalisation du compilateur C qui tranche et décide comment et quoi faire. Donc, d'un autre côté, ce type d'ouvrage peut te dire que tel ou tel aspect du langage dépend de son implémentation, c'est à dire, ici, de la façon dont le compilateur a été programmé.

          Par exemple, la norme du C définit le type time_t qui est le type utilisé par le résultat retourné par la fonction time() définie dans time.h. Le standard exige seulement qu'il s'agisse d'un type arithmétique fondamental susceptible de représenter un moment dans le temps.

          L'imprécision est volontaire, car l'utilisateur n'est pas sensé utiliser directement cette valeur, mais seulement au travers des fonctions de time.h qui permettent de la manipuler.

          time_t Time type Alias of a fundamental arithmetic type capable of representing times, as those returned by function time. For historical reasons, it is generally implemented as an integral value representing the number of seconds elapsed since 00:00 hours, Jan 1, 1970 UTC (i.e., a unix timestamp). Although libraries may implement this type using alternative time representations. Portable programs should not use values of this type directly, but always rely on calls to elements of the standard library to translate them to portable types.

          https://www.cplusplus.com/reference/ctime/time_t/

          Pour préserver la portabilité des programmes réalisés en langage C un développeur devrait éviter de baser son travail sur des comportements dépendant de l'implémentation du langage C.

          -
          Edité par Dlks 14 septembre 2021 à 16:57:47

          • Partager sur Facebook
          • Partager sur Twitter
            14 septembre 2021 à 23:32:03

            BfsSfb a écrit:

            Bonjour le monde,

            Je suis actuellement entrain de lire le livre "Le guide complet du langage C" et souvent, l'auteur rappel une règle en faisant référence à l'implémentation : 

            "... mais on ne perdra pas de vue que celui-ci peut varier d’une implémentation à une autre...".

            S'agit-il du système d'exploitation ?

            De la version du GCC ? 

            De "l'implémentation" d'une norme en fonction de la version ...

            J'ai vraiment du mal à en saisir complètement le sens.

            En général et en gros, en C, quand quelque-chose dépend de l'implémentation, alors elle dépend du compilateur (car le compilateur est une implémentation de la norme du langage). Mais souvent, l'implémentation du compilateur est influencée par le système d'exploitation, qui est influencé par le matériel.

            Pour prendre un cas concret, le nombre de bits du type int dépend de l'implémentation. On peut rencontrer des int de 16, 32, 64 bits... A priori, c'est le compilateur qui décide. Sauf que sur un système d'exploitation donné, en général tous les compilateurs choisissent le même nombre de bits que le compilateur du système, afin d'être plus compatible. Donc l'influence vient surtout du système (Windows 16 bits, Windows 32 bits, Windows 64 bits, Linux 32 bits, Linux 64 bits, etc.)

            Pour ce qui est de l'influence du matériel, sur un processeur de 32 bits on ne trouvera pas un système 64 bits, et donc on n'a guère de chance de tomber sur une implémentation avec des int de 64 bits.

            • Partager sur Facebook
            • Partager sur Twitter
              15 septembre 2021 à 0:27:19

              " A priori, c'est le compilateur qui décide. Sauf que sur un système d'exploitation donné, en général tous les compilateurs choisissent le même nombre de bits que le compilateur du système, afin d'être plus compatible. Donc l'influence vient surtout du système (Windows 16 bits, Windows 32 bits, Windows 64 bits, Linux 32 bits, Linux 64 bits, etc.)"

              Non , par exemple int fait 32 bits sur Windows/Linux (32 ou 64 bits).
              D'ailleurs GCC a tendance à mettre le int le plus souvent en 32 bits , même si le proc est 16 ou 64 bits (par exemple sur le M68000 qui est un proc 16 bits).

              Bien sur on peut configurer GCC pour que int fait 64 bits, mais à ma connaissance ,ce n'est pas une implémentation courante.

              -
              Edité par HelbaSama 15 septembre 2021 à 0:29:03

              • Partager sur Facebook
              • Partager sur Twitter
                15 septembre 2021 à 9:54:38

                Merci pour toutes informations, je commence à y voir un peu plus clair.

                Je m'aventure dans quelque chose remplit d'abstraction, et parfois il faut que j'accepte de ne pas vraiment comprendre.

                Je pense qu'il faut que j'apprenne à ne pas descendre trop vers le bas, dans la compréhension de certaines choses, mais que je me resigne, du moins pour l'instant à accepter les choses telles qu'elles sont.

                Merci à vous ! Et j'espère que vos réponses serviront à d'autres personnes :)

                • Partager sur Facebook
                • Partager sur Twitter
                  15 septembre 2021 à 11:28:47

                  BfsSfb a écrit:

                  t souvent, l'auteur rappel une règle en faisant référence à l'implémentation : 

                  "... mais on ne perdra pas de vue que celui-ci peut varier d’une implémentation à une autre...".

                  S'agit-il du système d'exploitation ? De la version du GCC ? (etc)

                  Une implémentation : une réalisation particulière.

                  Comme dit plus haut, dans le langage C il y a un type "int" pour représenter des entiers. 

                  Ce qu'en dit la norme du langage, c'est que le les entiers doivent au moins contenir les valeurs

                  #define INT_MAX +32767
                  #define INT_MIN -32767
                  ce qui implique au moins 16 bits.

                  Selon l'implémentation, le compilateur peut représenter les int sur 32 bits, 64 bits, etc. Ca dépendra du compilateur, des options qu'on lui donne etc.


                  Dans la phrase "celui-ci peut varier", il faudrait savoir de quoi on parle pour pouvoir en dire plus.

                  -
                  Edité par michelbillaud 15 septembre 2021 à 11:31:08

                  • Partager sur Facebook
                  • Partager sur Twitter
                    17 septembre 2021 à 22:24:28

                    HelbaSama a écrit:

                    " A priori, c'est le compilateur qui décide. Sauf que sur un système d'exploitation donné, en général tous les compilateurs choisissent le même nombre de bits que le compilateur du système, afin d'être plus compatible. Donc l'influence vient surtout du système (Windows 16 bits, Windows 32 bits, Windows 64 bits, Linux 32 bits, Linux 64 bits, etc.)"

                    Non , par exemple int fait 32 bits sur Windows/Linux (32 ou 64 bits).
                    D'ailleurs GCC a tendance à mettre le int le plus souvent en 32 bits , même si le proc est 16 ou 64 bits (par exemple sur le M68000 qui est un proc 16 bits).

                    Tu oublies qu'il n'y a pas que la taille du int qui dépend de l'implémentation... la taille d'un long n'est pas pareil sur Linux 64 bits (modèle LP64) et Windows 64 bits (modèle LLP64). Voir https://unix.org/version2/whatsnew/lp64_wp.html

                    Concernant le MC68000, il a un jeu d'instructions 32 bits, comme le 68020, 68040, 68060. Le MC68000 n'était 16 bits qu'au niveau du matériel (ALU, bus de données) mais cela était transparent pour le programmeur (sauf question vitesse bien sûr).

                    • Partager sur Facebook
                    • Partager sur Twitter
                      18 septembre 2021 à 7:52:44

                      Pour le M68000 , je le sais bien ,vu que je code principalement en assembleur sur ce proc (même si ça m'arrive à faire du C dessus ).
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Qu'est-ce qu'une "implémentation" ?

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      • Editeur
                      • Markdown