1. #1
    Membre actif Avatar de Seabirds
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2015
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : avril 2015
    Messages : 212
    Points : 224
    Points
    224

    Par défaut Grammaire et sémantique

    Bonjour à toutes et à tous !

    Je commence (à peine !) à réfléchir à propos de la grammaire et de la sémantique d'un langage de programmation. Je cherchais un exemple un peu parlant de phrase grammaticallement correcte mais sémantiquement incorrecte (et j'avais du mal à en trouver).

    Bref en tout cas la distinction avait l'air cool, jusqu'à ce post.

    Il y est dit que "there is not, and cannot be, a distinction between syntax errors and semantic errors in C++, because it does not have a context-free grammar.".

    J'ai quand même pas passé deux heures à chercher à illustrer une distinction ... qui n'existe pas ?

    Pourriez-vous m'en dire plus, ou m'aiguiller vers des ressources qui en touchent deux mots ?

    Merci d'avance !
    Le débutant, lui, ignore qu'il ignore à ce point, il est fier de ses premiers succès, bien plus qu'il n'est conscient de l'étendue de ce qu'il ne sait pas, dès qu'il progresse en revanche, dès que s'accroît ce qu'il sait, il commence à saisir tout ce qui manque encore à son savoir. Qui sait peu ignore aussi très peu. [Roger Pol-Droit]
    Github
    Mon tout premier projet: une bibliothèque de simulation de génétique des populations

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    26 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2005
    Messages : 26 741
    Points : 39 185
    Points
    39 185

    Par défaut

    Pour faire simple, je dirais qu'une erreur syntaxique c'est quelque chose qui ne correspond pas à la grammaire du langage, du genre a % % % b (trois opérateur binaires à la suite, il n'y a aucune provision dans la grammaire pour ça).

    Par contraste, une erreur sémantique, ce serait accéder à une variable non-déclarée dans un langage comme le C. La grammaire est bonne, le compilateur C voit grâce à celle-ci qu'il s'agit d'un identificateur de variable, mais le code n'est pas valide pour autant. Un autre exemple serait appeler une fonction avec le mauvais nombre de paramètres.

    Le problème du C++ est que les diverses façons de déclarer un identificateur influencent son type de token du point de vue de la grammaire! En gros, un identificateur peut représenter une variable ou un type, et les templates compliquent encore plus le truc. Résultat, la sémantique influe sur la grammaire, ce qui n'est pas censé arriver (le C est touché aussi par ce problème, en raison du mot-clé typedef; sans ça, il pourrait être lu par une grammaire ordinaire, alors que là un compilateur C doit "tricher"; le C++ a ce problème puissance dix).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juin 2007
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : juin 2007
    Messages : 5 104
    Points : 16 708
    Points
    16 708

    Par défaut

    La différence n'est limpide qu'à partir du moment où l'on comprend comment fonctionne la compilation.

    On passe d'une suite de caractères à une suite de token. Toute erreur à ce moment là est dite "grammaticale".
    Puis à une séquence d'instructions par les règles de syntaxe.
    Et enfin, à un tout cohérent, l'unité de compilation, et les erreurs sont la sémantique.

    Une phrase sémantiquement fausse mais syntaxiquement valide?
    "Le chat pilote une choucroute."
    Un sujet, un verbe transitif et son complément requis.
    Par contre, ca ne veut rien dire.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  4. #4
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juin 2004
    Messages : 1 306
    Points : 2 458
    Points
    2 458

    Par défaut

    Citation Envoyé par ternel Voir le message
    On passe d'une suite de caractères à une suite de token. Toute erreur à ce moment là est dite "grammaticale".
    Puis à une séquence d'instructions par les règles de syntaxe.
    Et enfin, à un tout cohérent, l'unité de compilation, et les erreurs sont la sémantique..
    J'ai une autre lecture de la différence entre la grammaire et la sémantique du C++, mais je ne pense pas qu'elle soit plus ou moins justifiable que la votre.

    Le standard C++ fait la distinction entre quatre types de programmes erronés. C'est la définition de well-defined qui me l'a fait comprendre :
    Citation Envoyé par ISO/CEI 14882:2017
    [defns.well.formed]

    well-formed program: C++ program constructed according to the syntax rules, diagnosable semantic rules, and the one-definition rule.
    La quatrième catégorie d'erreur serait :
    Citation Envoyé par ISO/CEI 14882:2017
    [defns.undefined]

    undefined behavior: behavior for which this document imposes no requirements.
    Il serait donc intéressant de catégoriser (de parser ^^) ces types d'erreur soit en tant qu'erreur de grammaire ou de sémantique. Et je pense qu'elles sont toutes des erreurs de grammaire.

    Wikipedia --- Formal grammar

    In formal language theory, a grammar (when the context is not given, often called a formal grammar for clarity) is a set of production rules for strings in a formal language. The rules describe how to form strings from the language's alphabet that are valid according to the language's syntax. A grammar does not describe the meaning of the strings or what can be done with them in whatever context—only their form.
    Mais dans ce cas, on catégorise les diagnosable semantic rules en tant que règles de grammaire... ce qui peut sembler contradictoire. je ne pense pas que ça le soit, grammaire et sémantique ne sont pas antinomique car ne s'appliquant pas au même niveau. Quand le standard parle de sémantique, il parle de concept qui s'applique à la machine abstraite qu'il décrit et l'oppose à la représentation (physique) dudit concept. Par exemple, nulle part C++ n'impose une façon de représenter un nombre négatif par rapport à un nombre positif : la notion de bit de signe n’apparaît (presque) nulle part car cette notion est une propriété de la représentation du concept de signe qui est une propriété sémantique.

    Citation Envoyé par ISO/CEI 14882:2017
    [intro.abstract]/1

    The semantic descriptions in this document define a parameterized nondeterministic abstract machine.

    En revanche, lorsque Seabirds "commence à réfléchir à propos de la grammaire et de la sémantique d'un langage de programmation", je ne pense pas qu'il s'intéresse à cette sémantique là. Il oppose plutôt la forme de ses programme (la grammaire) à leur sens (la sémantique). Dans ce contexte, la grammaire est l'ensemble des règles de ISO/CEI 14882:2017. La sémantique pourrait être l'intention de l'auteur du programme (le développeur), le sens qu'il a l'intention de lui donner. Et dans ce cas ... une erreur sémantique serait ... un bug ? Si j'écris un programme ayant pour but de calculer pi^2/6, et que celui-ci crache la valeur 1/137, ne s'agit-il pas d'une erreur de sémantique ? J'aurais écrit un programme qui respecte en tout point les règles de grammaire imposées par C++, mais j'aurais insulfé au programme une logique qui n'a pas de sens ?
    -- Yankel Scialom

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    Consultant informatique
    Inscrit en
    octobre 2004
    Messages
    10 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : octobre 2004
    Messages : 10 840
    Points : 24 876
    Points
    24 876

    Par défaut

    Salut,

    En fait, si on prend n'importe quelle langue (comme le francais), on a trois ensembles de règles:
    • l'orthographe (dont la conjugaison): quelles lettres utiliser pour écrire un mot;
    • la grammaire : comment former une phrase
    • et la sémantique : ce que la phrase veut dire

    Et il est tout à fait possible de ne respecter que deux de ces ensembles, quels qu'il soient:
    • ceci ait une frase gramaticalement corect mais avec une aurtografe déplorable
    • "le chat va travailler" est une phrase grammaticalement correcte, mais sa sémantique laisse à désirer
    • "A manger!" n'est pas à proprement parler une phrase (il n'y a pas de sujet), mais elle a du sens, et son orthographe est correcte

    Quand on parle d'un langage de programmation, on ne dispose que de la syntaxe et de la grammaire (pour autant qu'il y en ait une), et les deux sont intimement liés:
    La grammaire pourra nous dire si le programme est "bien formé", alors que la syntaxe est ce qui permet au compilateur (ou à l'interpréteur) de comprendre ce qu'on lui veut.

    Le problème, c'est que la plupart des notion que l'on peut définir dans une grammaire (BNF, par exemple) font aussi partie de la syntaxe : ce sont ces notions qui permettent au compilateur (ou à l'interpréteur) de comprendre ce qu'on lui dit.

    Un bete exemple: la notion d'instruction (statement sera sans doute définie sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    statement_decl := statement end_of_statement 
    end_of_statement := ';'
    statement := type_declaration |
                 variable_declaration |
                 variable_definition |
                 function_declaration |
                 function_definition |
                ...
    Si on oublie le symbole "end_of_statement", c'est donc une erreur de grammaire, mais, cette erreur est aussi une erreur de syntaxe : le compilateur ne comprend plus rien...

    Et puis, il y a les cas un peu particuliers, commeunsigned long long int qui est syntaxiquement correct, alors que unsigned long long double ne correspond à rien du point de vue syntaxique (alors que l'on aurait sans doute la même règle BNF pour représenter les deux).

    Si bien que l'on se retrouve dans une situation totalement différente des langues parlées: dans les langues parlées, une erreur d'orthographe n'est ni une erreur sémantique ni une erreur grammaticale (et on peut faire toutes les combinaisons que l'on veut sous cette forme), alors que, dans les langages de programmation, une erreur de grammaire est "forcément" une erreur de syntaxe, alors que l'inverse n'est pas forcément vrai


    Citation Envoyé par prgasp77 Voir le message
    J
    Il serait donc intéressant de catégoriser (de parser ^^) ces types d'erreur soit en tant qu'erreur de grammaire ou de sémantique. Et je pense qu'elles sont toutes des erreurs de grammaire.
    Je pense que tout est forcément erreur de syntaxe (de sens donné par le compilateur), à partir du moment où toute erreur fait perdre le sens de ce que l'on a voulu dire au compilateur.

    Par contre, les comportements indéfinis, c'est autre chose : Un comportement indéfini est un comportement que l'on obtient quand le code a du sens (qu'il respecte grammaire ET la syntaxe), mais qu'il n'est pas possible d'indiquer une "réaction unifiée" à ce code, à cause des différents points de vue et / ou des restrictions imposées par "certains systèmes".
    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

Discussions similaires

  1. [Sémantique] Orthographe correcte d'une BD
    Par pataluc dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 03/09/2004, 15h18
  2. Décomposition d'une propriété : grammaire ?
    Par mathieu dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 04/05/2004, 09h47
  3. Sémantique standard d'un algorithme
    Par Yabo dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 28/01/2004, 10h04
  4. Réponses: 2
    Dernier message: 21/05/2002, 10h25

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