Errata
Concepts et sémantique des langages de programmation
Volumes 1 & 2

Couverture volume 1
ISBN papier : 9781784057015
ISBN ebook : 9781784067014
Couverture volume 2
ISBN papier : 9781784057022
ISBN ebook :9781784067021


Volume 1

Chapitre 3, sémantique des traits fonctionnels

• Page 51, dernière ligne :
« F = <x, e, (F, Env) + f> »
Devrait être « F = <x, e, (f, F) + Env> »


• Page 69, proposition 3.1 :
Il manque la conclusion « => v = v' » dans l'énoncé de la proposition de déterminisme.

Chapitre 4, sémantique des traits impératifs

• Page 125, dernier paragraphe avant 4.7.1.2 :
« En ordonnant l'ensemble des fonctions partielles de Mem dans Mem »
Devrait être « de M dans M »


• Page 140 :
« Toutefois, lorsque nous avons introduit les expressions du langage (en particulier l’application, voir section 3.1.1) puis la fonction d’évaluation (voir section 3.2.1)... »
La fonction d'évaluation est décrite en section 3.2 et non 3.2.1.

Chapitre 5, typage

• Page 148, sous le tableau 5.1 :
« α1α2...αn\alpha_1 \rightarrow \alpha_2 \rightarrow ... \rightarrow \alpha_n »
Devrait être « α1α2...αn+1 »


• Page162, fonction unify :
Le cas unifiant deux variables identiques ne doit pas provoquer d'occur-check mais doit retourner la substitution vide.
(Merci à Atoli Huppé de m'avoir fait découvrir l'erreur).

Version OCaml

let rec unify t1 t2 =
  if t1 = t2 then empty_subst
  else

    match (t1, t2) with
    | (T_fun (a, b), T_fun (c, d)) ->
        let subst_left = unify a c in
        let b_substed = apply b subst_left in
        let d_substed = apply d subst_left in
        compose (unify b_substed d_substed) subst_left
    | (T_var v, other) | (other, T_var v) ->
        if occur_check v other then raise Cycle ;
        singleton v other
    | _ -> raise (Incompatible_tys (t1, t2))

Version Python

def unify (ty1, ty2) :
    if (isinstance (ty1, type.T_int) and isinstance (ty2, type.T_int)) or\
       (isinstance (ty1, type.T_bool) and isinstance (ty2, type.T_bool)) :
        return subst.empty
    elif isinstance (ty1, type.T_fun) and isinstance (ty2, type.T_fun) :
        a, b, c, d = ty1.t1, ty1.t2, ty2.t1, ty2.t2
        subst_left = unify (a, c)
        b_substed = subst.apply (b, subst_left)
        d_substed = subst.apply (d, subst_left)
        return subst.compose (unify (b_substed, d_substed), subst_left)
    elif isinstance (ty1, type.T_var) or isinstance (ty2, type.T_var) :
        (other, v) = (ty1, ty2.vname) if isinstance (ty2, type.T_var) \
            else (ty2, ty1.vname)
        if other != v and occur_check (v, other) :
            raise Cycle
        return subst.singleton (v, other)
    else :
        raise Incompatible_tys (ty1, ty2)


• Page 163, dernière ligne des explications d'implantation :
« où l’inversion de la variable mise... »
Devrait être « d'où l’inversion... »


• Page 181 première phrase :
« 3+4 » serait plus aéré sous la forme « 3 + 4 »

Chapitre 6, types de données

• Page 193, exemple 6.12 :
La ligne
    printf ("fl3 ~ fl4 ? %d\n", (fabs (fl3 - fl4) < EPSILON)) ;

ne devrait pas figurer dans le code car elle n'est pas affichée dans le résultat et ne sert pas à l'explication qui suit.


• Page 198, fin du premier paragraphe :
« Il s'agit du caractère de valeur 0 noté '\O'. »
Devrait être « ... noté '\0' ».


• Page 211, exemple 6.39 :
La fonction donnée en exemple s'appelle « inserse » au lieu de « inverse ».


• Page 224, exemple 6.54 :
« /* Comparaison d'égalité dentre deux tableaux »
Devrait être « /* Vérification d'égalité entre deux tableaux »
« La taille des tableaux »
Devrait être « Les tailles des tableaux »

Chapitre 7, pointeurs et gestion de la mémoire

P• age 234, listing 7.3, troisième ligne de la fonction appelant () :
La variable « neg » devrait plutôt s'appeler « vneg » pour être homogène avec le nommage des deux autres variables.


• Page 241, exemple 7.13 :
La définition de struct point2d_t origin ne présente aucun intérêt puisqu'elle ne figure pas dans les explications.


• Page 243, exemple 7.16 :
La définition de f et l'appel à g devraient avoir un espace avant la parenthèse ouvrante pour être homogène avec le reste du code. De plus, une majuscule à « appel » dans le commentaire serait plus élégant.


• Page 246, première phrase décrivant un GC à compteur de références :
« initialisé à 1 »
Supprimer cette précision inexacte. S'il était initialisé à 1 à l'allocation il ne pourrait jamais redescendre à 0. Quand on alloue le bloc,  il est initialisé à 0 et c'est juste parce que l'on mémorise son adresse dans un pointeur qu'il passe à 1.


• Page 248 :
« Lorsque la génération la plus ancienne devient saturée... »
Devrait être « Lorsque la génération plus ancienne devient saturée... »

Volume 2

Chapitre 1, gestion des noms

• Page 5, fin du premier paragraphe :
« odélisation »
Devrait être « modélisation ».


• Page 13, avant-dernier paragraphe :
« Une liaison sera donc désormais  un n-uplet (identificateur, information1, information2, etc.) »
Devrait être « Une liaison sera donc désormais  un n-uplet (identificateur, information1, information2, ...) »


• Page 14, exemple 1.5 :
« type client = C of person »
Devrait être « type client = C of P.person »


• Page 15, ligne 8 :
« a été étendu avec la liaison (client, C of person) »
Devrait être « a été étendu avec la liaison (client, C of P.person) »


• Page 38, milieu de page, second item :
« le compilateur acceptera la définition de lil_i seulement si tt est une instance de tit_i : le type tit_i est alors de la forme α.s\forall \, \alpha.s et t=s[αts]t=s [\alpha \, \leftarrow \,t_s]tst_s étant trouvé par l'algorithme de typage. Par exemple, si ti=α.αlistboolt_i = \forall \alpha. \alpha \,\, list \rightarrow {bool}, si t=intlistboolt = int \,\, list \rightarrow bool, alors ts=intt_s = int. »
Il faut inverser tt et tit_i. Le texte devrait donc être :
« le compilateur acceptera la définition de lil_i seulement si tit_i est une instance de tt : le type tt est alors de la forme α.s\forall \, \alpha.s et ti=s[αts]t_i=s [\alpha \, \leftarrow \,t_s]tst_s étant trouvé par l'algorithme de typage. Par exemple, si t=α.αlistboolt = \forall \alpha. \alpha \,\,list \rightarrow bool, si ti=intlistboolt_i = int\,\, list \rightarrow bool, alors ts=intt_s = int. »

Chapitre 2, modules

• Page 72, lignes 4 et 5 du listing en haut de la page :
« ... (7, mes.listes.cons (9, l))) ; »
Devrait être « ... (7, mes_listes.cons (9, l))) ; »
« ... ('b', tes.listes.cons ('c', c))) ; »
Devrait être « ... ('b', tes_listes.cons ('c', c))) ; »


• Page 76, code suivant 2.2.2 :
« (* Declarations. *) »
Devrait être « (* Déclarations. *) »


• Page 80, avant 2.2.2.3 :
« ... elle-même masquée par  (x, ‘‘bonjour’’). »
Devrait être « ... elle-même masquée par  (x, "bonjour"). »


• Page 82, second paragraphe :
« L' exemple 2.21... »
Devrait être « L'exemple 2.21... »


• Page 83, second paragraphe :
« retournant une valeur de type elem. : »
Devrait être « retournant une valeur de type elem. »


• Page 84, exemple 2.23 :
L'exception « Error » n'est pas définie dans le module « NewL3 ». Soit il faut l'y rajouter, soit la définir à toplevel.


• Page 86, premier paragraphe :
« ... voir l'égalité de fonctions dans la section 6.6. »
Devrait être « ... voir l'égalité de fonctions dans la section 6.6 du tome 1. »


• Page 87, fin du second paragraphe :
« ... une liste ordonnée liste1 contenant des caractères. »
Devrait être « ... une liste ordonnée liste1 contenant des chaînes de caractères. »


• Page 90, fin du second paragraphe :
« ... se fait en utilisant la directive #include ‘‘name.h’’... »
Devrait être « ... se fait en utilisant la directive #include "name.h"... »


• Page 91, fin du second paragraphe :
« Le fonction... »
Devrait être « La fonction... »


• Page 92, début de page :
« Avec l'exemple 2.31, nous joutons la directive #include fessai.h . »
Devrait être « Avec l'exemple 2.31, nous ajoutons la directive #include "fessai.h". »


• Page 93, avant dernier paragraphe :
« ... doit figurer dans tous les fichiers F_j qui souhaitent l'utiliser... »
Devrait être « ... doit figurer dans tous les fichiers F_i qui souhaitent l'utiliser... »


• Page 93, dernier paragraphe :
« Ce mot-clé extern indique au compilateur que l'allocation mémoire de var doit être faite une seule fois, donc partagée par tous les fichiers F_i utilisant var. »
Cette explication s'appuie sur des non-dits. Nous proposons de la remplacer par : « Ce mot-clé extern indique au compilateur une déclaration et non une définition de variable. Il n'y a à ce point aucune allocation. Une allocation sera faite lors de l'unique (et nécessaire) définition de var. Cette unique allocation mémoire sera donc partagée par tous les fichiers F_i utilisant var. »


• Page 94, lignes 3 et 5 du paragraphe :
« #include ‘‘file.h’’ »
Devraient être « #include "file.h" »

Chapitre 4, les classes dans différents langages

• Page 132, affichage des résultats de l'exemple 4.3 :
« appel implicite du constructeur C () pour la création de a_D »
Devrait être « pour la création de b_D »


• Page 133, paragraphe avant l'exemple 4.4 :
« ... une méthode voir qui prend un argument de type void »
Devrait être « ... une méthode voir qui ne prend pas d'argument »


• Page 135, premier item de la section 4.1.4.2 :
« - abstract]l »
Devrait être « -abstract : l »


• Page 143, dernière phrase :
« si et seulement »
Devrait être « si et seulement si »


• Page 148, dernière phrase :
« Neutralisons la fonction main dans l’exemple 4.15 »
Devrait être « Neutralisons l'appel P::f () ; dans la fonction main dans l’exemple 4.15 »


• Page 149 :
« La différence de comportement entre les différentes utilisations de #include sont liées... »
Devrait être « ... est liée ... »


• Page 155, fin du premier paragraphe :
« Ces objets sont désalloués à la fin de cette exécution. »
Ce n'est le cas que pour oloc. L'objet pointé par ploc étant alloué dynamiquement, il survit à la fin de f.


• Page 156, fin du premier paragraphe :
« détruite lorsque l'exécution de g sera terminée »
Devrait être « lorsque l'exécution de la fonction sera terminée ». Il  n'y a pas de fonction g dans l'exemple et cette explication est valable quelle que soit la fonction qui a défini la variable locale.


• Page 156, milieu du second paragraphe :
« Dans l'exemple 4.21, le pointeur p est créé sur le tas... »
L'explication est erronée : p étant une variable locale, elle est allouée sur la pile (ou dans un registre). La mémoire allouée pour l'objet lui-même l'est dans le tas.


• Page 158, messages d'erreur de la compilation :
Les commentaires sont incorrects dans les deux citations du code par le compilateur. Ils devraient être en accord avec le code source.


• Page 166, résultat de l'exemple 4.30 :
« Intervalle : [8.000000, 25.000000] »
Devrait être « Résultat: [8.000000, 25.000000] »

• Page 174, avant dernier paragraphe avant la section 4.2.5.3 :
« ... des paramètres du template,: int ... »
Devrait être « ... des paramètres du template : int ... »


• Page 176, fin de second paragraphe :
« est compilée puis exécutée et ajoutée au fichier en cours de construction »
Devrait être « ajouté au programme courant ». En effet, en utilisation interactive, il n'y a pas de fichier sous-jacent.


• Page 180, premier paragraphe :
« Dans cet exemple, le type des paramètres formels... »
Devrait être « Dans cet exemple, les types des paramètres formels... »


• Page 182, dernier paragraphe :
« Le seules occurrences »
Devrait être « Les seules occurrences »


• Page 198, dernière phrase :
« ... il suffit d'importer le module contenant le compilateur py_compile... »
Devrait être « ... il suffit d'importer le module py_compile... »


• Page 199, première phrase :
« Le résultat est un fichier de bytecode, nommé (fichier .pyc). »
Devrait être « Le résultat est un fichier de bytecode (fichier .pyc). »


• Page 199, code de compilation du script :
« >>> py_compile.compile ('calculette1.py') »
Devrait être « >>> py_compile.compile ('calculette.py') »


• Page 203, première ligne :
« ... si ce paramètre est  mutable. »
Devrait être « ... si ce paramètre a une valeur  mutable. »


• Page 209, premier item d'énumération :
« 1) en-tête de la liste... »
Devrait être « 1) en tête de la liste... »


• Page 210, seconde phrase :
« Dans la partie 4, l'expression... »
Devrait être « Dans la partie 3, l'expression... »


• Page 210, milieu avant-dernier paragraphe :
« Celle-ci crée la liaison (y, 5) en-tête de... »
Devrait être « Celle-ci crée la liaison (y, 5) en tête de... »


• Page 214, introduction de l'exemple 4.83 :
« Dans l'exemple 4.83, la classe Personne surcharge... »
Devrait être « Dans l'exemple 4.83, la classe Person surcharge... »


• Page 217, exemple 4.86 :
L'exécution du dernier for ne provoque qu'un seul affichage de « dans C 1 ».