Developpez.com - Rubrique C

Le Club des Développeurs et IT Pro

Richard Stallman annonce le manuel de référence du langage GNU C

Le 2022-09-08 14:57:33, par Sandra Coret, Communiqués de presse
Voici le message d'annonce de Richard Stallman :

Envoyé par Richard Stallman
Ceci est pour annoncer la sortie du manuel d'introduction et de référence du langage GNU C.

Ce manuel est destiné à l'apprentissage du langage C, si vous savez programmer dans un autre langage. Il s'agit également d'un manuel de référence pour le langage C de GNU.

Dr Richard Stallman
Chief GNUisance of the GNU Project
Founder, Free Software Foundation
Voici des versions directement consultables : Manuel d'introduction et de référence du langage GNU C ( pdf ) , Dépot Github Markdown et PDF.

Source : Richard Stallman

Et vous ?

Qu'en pensez-vous ?

Lire aussi en Français :

Cours et tutoriels C
La FAQ C
Le forum d'entraide C
  Discussion forum
8 commentaires
  • Sve@r
    Expert éminent sénior
    Bonjour
    Envoyé par Sandra Coret

    Et vous ?

    Qu'en pensez-vous ?
    Premier exemple: fonction Fibonacci écrite sous sa forme récursive. Voilà, tu veux apprendre le C, hé bien mange !!!
    Après ok l'exemple est expliqué en détail et la mayonnaise peut prendre. Donc bon ben un tuto de plus, écrit peut-être de façon peu orthodoxe mais ça reste un tuto donc ça ne peut pas faire de mal et peut-être en complément d'un cours plus classique ça peut faire une bonne combinaison...
  • Guesset
    Expert confirmé
    Bonjour Sve,

    Envoyé par Sve@r 
    ...Premier exemple: fonction Fibonacci écrite sous sa forme récursive...

    Je ne suis pas sûr que d'utiliser une forme récursive qui génère une séquence profonde et linéaire d'appels (comme n!) soit l'emploi du siècle. Une simple boucle fera largement mieux le boulot. Et ce qui est pire ici est d'utiliser une forme arborescente qui doit générer de l'ordre de 2n-2 appels. En travaillant avec la mémoire du fn-1 on relinéarise la chaîne d'appels soit de l'ordre de n (et une occupation en 2*n). Proposition de code non testé :
    Code C :
    1
    2
    3
    4
    5
    6
    int fib (int n, int *f1) { 
      if (n <= 2)  return 1; 
      int * f2; 
      *f1 = fib(n-1, f2) 
      return *f1 + *f2; 
    }
    A comparer avec :
    Code C :
    1
    2
    3
    4
    5
    6
    7
    8
    int fib(int n) { 
       int u = 1, v = 1 
       for(;n > 2; --n) { 
          u += v; 
          v = u - v; 
       } 
       return u; 
    }
    Les usages qui entraînent naturellement un arbre (binaire ou plus si affinité ) d'appels sont plus intéressants et sollicitent moins la pile (les tours de Hanoï par exemple).

    L'excuse pédagogique ne devrait pas inciter à mésuser des possibilités d'un langage. Enfin, c'est mon avis et je le partage

    Salut
  • Sve@r
    Expert éminent sénior
    Envoyé par Guesset
    Bonjour Sve,
    Hey

    Envoyé par Guesset
    Je ne suis pas sûr que d'utiliser une forme récursive qui génère une séquence profonde et linéaire d'appels (comme n!) soit l'emploi du siècle. Une simple boucle fera largement mieux le boulot.
    Déjà ce n'est pas moi qui l'ai écrite et surtout ma remarque préalable était ironique. On ne balance pas une fonction récursive comme tout premier exemple d'un langage qu'on désire enseigner (en plus de la syntaxe il faut aussi appréhender la notion de récursivité). Surtout une fonction aussi mal foutue que Fibonacci (pour calculer f(10) elle calculera f(9), deux fois f(8), trois fois f(7), cinq fois f(6) et etc etc). D'ailleurs on ne balance pas non plus comme premier exemple un code non fonctionnel parce que sans main. Le K&R commence par afficher "Hello World".
    Après le reste ce sont de vrais avis. Ok ça reste un tuto de plus donc ok dans le pire des cas ça ne peut pas faire de mal et oui si on le complète par d'autres enseignements il peut apporter des choses.
  • Guesset
    Expert confirmé
    Bonjour,

    Il n'a pas de chance avec cet exemple, même les explications sont fausses. Dans le §2.3, il écrit :
    Code C :
    if(n <= 2)					// If n is 1 or 2
    Or n est un entier signé qui peut donc être négatif ou nul. Le retour sera à 1 dans tous ces cas, pas seulement pour 1 et 2. Et même si n avait été un unsigned cela aurait dû inclure 0.

    Par ailleurs, on pourrait discuter sur la définition de récurrence qui peut prolonger les valeurs en positif comme en négatif (-13,8,-,5,-3,2,-1,1,0,1,1,2,3,5,8,13...), avec n >= 0, fib(-n) = fib(n) si n pair et -fib(n) si n impair.

    Sinon, le document n'est pas mal, même sil la multiplication des tables de matières partielles est un peu fatigante.

    Salutations
  • Guesset
    Expert confirmé
    Rebonjour Sve,

    Envoyé par Sve@r
    ...Déjà ce n'est pas moi qui l'ai écrite et surtout ma remarque préalable était ironique...
    Je l'avais bien compris mais je craignais que ton coté pince-sans-rire puisse être interprété comme "il commence fort !" alors que c'est plutôt "Regardez tous, je fais ce qu'il ne faut pas faire et j'en suis fier !"

    Salut
  • JPLAROCHE
    Membre expérimenté
    Je le trouve facile à lire, simple.
    Quant au premier exemple, c'est juste une présentation, l'exemple complet là uniquement pour le bon fonctionnement et l'inclusion du main() ....

    Il y a des bonnes choses, cela a le mérite d'être gratuit et à la portée de tous.

    Un PDF que je garderai.
  • Jitou
    Membre confirmé
    Voilà 44 ans après le "Kernighan et Ritchie" le bouquin de mes années d'étudiant on sort un nième manuel sur le C ?
  • thamn
    Membre averti
    Envoyé par Guesset 
    Bonjour Sve,

    Je ne suis pas sûr que d'utiliser une forme récursive qui génère une séquence profonde et linéaire d'appels (comme n!) soit l'emploi du siècle. Une simple boucle fera largement mieux le boulot. Et ce qui est pire ici est d'utiliser une forme arborescente qui doit générer de l'ordre de 2n-2 appels. En travaillant avec la mémoire du fn-1 on relinéarise la chaîne d'appels soit de l'ordre de n (et une occupation en 2*n). Proposition de code non testé :
    Code C :
    1
    2
    3
    4
    5
    6
    int fib (int n, int *f1) { 
      if (n <= 2)  return 1; 
      int * f2; 
      *f1 = fib(n-1, f2) 
      return *f1 + *f2; 
    }
    A comparer avec :
    Code C :
    1
    2
    3
    4
    5
    6
    7
    8
    int fib(int n) { 
       int u = 1, v = 1 
       for(;n > 2; --n) { 
          u += v; 
          v = u - v; 
       } 
       return u; 
    }
    Les usages qui entraînent naturellement un arbre (binaire ou plus si affinité ) d'appels sont plus intéressants et sollicitent moins la pile (les tours de Hanoï par exemple).

    L'excuse pédagogique ne devrait pas inciter à mésuser des possibilités d'un langage. Enfin, c'est mon avis et je le partage

    Salut

    Ça permet de poser la limitation de la pile je crois, juste après il en cause et présente la version itérative de l'algo. Je trouve que c'est pas si mal, parce que après l'implementation recursive, tu peux passer a l’implémentation non récursive pour aborder la boucle for, me semble qu'en terme de complexité ça se tient, c'est progressif et ça permet de construire du narratif par dessus ça et garder tous les élements liés entre eux, peut être pratique pour mémoriser. Ah je pensais aussi au visite d'arbre, plus amusant pour des exercices ou tu dois éviter la récursivité.