IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Le langage de programmation C a 50 ans


Sujet :

C

  1. #41
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 82
    Points : 178
    Points
    178
    Par défaut
    Citation Envoyé par chrtophe Voir le message

    Dans ce cas pourquoi parle t'on de compilateurs simple passe et multipasse ?
    Voir par exemple : https://www.geeksforgeeks.org/single...ass-compilers/
    Il y a une note qui mentionne : Note: Single pass compiler almost never done, early Pascal compiler did this as an introduction.
    En fait un VRAI compilateur en une passe ça n'existe pas.
    Pour donner un ordre d'idées : un compilateur C (avec optimiseur), ça fait environ 80 à 100 Kls (Kilo lignes source) et un compilateur COBOL ça fait environ 250 Kls.
    Quand je cherche sur Internet ce qui est écrit sur le sujet, je suis effaré. Il y a surtout des montagnes de bêtises écrite et surtout dans Wikipedia.
    Un des seuls livres vraiment sérieux sur la construction des compilateurs est celui-ci : https://www.abebooks.fr/978032148681...0321486811/plp ()
    Aho et Ullman ont écrit en 72 et 73 deux livres qui sont, encore aujourd'hui, les bibles sur le sujet (je pense que ces livres sont introuvables aujourd'hui) :
    The Theory of Parsing, Translation, and Compiling, Vol. 1, Parsing. Prentice Hall, 1972. ISBN 0-13-914556-7
    The Theory of Parsing, Translation, and Compiling, Vol. 2, Compiling. Prentice-Hall, 1973. ISBN 978-0-13-914564-3

  2. #42
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 82
    Points : 178
    Points
    178
    Par défaut
    Citation Envoyé par WhiteCrow Voir le message

    J'espère qu'`a terme C disparaîtra, c'est même inéluctable. Mais pour cela il faut une rupture et pas une évolution, c'est sur ce point que C++ a échoué et que Rust finira peut être par percer.
    C ne disparaîtra pas car Unix est écrit en C et il y a des centaines de millions de logiciels écrits en C. Fortran qui a été le premier langage "évolué" n'a toujours pas disparu et je connais des bibliothèques utilisateur entièrement écrites en Fortran encore utilisées pour des calculs scientifiques de haut niveau qui requièrent une précision qui tend vers l'infini.. C++ n'a pas échoué et il est beaucoup utilisé dans le domaine militaire, par exemple
    J'espère que Rust ne percera pas ou alors il devra être grandement amélioré car il ne permet même pas l'héritage et donc pas les méthodes virtuelles qui sont indispensables dans l'approche objet. D'autre part la syntaxe de Rust est inutilement compliquée.
    Par ailleurs comment on fait ce genre d'optimisation en Rust (métaprogrammation, ce qui suit est du C++) :

    •exemple d'optimisation de calcul mathématique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    template<unsigned int N>
    struct Fact {
        enum {
            value = N * Fact<N - 1>::value
        };
    };
    template<>
    struct Fact<0> {
        enum {
            value = 1
        };
    };
    // x vaudra 24 avant même que le programme ne soit lancé; coût à l'exécution : 0
    unsigned int x = Fact<4>::value;
    •dans cet exemple, le calcul de factorielle est effectué à la compilation, conduisant à une exécution sans calcul

  3. #43
    Membre expérimenté
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Points : 1 376
    Points
    1 376
    Par défaut
    D'un point de vue évolutionnaire, nous sommes voués à disparaître, donc C aussi. Mettons ce pun de côté

    Comme je le rappelais un peu plus, oui C (= le langage + la libc) a un énorme succès, mérité ou non peu importe ; les faits sont là. C'est un opinion personnelle, voire un souhait, que C comme Fortran et d'autres (Lisp bien plus évolué et plus ancien que Fortran par exemple) aient une envergure qui va se réduire jusqu'à ne plus avoir du C sous forme de traces, un peu comme l'assembleur.

    Tu as une pensée, @Jacti, fortement orientée objet qui te font donner des arguments qui n'en sont pas. Quand tu écris :
    Citation Envoyé par Jacti Voir le message

    J'espère que Rust ne percera pas ou alors il devra être grandement amélioré car il ne permet même pas l'héritage et donc pas les méthodes virtuelles qui sont indispensables dans l'approche objet.
    tu pars implicitement du principe que l'approche objet est supérieure, universelle et qu'il faut la mettre partout. L'approche Rust te dit le contraire, elle te dit de penser autrement parce que l'approche objet a ses limites (… pourquoi mettre en avant les processus d'héritages alors qu'on lui préfère la composition ?). Mais cela pourra être développé dans une discussion intéressante hors sujet ici, car nous applaudissons tous le premier cinquantenaire de C.

    Quant à ton code factoriel … que penses-tu de la toute simple implémentation C suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <stdio.h>
     
    int fact(int n)
    {
        int res=1;
        for(int i=2; i<=n; res*= i, i++);
        return res;
    }
     
    int main(void)
    {
        printf("4! = %d\n", fact(4));
    }
    Si tu regardes le code obtenu sur Godbolt tu verras que la valeur affichée (24 en l'occurrence) est également calculée au runtime … Cela ne me permettrait-il pas de dire que ton code C++ montre une syntaxe inutilement compliquée ? que dans ton code C++ tu dois penser à plein de trucs dont tu n'as pas besoin en C en utilisant une autre approche plus simple ?

  4. #44
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 82
    Points : 178
    Points
    178
    Par défaut
    Citation Envoyé par WhiteCrow Voir le message
    Lisp bien plus évolué et plus ancien que Fortran par exemple
    C'est tout simplement faux. Fortran (1954) est antérieur à LISP (1959) : https://fr.wikipedia.org/wiki/Chrono..._programmation

    Citation Envoyé par WhiteCrow Voir le message
    pourquoi mettre en avant les processus d'héritages alors qu'on lui préfère la composition ?)
    La composition et l'héritage sont 2 concepts différents. On parle de composition quand un ou des attributs d'un objet est ou sont eux-mêmes des objets. On parle d'héritage quand un objet possède les même propriétés qu'un autre ou plusieurs autres objets auquel on ajoute des attributs et des méthodes.
    Exemple de composition : une automobile est composée d'une carrosserie, d'un moteur, de roues, etc.
    Exemple d'héritage : un employé, un cadre, un directeur... hérite d'un objet général, par exemple, salarié. Il serait absurde de dire qu'un salarié est composé d'un employé, d'un cadre ou d'un directeur
    Tu ne sembles pas vraiment au point sur l'approche objet (que je pratique depuis les premiers articles de Grady Booch en 1983 dans les revues de l'ACM)

    Citation Envoyé par WhiteCrow Voir le message
    Quant à ton code factoriel … que penses-tu de la toute simple implémentation C suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <stdio.h>
     
    int fact(int n)
    {
        int res=1;
        for(int i=2; i<=n; res*= i, i++);
        return res;
    }
     
    int main(void)
    {
        printf("4! = %d\n", fact(4));
    }
    Si tu regardes le code obtenu sur Godbolt tu verras que la valeur affichée (24 en l'occurrence) est également calculée au runtime … Cela ne me permettrait-il pas de dire que ton code C++ montre une syntaxe inutilement compliquée ? que dans ton code C++ tu dois penser à plein de trucs dont tu n'as pas besoin en C en utilisant une autre approche plus simple ?
    Ton code, comme tu le dit toi-même, s'exécute à "run-time". Le mien s'exécute à la compilation. C'est, évidemment, une différence énorme !
    Tu ne sembles pas comprendre le concept de métaprogrammation :
    https://fr.wikipedia.org/wiki/M%C3%A...ec_des_patrons
    https://h-deb.clg.qc.ca/Sujets/Diver...rammation.html
    https://perso.liris.cnrs.fr/lionel.m...grammation.pdf

    Avec Rust, on est loin de tout cela et, pour l'instant, par rapport à C++, Java ou même C, il joue plutôt dans le bac à sable.

    PS : l'approche objet est aujourd'hui quasi universelle. UML est LA méthode de conception pour tout logiciel moderne. D'après ton message, il semble que tu travailles exclusivement dans le domaine du Web qui est une vue sur le logiciel très restreinte. Ça fait abstraction de tous les systèmes complexes à logiciel prépondérant que sont l'avionique, le spatial, les centrales nucléaires, les automobiles autonomes ou non, etc.

  5. #45
    Membre expérimenté
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Points : 1 376
    Points
    1 376
    Par défaut
    Alors comme le rappelle (à demi-mot) pvincent :
    Citation Envoyé par pvincent Voir le message
    A[...] Je n'entrerai pas dans le subtil distingo entre FORTRAN et Fortran. [...]
    FORTRAN date de 57, fortran, la version moderne actuellement utilisée (enfin je crois …) est post 70, voitre 90.

    Citation Envoyé par Jacti Voir le message


    La composition et l'héritage sont 2 concepts différents. On parle de composition quand un ou des attributs d'un objet est ou sont eux-mêmes des objets. On parle d'héritage quand un objet possède les même propriétés qu'un autre ou plusieurs autres objets auquel on ajoute des attributs et des méthodes.
    Exemple de composition : une automobile est composée d'une carrosserie, d'un moteur, de roues, etc.
    Exemple d'héritage : un employé, un cadre, un directeur... hérite d'un objet général, par exemple, salarié. Il serait absurde de dire qu'un salarié est composé d'un employé, d'un cadre ou d'un directeur
    Tu ne sembles pas vraiment au point sur l'approche objet (que je pratique depuis les premiers articles de Grady Booch en 1983 dans les revues de l'ACM)
    Remets mes propos dans leur contexte.
    J'affirme que tu vois le monde uniquement avec tes lunettes OOP, qu'à force tu penses que comme Rust ne propose pas les mécanismes à la C++ il n'est pas encore au point car c'est une nécessité que de proposer un mécanisme d'héritage. Je t'affirme le contraire, ce n'est pas la panacée ; de plus on demande de préférer souvent la composition à l'héritage …

    Citation Envoyé par Jacti Voir le message


    Ton code, comme tu le dit toi-même, s'exécute à "run-time". Le mien s'exécute à la compilation. C'est, évidemment, une différence énorme !
    Tu ne sembles pas comprendre le concept de métaprogrammation :
    https://fr.wikipedia.org/wiki/M%C3%A...ec_des_patrons
    https://h-deb.clg.qc.ca/Sujets/Diver...rammation.html
    https://perso.liris.cnrs.fr/lionel.m...grammation.pdf

    Avec Rust, on est loin de tout cela et, pour l'instant, par rapport à C++, Java ou même C, il joue plutôt dans le bac à sable.
    Donc il ne t'as pas semblé nécessaire de consulter le lien que je te donnais. Le code C que je propose donne (avec clang ou gcc) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    fact:                                   # @fact
            test    edi, edi
            jle     .LBB0_1
            neg     edi
            mov     ecx, 1
            mov     eax, 1
    .LBB0_4:                                # =>This Inner Loop Header: Depth=1
            imul    eax, ecx
            lea     edx, [rdi + rcx]
            add     edx, 1
            add     ecx, 1
            cmp     edx, 1
            jne     .LBB0_4
            ret
    .LBB0_1:
            mov     eax, 1
            ret
    main:                                   # @main
            push    rax
            mov     edi, offset .L.str
            mov     esi, 24
            xor     eax, eax
            call    printf
            xor     eax, eax
            pop     rcx
            ret
    .L.str:
            .asciz  "4! = %d\n"
    Tu pourras constater qu'en ligne 21 on utilise directement une valeur calculée au moment de la compilation … aucun appel à fact n'est fait au runtime pour afficher fact(4).

    Citation Envoyé par Jacti Voir le message
    PS : l'approche objet est aujourd'hui quasi universelle. UML est LA méthode de conception pour tout logiciel moderne. D'après ton message, il semble que tu travailles exclusivement dans le domaine du Web qui est une vue sur le logiciel très restreinte. Ça fait abstraction de tous les systèmes complexes à logiciel prépondérant que sont l'avionique, le spatial, les centrales nucléaires, les automobiles autonomes ou non, etc.
    Tu as les mêmes œillères qu'avaient les évangélistes microsoft des années 90 … enfin,àmha.

  6. #46
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 82
    Points : 178
    Points
    178
    Par défaut
    Citation Envoyé par WhiteCrow Voir le message
    Alors comme le rappelle (à demi-mot) pvincent :


    FORTRAN date de 57, fortran, la version moderne actuellement utilisée (enfin je crois …) est post 70, voire 90
    Voir : https://fr.wikipedia.org/wiki/Fortran

    Citation Envoyé par WhiteCrow Voir le message
    Remets mes propos dans leur contexte.
    J'affirme que tu vois le monde uniquement avec tes lunettes OOP, qu'à force tu penses que comme Rust ne propose pas les mécanismes à la C++ il n'est pas encore au point car c'est une nécessité que de proposer un mécanisme d'héritage. Je t'affirme le contraire, ce n'est pas la panacée ; de plus on demande de préférer souvent la composition à l'héritage …
    L'héritage te permet d'écrire du code élégant, très factorisé que ne permet pas la composition dans le cas que j'ai cité (salarié)



    Citation Envoyé par WhiteCrow Voir le message
    Donc il ne t'as pas semblé nécessaire de consulter le lien que je te donnais. Le code C que je propose donne (avec clang ou gcc) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    fact:                                   # @fact
            test    edi, edi
            jle     .LBB0_1
            neg     edi
            mov     ecx, 1
            mov     eax, 1
    .LBB0_4:                                # =>This Inner Loop Header: Depth=1
            imul    eax, ecx
            lea     edx, [rdi + rcx]
            add     edx, 1
            add     ecx, 1
            cmp     edx, 1
            jne     .LBB0_4
            ret
    .LBB0_1:
            mov     eax, 1
            ret
    main:                                   # @main
            push    rax
            mov     edi, offset .L.str
            mov     esi, 24
            xor     eax, eax
            call    printf
            xor     eax, eax
            pop     rcx
            ret
    .L.str:
            .asciz  "4! = %d\n"
    Tu pourras constater qu'en ligne 21 on utilise directement une valeur calculée au moment de la compilation … aucun appel à fact n'est fait au runtime pour afficher fact(4)
    Ce que tu présente est du code assembleur qui doit s'exécuter.
    Dans mon exemple de C++ il n'y a aucun code généré, pas d'assembleur, rien. Tout le code écrit à l'aide des templates donne comme résultat
    Ça génère juste l'initialisation de la variable x. Il n'y a AUCUN code assembleur généré puisque c'est le compilateur qui fait le travail (comme une macro en C si tu veux)

    Citation Envoyé par WhiteCrow Voir le message
    Tu as les mêmes œillères qu'avaient les évangélistes microsoft des années 90 … enfin,àmha.
    Je déteste Microsoft, Windows, etc. donc je ne sais même pas de quoi tu parles. Je n'ai pas d'œillères, l'objet c'est juste une réalité. Ce n'est pas de ma faute si les langages les plus utilisés à part le langage C sont objet.
    Cite-moi les méthodes de conception les plus utilisées.

  7. #47
    Membre expérimenté
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Points : 1 376
    Points
    1 376
    Par défaut
    Citation Envoyé par Jacti Voir le message
    Citation Envoyé par WhiteCrow Voir le message
    Alors comme le rappelle (à demi-mot) pvincent :


    FORTRAN date de 57, fortran, la version moderne actuellement utilisée (enfin je crois …) est post 70, voitre 90.
    Voir : https://fr.wikipedia.org/wiki/Fortran
    où je lis :
    Citation Envoyé par Wikipedia

    • 1957 : le compilateur FORTRAN est déployé courant avril sur tous les IBM 704, sur bande magnétique2, avec son manuel intitulé Preliminary Operator's Manual5. Fin 1957, un manuel plus complet, le Programmer's Primer6 rédigé par Grace E. Mitchell, est édité. FORTRAN est un succès et une révolution car il n'est plus nécessaire d'être un expert de l'ordinateur pour écrire et déboguer des programmes. Mary Tsingou, physicienne et mathématicienne au Los Alamos National Laboratory et qui travailla avec Fermi, Pasta et Ulam, dira ainsi : « Quand le Fortran est arrivé, c'était presque comme le paradis »7. L'instruction GO TO permet de sauter à une ligne numérotée par une étiquette. Le IF de cette première version est arithmétique : IF (A-B) 10, 20, 30 permet de sauter aux instructions d'étiquettes 10, 20 ou 30 selon que l'expression A-B est négative, nulle ou positive.
    • 1991 : Fortran 90 (ISO/IEC 1539:1991, puis ANSI X3.198-1992)19 est une version majeure ayant pour objectif de mettre Fortran au niveau des autres langages modernes. La norme apporte en particulier les modules, la récursivité, les arguments optionnels et nommés, la surcharge des opérateurs, une syntaxe pour le calcul sur les tableaux, l'allocation dynamique des tableaux grâce à l'attribut ALLOCATABLE, les types dérivés, l'attribut POINTERnote 3, l'instruction IMPLICIT NONE pour rendre obligatoire la déclaration des variables, les structures de contrôle SELECT CASE, les procédures SYSTEM_CLOCK et DATE_AND_TIME pour accéder à l'horloge du système, etc. Les restrictions concernant la mise en forme des programmes (colonnes 1 à 72) disparaissent : l'écriture se fait en format libre. Afin de rester compatible avec les nombreux codes industriels écrits en FORTRAN (Nastran, bibliothèques NAG et IMSL, etc.), Fortran 90 est conçu de telle façon que FORTRAN 77 en constitue un sous-ensemble.
    Citation Envoyé par Jacti Voir le message

    L'héritage te permet d'écrire du code élégant, très factorisé que ne permet pas la composition dans le cas que j'ai cité (salarié)
    Très certainement, mais tu as tellement la tête dedans que l'idée que ce ne soit pas LA (dixit) seule manière de faire ne t'effleure même pas.

    Citation Envoyé par Jacti Voir le message

    Ce que tu présente est du code assembleur qui doit s'exécuter.
    Dans mon exemple de C++ il n'y a aucun code généré, pas d'assembleur, rien. Tout le code écrit à l'aide des templates donne comme résultat
    Je vais peut-être t'expliquer plus simplement.

    Tu dis
    Citation Envoyé par Jacti Voir le message
    ...
    •exemple d'optimisation de calcul mathématique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    template<unsigned int N>
    struct Fact {
        enum {
            value = N * Fact<N - 1>::value
        };
    };
    template<>
    struct Fact<0> {
        enum {
            value = 1
        };
    };
    // x vaudra 24 avant même que le programme ne soit lancé; coût à l'exécution : 0
    unsigned int x = Fact<4>::value;
    •dans cet exemple, le calcul de factorielle est effectué à la compilation, conduisant à une exécution sans calcul

    Je te montre un autre exemple où (dixit) «le calcul de factorielle est effectué à la compilation».

    Dans l'exemple que j'ai donné, à la compilation, le code généré ne fait aucun appel à fact pour afficher factorielle de 24, ce 24 a été calculé lors de la compilation … ce qui conduit à (dixit) «une exécution sans calcul [de la factorielle]»
    Pas besoin de metaprogrammation pour ça ; un compilateur évolué suffit,. C'est bien pour cela qu'il est de plus en plus avantageux d'aider le compilo à optimiser que d'optimiser soi-même.

    Citation Envoyé par Jacti Voir le message
    Je déteste Microsoft, Windows, etc. donc je ne sais même pas de quoi tu parles. Je n'ai pas d'œillères, l'objet c'est juste une réalité. Ce n'est pas de ma faute si les langages les plus utilisés à part le langage C sont objet.
    Cite-moi les méthodes de conception les plus utilisées.
    Tu emploies exactement les mots d'un évangéliste (pas au sens religieux du terme), militant si tu préfères Ton discours est fait pour que la vraie vérité éclate, etc.
    C'est clair qu'en gros 60% des langages les plus utilisés sont «objet» dans le sens «proposent la possibilité native d'un développement objet», mais ils ne proposent pas que cela (fort heureusement). La plupart de ces langages proposent également d'autres paradigmes (procédural,fonctionnel, modulaire, …) et C++ en profite également. C++ n'est pas «La programmation objet».

    Maintenant, mis à part C++ et Python, quels sont les langages qui proposent un héritage multiple ? quel sont les paradigmes proposés par les langages émergents ?
    Parce qu'au fond, le fond de commerce de «la programmation objet» c'est quoi ?

    Utiliser l'héritage de classes, l'encapsulation et avoir des instances sur lesquelles on appelle des méthodes ?
    On peut très bien se débrouiller sans, tout en programmant «élégamment», on peut utiliser la composition d'objet (oui, le terme n'est pas réservé à la POO) structurés, on peut utiliser le polymorphisme (qui n'est pas une feature OO), on peut bénéficier de fonctions qui sont des objets à part entière, avoir de vrai modules qui élargissent la notion d'encapsulation d'objet, etc ... Et tu remarqueras que tout ce que je viens de citer a été rajouté par la suite à C++ ; pourquoi ? parce que cela manquait tout simplement.

    Je ne déteste pas C++, ni autre chose d'ailleurs. Je ne suis clairement pas un professionnel de la conception de langage ou de quoi que ce soit d'autre au niveau théorique. Je n'ai qu'une simple opinion forgée après quelques années en développement informatique, et, àmha, C++ a atteint un pic. Quel sera le prochain changement majeur de paradigme ? je ne sais pas … le fonctionnel ? une OO raisonnée et raisonnable ? aucune idée. Mais ce que je constate, c'est que C++ a profité d'un engouement qui périclite. Il a surfé sur la vague C, puis cassé la gueule avec C with classes, puis est revenu en force avec C++ qui est un C with classes agrémenté d'une foulitude de notions non OO …
    Bref.
    Joyeux cinquantenaire au C, vie longue et prospère.

  8. #48
    Membre averti

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 313
    Points : 354
    Points
    354
    Par défaut
    Pour moi le C est une bénédiction... j'adore ce langage.

    Pour moi le C est un langage de programmation "middleware" (il existe des fonctions de bas et de haut niveau --> open() vs fopen() par exemple) et me convient parfaitement pour
    créer les outils d'administration de mes systèmes Linux à la maison, au même titre que Perl.

    Au niveau professionnel j'ai laissé tomber en 2008 du coup je me fies à ce que mes anciens collègues me disent: les conversations tournent souvent autour de Java, C++, ... dans le domaine
    du Web j'entends parler de nodeJS... (pour les IoT a priori).

  9. #49
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 329
    Points : 4 146
    Points
    4 146
    Par défaut Scoop !
    Bonjour,

    Attention scoop ! Le meilleur langage est celui qui permet de résoudre un type de problème avec confort et efficacité. Selon le problème et le développeur, le meilleur langage changera allègrement. Ce qui me paraît important est que le développeur diversifie ses techniques afin d'être plus à l'aise dans ses choix. S'il a seulement un marteau, tous les problèmes seront des clous.

    • J'aime bien C pour son efficacité et son aptitude à faire des programmes optimisés et de grosses bêtises.
    • J'aime bien C++ pour la richesse de ses bibliothèques qui permettent de traiter en peu de lignes des problèmes complexes avec une syntaxe hélas de plus en plus lourde (par exemple les cast).
    • J'aime bien les assembleurs qui permettent paradoxalement d'utiliser des instructions de haut niveau de plus en plus implémentées dans les CPU. Elles correspondent chacune à plusieurs lignes de code en langage classique quasi impossible pour un compilateur de résumer en une seule instruction ASM. La plus simple est peut être la rotation binaire rot. Et puis ce qui est bien avec l'assembleur, c'est que, 3 mois plus tard, le code même bien documenté fait perdre beaucoup de cheveux.
    • J'aime bien les langages de scripts et autres interprétés pour la rapidité de développement assortie d'une belle occupation mémoire et de lenteurs.
    • J'aime bien Pascal presqu'aussi efficace que le C tout en étant heureusement (?) beaucoup plus verbeux.
    • J'ai bien aimé le FORTAN pour ses tests arithmétiques (un test, trois sorties) et ses labyrinthes de goto calculés.
    • J'ai regardé RUST qui apporte beaucoup de sécurité mais je n'ai pas envie de remettre des petites roues à mon vélo.
    • J'ai bien aimé LISP, Prolog, Forth pour me sentir intelligent alors même que les résultats n'étaient pas là.
    • Etc.


    Tout ça pour dire qu'il y a des raisons pour aimer et haïr tous les langages. Que ces motifs sont en partie objectifs mais également subjectifs. Sur un même point objectif l'un mettra une pondération forte tandis que l'autre le négligera. C'est humain. Comme quelquefois l'exagération et la mauvaise fois.

    Heureusement, à la fin, chacun sait qu'il a raison

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  10. #50
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    @WhiteCrow : tu confonds métaprogrammation et optimisations du compilateur, avec cet exemple de factorielle.

    Il y a effectivement des cas où le compilateur arrive à optimiser et peut calculer une valeur. Il remplace alors l'appel à la fonction par la valeur calculée. Mais ce n'est pas toujours possible, et en général la fonction sera vraiment être appelée au runtime.

    En revanche, il y a des features en C++ pour "forcer" les calculs à la compilation. C'est le cas avec cette factorielle template. C'est une garantie que tout sera fait à la compilation et qu'aucun calcul sera fait au runtime.

    Cet exemple particulier de factorielle ne permet pas de généraliser comme tu le fais.

    PS : en C++ moderne, on utilisera plutôt une fonction constexpr ou consteval.

  11. #51
    Membre averti

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 313
    Points : 354
    Points
    354
    Par défaut
    Citation Envoyé par Guesset Voir le message
    Bonjour,

    Attention scoop ! Le meilleur langage est celui qui permet de résoudre un type de problème avec confort et efficacité. Selon le problème et le développeur, le meilleur langage changera allègrement. Ce qui me paraît important est que le développeur diversifie ses techniques afin d'être plus à l'aise dans ses choix. S'il a seulement un marteau, tous les problèmes seront des clous.

    • J'aime bien C pour son efficacité et son aptitude à faire des programmes optimisés et de grosses bêtises.
    • J'aime bien C++ pour la richesse de ses bibliothèques qui permettent de traiter en peu de lignes des problèmes complexes avec une syntaxe hélas de plus en plus lourde (par exemple les cast).
    • J'aime bien les assembleurs qui permettent paradoxalement d'utiliser des instructions de haut niveau de plus en plus implémentées dans les CPU. Elles correspondent chacune à plusieurs lignes de code en langage classique quasi impossible pour un compilateur de résumer en une seule instruction ASM. La plus simple est peut être la rotation binaire rot. Et puis ce qui est bien avec l'assembleur, c'est que, 3 mois plus tard, le code même bien documenté fait perdre beaucoup de cheveux.
    • J'aime bien les langages de scripts et autres interprétés pour la rapidité de développement assortie d'une belle occupation mémoire et de lenteurs.
    • J'aime bien Pascal presqu'aussi efficace que le C tout en étant heureusement (?) beaucoup plus verbeux.
    • J'ai bien aimé le FORTAN pour ses tests arithmétiques (un test, trois sorties) et ses labyrinthes de goto calculés.
    • J'ai regardé RUST qui apporte beaucoup de sécurité mais je n'ai pas envie de remettre des petites roues à mon vélo.
    • J'ai bien aimé LISP, Prolog, Forth pour me sentir intelligent alors même que les résultats n'étaient pas là.
    • Etc.


    Tout ça pour dire qu'il y a des raisons pour aimer et haïr tous les langages. Que ces motifs sont en partie objectifs mais également subjectifs. Sur un même point objectif l'un mettra une pondération forte tandis que l'autre le négligera. C'est humain. Comme quelquefois l'exagération et la mauvaise foi.

    Heureusement, à la fin, chacun sait qu'il a raison

    Salutations
    J'adore ^^
    Surtout
    J'aime bien C pour son efficacité et son aptitude à faire des programmes optimisés et de grosses bêtises.
    J'aime bien les assembleurs qui permettent paradoxalement d'utiliser des instructions de haut niveau de plus en plus implémentées dans les CPU. Elles correspondent chacune à plusieurs lignes de code en langage classique quasi impossible pour un compilateur de résumer en une seule instruction ASM. La plus simple est peut être la rotation binaire rot. Et puis ce qui est bien avec l'assembleur, c'est que, 3 mois plus tard (deux jours lol), le code même bien documenté fait perdre beaucoup de cheveux.
    lol ^^

    Je fais pas mal de bêtises aussi en Assembler (nasm).

  12. #52
    Membre expérimenté
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Points : 1 376
    Points
    1 376
    Par défaut
    Citation Envoyé par Bktero Voir le message
    @WhiteCrow : tu confonds métaprogrammation et optimisations du compilateur, avec cet exemple de factorielle.

    Il y a effectivement des cas où le compilateur arrive à optimiser et peut calculer une valeur. Il remplace alors l'appel à la fonction par la valeur calculée. Mais ce n'est pas toujours possible, et en général la fonction sera vraiment être appelée au runtime.

    En revanche, il y a des features en C++ à "forcer" les calculs à la compilation. C'est le cas avec cette factorielle template. C'est une garantie que tout sera fait à la compilation et qu'aucun calcul sera fait au runtime.

    Cet exemple particulier de factorielle ne permet pas de généraliser comme tu le fais.

    PS : en C++ moderne, on utilisera plutôt une fonction constexpr ou consteval.
    En effet, j'ai mis un tout petit peu de mauvaise foi dans mon argumentation, mauvaise foi que tu as relevée ^_^. Mais c'était aussi pour montrer que lorsqu'on ne voit le monde qu'avec un point de vue unique alors tous les exemples sont bons pour abonder dans le sens qu'on veut, y compris si ça n'a rien à voir

    En revanche si le compilo arrive à prouver qu'une fonction est pure ou au minimum const, alors lorsqu'on demande les optimisations il le fera (dans la limite du raisonnable et du possible). C'est pour cela que que je rajoute aussi qu'il est préférable de donner au compilo les infos nécessaire pour l'aider à optimiser plutôt que d'essayer d'optimiser à la main, surtout en C moderne.

    On pourra également remarquer que la métaprogrammation n'a en rien à voir avec une approche objet quelconque … ce n'est qu'un des mécanismes proposés de C++ hors OO.

  13. #53
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 82
    Points : 178
    Points
    178
    Par défaut
    Citation Envoyé par WhiteCrow Voir le message

    Je te montre un autre exemple où (dixit) «le calcul de factorielle est effectué à la compilation».

    Dans l'exemple que j'ai donné, à la compilation, le code généré ne fait aucun appel à fact pour afficher factorielle de 24, ce 24 a été calculé lors de la compilation … ce qui conduit à (dixit) «une exécution sans calcul [de la factorielle]»
    Pas besoin de metaprogrammation pour ça ; un compilateur évolué suffit,. C'est bien pour cela qu'il est de plus en plus avantageux d'aider le compilo à optimiser que d'optimiser soi-même.
    Je t'accorde que l'exemple de factorielle n'est pas le meilleur exemple pour montrer la métaprogrammation en C++ mais des vrais exemples pertinents sont longs à développer et n'ont pas leur place ici...

    Citation Envoyé par WhiteCrow Voir le message
    Maintenant, mis à part C++ et Python, quels sont les langages qui proposent un héritage multiple ?
    J'en connais au moins deux autres : Clos et Eiffel
    Citation Envoyé par WhiteCrow Voir le message
    quel sont les paradigmes proposés par les langages émergents ?
    Le plus récent paradigme me paraît être la programmation orientée aspect (POA, en anglais aspect-oriented programming - AOP) . Elle ne figure pas en tant que telle dans les langage mais il y a, par exemple, AspectJ pour Java (https://fr.wikipedia.org/wiki/AspectJ
    Citation Envoyé par WhiteCrow Voir le message
    Parce qu'au fond, le fond de commerce de «la programmation objet» c'est quoi ?
    Je ne comprends pas ce que tu veux dire par fond de commerce mais les 4 concepts majeurs, selon Grady Booch, le père de la conception objet, sont :
    - Abstraction (matérialisée par la notion de classe)
    - Encapsulation (matérialisée par le contrôle d'accès (public, private, etc.)
    - Modularité (matérialisée par la notion de paquetage (package)
    - Hiérarchie (plusieurs sortes) : composition (par valeur), agrégation (par référence), héritage

    Un point que nous n'avons pas abordé est la qualité logicielle, les normes et standards, etc. Il est certain que l'approche objet, pour les gros et très gros logiciels (j'ai connu des applications qui faisaient plusieurs millions de lignes de C++ !) favorise au moins la maintenabilité et l'évolutivité des logiciels.

    Citation Envoyé par WhiteCrow Voir le message
    Utiliser l'héritage de classes, l'encapsulation et avoir des instances sur lesquelles on appelle des méthodes ?
    On peut très bien se débrouiller sans, tout en programmant «élégamment», on peut utiliser la composition d'objet (oui, le terme n'est pas réservé à la POO) structurés, on peut utiliser le polymorphisme (qui n'est pas une feature OO), on peut bénéficier de fonctions qui sont des objets à part entière, avoir de vrai modules qui élargissent la notion d'encapsulation d'objet, etc ...
    Il y a plusieurs sortes de polymorphisme : https://img-19.ccm2.net/7VFzv7j7Q43C...ymorphisme.gif dont le polymorphisme d'héritage via les classes abstraites et les fonctions virtuelles.
    Quand tu n'as pas d'héritage, comment résous-tu les choix de traitement des différentes catégories de salariés, pour reprendre cet exemple ? Par des switch ?
    J'ai coutume de dire que la "chasse" aux switch est à la programmation objet ce que la "chasse" aux goto's est à la programmation structurée.
    Citation Envoyé par WhiteCrow Voir le message
    Je ne déteste pas C++, ni autre chose d'ailleurs. Je ne suis clairement pas un professionnel de la conception de langage ou de quoi que ce soit d'autre au niveau théorique. Je n'ai qu'une simple opinion forgée après quelques années en développement informatique, et, àmha, C++ a atteint un pic.
    Qu'st-ce que tu veux dire par C++ a atteint un pic ?
    Citation Envoyé par WhiteCrow Voir le message
    Joyeux cinquantenaire au C, vie longue et prospère.
    Il aura une longue vie de toute façon malgré sa syntaxe détestable qu'hélas de nombreux langages ont suivie...
    Merci pour cette discussion enrichissante malgré la divergence de nos points de vue.

  14. #54
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 82
    Points : 178
    Points
    178
    Par défaut Réponse parfaite
    Citation Envoyé par Bktero Voir le message
    @WhiteCrow : tu confonds métaprogrammation et optimisations du compilateur, avec cet exemple de factorielle.

    Il y a effectivement des cas où le compilateur arrive à optimiser et peut calculer une valeur. Il remplace alors l'appel à la fonction par la valeur calculée. Mais ce n'est pas toujours possible, et en général la fonction sera vraiment être appelée au runtime.

    En revanche, il y a des features en C++ à "forcer" les calculs à la compilation. C'est le cas avec cette factorielle template. C'est une garantie que tout sera fait à la compilation et qu'aucun calcul sera fait au runtime.

    Cet exemple particulier de factorielle ne permet pas de généraliser comme tu le fais.

    PS : en C++ moderne, on utilisera plutôt une fonction constexpr ou consteval.
    Je suis entièrement d'accord avec ton message. C'est une réponse parfaite y compris le Post Scriptum.

  15. #55
    Membre actif
    Homme Profil pro
    libre
    Inscrit en
    Juin 2019
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : libre

    Informations forums :
    Inscription : Juin 2019
    Messages : 205
    Points : 292
    Points
    292
    Par défaut
    Il y a le HLA un langage assembleur avec POO dont le préprocesseur est doté de #if #while #for #print théoriquement il peut produire n'importe quelle source

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
         ?i := 0;
         #while( i < 5 )
     
              ?i := i + 1;
     
         #endwhile

  16. #56
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 446
    Points : 43 088
    Points
    43 088
    Par défaut
    Je vois pas trop l’intérêt d'utiliser ce truc.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  17. #57
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 82
    Points : 178
    Points
    178
    Par défaut
    Citation Envoyé par wheel Voir le message
    Il y a le HLA un langage assembleur avec POO dont le préprocesseur est doté de #if #while #for #print théoriquement il peut produire n'importe quelle source

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
         ?i := 0;
         #while( i < 5 )
     
              ?i := i + 1;
     
         #endwhile
    Je suis comme chrtophe, je ne comprends pas l'intérêt. Peux-tu nous expliquer ?

  18. #58
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,
    Citation Envoyé par Jacti Voir le message
    (..- les 4 concepts majeurs, selon Grady Booch, le père de la conception objet, sont :
    - Abstraction (matérialisée par la notion de classe)
    - Encapsulation (matérialisée par le contrôle d'accès (public, private, etc.)
    - Modularité (matérialisée par la notion de paquetage (package)
    - Hiérarchie (plusieurs sortes) : composition (par valeur), agrégation (par référence), héritage
    Loin de moi l'idée même de vouloir rabaisser ce grand homme, seulement:

    -"Abstraction" (matérialisée par la notion de classes) : le fait est que dés le moment où l'on a commencé à donner "un sens" particulier à un groupe de bits avec "un certain nombre" d'opérations susceptibles de leur convenir, on a commencé à faire de l'abstraction.

    En allant "à peine plus loin" dans la réflexion, dés le moment où tu décide "d'assembler" deux données "de bases" afin de représenter une notion "plus complexe", tu fais également de l'abstraction.

    Alors, bien sur, la notion de classes est clairement l'un des moyens qui sont mis à notre disposition pour pratiquer de l'abstraction. Au même titre que les structures et autres "aggloméras" (unions, "enregistrements" et autres, en fonction du langage envisagé) de données, mais aussi les énumérations ou même les alias de type

    -"Encapsulation (matérialisée par le contrôle d'accès (public, private, etc.)" On ne va pas se le cacher: la possibilité de signaler au compilateur que "telle ou telle donnée n'est pas censée être accessible" apporte une aide substantielle pour arriver à encapsuler les données.

    A condition toutes fois que l'usage de ces contrôles d'accès ne soit pas rendu parfaitement inutile par l'ajout d'accesseurs (getXXX) et de mutateurs (setXXX), que l'on croise beaucoup trop souvent dans de trop nombreux projets, et qui ont pour résultat final de rendre l'utilisateur de la notion "soit disant" encapsulée responsable des calculs permettant de définir la "nouvelle valeur" des données. Ce que l'encapsulation essaye justement d'éviter.

    De plus, l'encapsulation est un principe connu depuis bien avant que l'idée de la programmation orientée objets ne fasse son apparition. Pense à la structure FILE du C, dont je te met au défis de me dire dans un "délais raisonnable" de quoi elle est composée (il te faudra sans doute éplucher une belle série de fichiers pour y arriver), alors que tout le monde sait comment manipuler cette structure du fait des fonctons fopen, fread, fwrite, fclose et similaires.

    Cette structure est donc parfaitement encapsulée dans le sens où son utilisateur n'a pas à s'inquiéter des informations qu'elle contient et encore moins de calculer les nouvelles valeurs pour ces données.

    - Modularité (matérialisée par la notion de paquetage (package)

    Ben, là aussi, nous avons affaire à quelque chose qui était déjà bien connu avant. Peu importe la manière dont on s'y prend, dés le moment où l'on a la possibilité de signaler au compilateur (ou à l'interpréteur) que l'on a affaire à un "ensemble de fonctionnalités qui vont bien ensembles et auquel je donne <tel nom> à titre de paquetage", la notion est bel et bien présente.

    On retrouve cette possibilité aussi bien en ada qu'en C. Ce n'est donc pas vraiment "une nouveauté" spécifique à la programmation orientée objets
    "- Hiérarchie (plusieurs sortes) : composition (par valeur), agrégation (par référence), héritage"

    Composition et agrégation existaient elles-aussi bien avant l'arrivée de l'orienté objet, la seule véritable nouveauté étant l'héritage. Encore faut-il l'utiliser à bon escient et de manière correcte; entre autre respectant le principe de substitution de Liskov, et en admettant l'idée que ce principe doit servir de GO / NO GO avant même que le langage du projet ne puisse entrer en ligne de compte.
    Citation Envoyé par Jacti Voir le message
    Un point que nous n'avons pas abordé est la qualité logicielle, les normes et standards, etc. Il est certain que l'approche objet, pour les gros et très gros logiciels (j'ai connu des applications qui faisaient plusieurs millions de lignes de C++ !) favorise au moins la maintenabilité et l'évolutivité des logiciels.
    Et j'ai connu des projet qui en faisaient dix à mille fois moins qui étaient de véritable b...dels, malgré le fait qu'ils utilisaient (soit disant) une approche orientée objets

    Entendons nous bien: est tout à fait vrai que l'approche orientée objets permet ** éventuellement ** de favoriser la maintenabilité et l'évolutivité du code. Encore faut il qu'elle soit correctement appliquée, au même titre que toutes les autres méthodes destinées à "faciliter d'une manière ou d'une autre" l'évolution des projets.

    Le gros problème, c'est que ces techniques sont pour la plupart beaucoup trop mal comprises, y compris par un nombre trop important de professionnels et certaines personnes qui se targuent de "leur expertise" dans le domaine

    Or, lorsque ces techniques sont mal comprises ou -- pire encore -- appliquées "sans réflechir, parce que c'est comme cela qu'on a appris", elles amènent souvent un résultat qui va à l'encontre de ce que ces techniques voulaient justement mettre en place (avec une évolutivité et une maintenabilité nulle ou proche de l'être).
    Citation Envoyé par Jacti Voir le message
    Quand tu n'as pas d'héritage, comment résous-tu les choix de traitement des différentes catégories de salariés, pour reprendre cet exemple ? Par des switch ?
    J'ai coutume de dire que la "chasse" aux switch est à la programmation objet ce que la "chasse" aux goto's est à la programmation structurée.
    Oh, ben, je vois bien d'autres solutions, comme une approche générique (du genre de "je ne sais pas quel sera le type de la donnée que je manipule, par contre, je sais comment je vais la manipuler), avec, pourquoi pas, l'utilisation de traits spécifiques (par contre, si j'ai une donnée de ce type bien particulier, voici comment je prévois qu'elle sera manipulée).

    La seule question qu'il te restera à te poser étant "comment je fais pour différentier l'employé de base du manager?", et ce ne sont pas vraiment les solutions qui manquent
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  19. #59
    Membre actif
    Homme Profil pro
    libre
    Inscrit en
    Juin 2019
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : libre

    Informations forums :
    Inscription : Juin 2019
    Messages : 205
    Points : 292
    Points
    292
    Par défaut chrtophe, Jacti
    Oui l'exemple que j'ai donné n'a pas d'utilité c'était juste pour montrer la syntaxe, Le compilateur de HLA est OpenSource sa référence du langage est sur le lien https://www.plantation-productions.c...ML/AoATOC.html aujourd’hui il est obsolète du fait que ce langage est dépendant du plateforme Intel 32bit.

    HLA is actually two languages rolled into a single program. The run-time language is the standard 80x86/HLA assembly language you've been reading about in all the past chapters. This is called the run-time language because the programs you write execute when you run the executable file. HLA contains an interpreter for a second language, the HLA compile time language (or CTL) that executes programs while HLA is compiling a program. The source code for the CTL program is embedded in an HLA assembly language source file; that is, HLA source files contain instructions for both the HLA CTL and the run-time program. HLA executes the CTL program during compilation. Once HLA completes compilation, the CTL program terminates; the CTL application is not a part of the run-time executable that HLA emits, although the CTL application can write part of the run-time program for you and, in fact, this is the major purpose of the CTL.

    Les marcos font plus que la substitution du texte elles peuvent accéder à la table des symboles et fournir des infos sur les éléments concernant le type et la taille ce qui permet de générer le code selon des paramètres d'entrée.

    exemple d'un macro get fileclass
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    #macro get( _parms_[] ):
      _curparm_, _pType_, _arg_, _id_, _fVar_;
     
      ?_curparm_:uns32 := 0;
      ?_fVar_:text := @LastObject;
     
      // Save important registers that the "GET" macro uses.
     
      push( eax );
      push( esi );
      push( edi );
     
      // The following loop repeats once for each GET parameter
      // we process.
     
      #while( _curparm_ < @elements( _parms_ ))
     
        // If this parameter begins with an identifier,
        // there are some problems to deal with.
        // The symbol table functions (e.g., @ptype) don't
        // allow address expression components after the
        // symbol name.  Named constants, however, do allow
        // such entities.  The following code determines
        // (1) is this a symbol?  (2) if it is a symbol, is
        // it a constant?
        //
        //	For non-constant symbols, we need to strip any
        // trailing non-symbol characters from the string
        // (e.g., "[0]" ).
     
        ?_arg_ := @trim( _parms_[ _curparm_ ], 0 );
        #if( char( _arg_ ) in stdio._idchars_ )
     
          // If this parameter begins with an id character,
          // then strip away any non-ID symbols from the
          // end of the string.  Then determine if we've
          // got a constant or some other class (e.g.,
          // variable or procedure).  If not a constant,
          // keep only the name.  If a constant, we need
          // to keep all trailing characters as well.
     
          ?_id_ := stdio._GetID_( _arg_ );
          #if
          (
              @class( _id_ ) = hla.cConstant
            |	@class( _id_ ) = hla.cValue
          )
     
            ?_id_ := _arg_;
     
          #endif
     
        #else
          // If it's not an ID, we need to keep everything.
          ?_id_ := _arg_;
        #endif
        // Determine the type of this parameter so we can
        // call the appropriate routine to input it.
        ?_pType_ := @pType( @text( _id_ ));
        #if( _pType_ = hla.ptArray )
     
          ?_pType_ :=
            @pType( @text( @typename( @text( _id_ ))));
        #endif
        // Based on the type, call the appropriate library
        // routine to print this value.
     
        #if( _pType_ = hla.ptBoolean )
     
          #error( "Boolean input is not supported" );
     
        #elseif( _pType_ = hla.ptUns8 )
     
          _fVar_.getu8();
          mov( al, @text( _arg_ ));
     
        #elseif( _pType_ = hla.ptUns16 )
     
          _fVar_.getu16();
          mov( ax, @text( _arg_ ));
     
        #elseif( _pType_ = hla.ptUns32 )
     
          _fVar_.getu32();
          mov( eax, @text( _arg_ ));
     
        #elseif( _pType_ = hla.ptByte )
     
          _fVar_.getb();
          mov( al, @text( _arg_ ));
     
        #elseif( _pType_ = hla.ptWord )
     
       .....
        #else
     
          #error
          (
            "stdin.get: Unknown data type (" +
            _parms_[ _curparm_ ] +
            ":" +
            @typename( @text( _id_ )) +
            ")"
          );
     
        #endif
        ?_curparm_ := _curparm_ + 1;
     
      #endwhile
      // Restore the registers pushed earlier for this
      // call to the GET macro.
      pop( edi );
      pop( esi );
      pop( eax );
    #endmacro

  20. #60
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 924
    Points
    55 924
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par wheel Voir le message
    Oui l'exemple que j'ai donné n'a pas d'utilité c'était juste pour montrer la syntaxe, Le compilateur de HLA est OpenSource sa référence du langage est sur le lien https://www.plantation-productions.c...ML/AoATOC.html aujourd’hui il est obsolète du fait que ce langage est dépendant du plateforme Intel 32bit.[...]
    Du coup, on voit encore moins l'intérêt de l'exemple donné, sauf à montrer que "tu sais programmer en assembleur"...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

Discussions similaires

  1. Le langage de programmation Cobol fête ses 60 ans
    Par Bill Fassinou dans le forum Cobol
    Réponses: 46
    Dernier message: 03/08/2020, 13h51
  2. Réponses: 50
    Dernier message: 31/01/2017, 19h10
  3. Réponses: 2
    Dernier message: 13/04/2016, 09h27
  4. Le langage de programmation COBOL a cinquante ans
    Par Pierre Louis Chevalier dans le forum Cobol
    Réponses: 35
    Dernier message: 01/10/2012, 21h02
  5. Le langage de programmation COBOL a cinquante ans
    Par Pierre Louis Chevalier dans le forum Actualités
    Réponses: 12
    Dernier message: 20/09/2009, 19h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo