Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Chercher un livre sur le C avec certains critères.

200 réponses
Avatar
Francois
Bonjour à tous,

Je débute dans le C et personnellement j'apprends surtout avec les
livres. J'ai commencé "Livre du C premier langage" de Delannoy (je
précise que j'avais quand même des petites notions de programmations,
même si, à mon sens, j'étais [ et suis encore ? ] vraiment ce qu'on
appelle un débutant).

Je suis en train de lire le K&R (deuxième édition) qui est bien sûr
beaucoup plus difficile. C'est du concentré, mais quand on y regarde de
prêt, c'est quand assez précis et bien fait. Ceci étant, il y a des
choses qui ne me satisfont pas complètement.

Je trouve que ce livre à une approche trop éloignée de la machine
(comment une donnée est encodée ? comment se passe l'histoire du signed
ou unsigned du point de vue de la machine etc.). Je m'explique.

Bien sûr, le langage C est un langage abstrait de "haut niveau" qui se
doit (en principe) de ne pas faire référence à la machine. Donc c'est
normal qu'un livre sur le C ne parle pas (trop) des problèmes qui
dépendent de l'architecture. Ceci étant, j'aimerais savoir si un tel
livre existe malgré tout. Un livre qui expose le langage C et qui
n'hésite pas de temps en temps à parler de ce qui se passe dans la
machine (bien sûr, justement, ce qui se passe dépend de la machine et
n'est pas universel, mais le livre pourrait présenter les choses sur
seulement une architecture "classique" par exemple). Bon, si je pouvais
éviter les circuits électroniques et compagnie quand même, ça serait
bien. Qu'on me dise que "le complément à 2 fait que l'addition devient
plus simple pour l'ordinateur puisqu'il suffit de faire une addition
classique" me suffit amplement. Une preuve de cela en passant des
explications sur des circuits électroniques peut-être me serait un peu
indigeste.

Bref, j'espère avoir été clair sur cette sorte de compromis que je
recherche (existe-t-il ?). Vous pouvez aller voir cette discussion (où
mon pseudo est sisco)

http://www.siteduzero.com/forum-83-245206-p1-afficher-le-codage-binaire-du-contenu-d-une-variable.html

qui pourra peut-être préciser mes aspirations.

Un livre en français, ça serait le top. Mais en anglais, ça le fera aussi.


Je vous remercie d'avance pour votre aide.



François

10 réponses

Avatar
Marc Boyer
On 2008-03-10, Francois wrote:
Et toi, tu voudrais un bouquin avec tout ?


Je comprends l'idée. C'est vrai, mais je plaide non coupable, je suis un
matheux. En maths, quand on présente un chapitre particulier, ce qui est
présenté l'est en principe de manière "complète".


Oui, mais les maths, c'est virtuel, sans souci de compatibilité
ascendante avec une machine populaire ayant fait un choix discutable
il y a 30 ans de cela...

Je m'explique. Quand on apprend un cours sur les espaces vectoriels par
exemple, on part de définitions à partir desquelles tout est construit
au fur et à mesure. Donc en principe, à un instant donné, tout ce qui a
été vu ne souffre d'aucune ambiguïté, d'aucune zone d'ombre, et se
présente comme quelque d'achevé complètement (et je trouve ça très
agréable, c'est pour ça que j'aime bien les maths). Après, on peut
toujours continuer à aller plus loin dans telle ou telle théorie (et
s'apercevoir que finalement on n'en verra jamais le bout bien sûr), mais
ce qui est "derrière soi" à un côté achevé, ça c'est cool.

J'ai sûrement tendance à vouloir reproduire ce schéma dans d'autre
activité, ce qui est bien sûr une chimère. Bon en fait, même en maths
c'est quand même une chimère, mais vachement moins que dans d'autres
activités (mais là je m'égare).


Tu occultes aussi le fait que quand on apprend à compter, on ne le
fait pas en présentant la théorie.
De même, on commence pas la géométrie par la vingtaine d'axiomes
de la théorie Euclidienne.

Sans parler du fait que certains matheux ne font jamais de logique,
et ne savent même pas quels sont les fondements de leurs raisonnements
;-)

Donc, premièe question: tu savais déjà programmer avant de
t'intéresser au C ? Tu avais déjà des notions d'archi des ordis ?
Non ? Ben alors, tu es dans la situation de quelqu'un n'ayant
jamais fait de calcul, de géométrie, et à qui on présenterait
les espaces Euclidiens...

J'espère avoir été clair ?
Bon, et puis désolé si j'ai un peu fait le p'tit péteux qui débarque la
fleur au fusil. Je pense qu'il faut que jeunesse se passe. :-))


Mais, ce forum est aussi là pour ça.

J'ai eu plein de réponses et la discussion m'a fichtrement intéressée et
amusée. C'est vrai, pourquoi diable un domaine comme l'informatique
déchaîne-t-il toujours les passions ? (ce n'est pas péjoratif dans ma
bouche)


Tu connais des dommaines techniques qui ne déclenchent pas des
passions entre professionels ? L'histoire et la psycho sont tellement
déchaînées que même la presse s'en fait l'écho.

Bref, je vais continuer à lire le K&R (j'ai déjà des questions dans ma
besace ... c'est pour bientôt sur le fclc :-) ). Et puis après on
verra... c'est pour bientôt sur le fclc :-) ). Et puis après on verra...


Le chapitre 6 du Harbison&Steele est aussi une bonne chose.

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)


Avatar
Jean-Marc Bourguet
Marc Boyer writes:

Ou alors, ca me parait plus important d'evoquer les regles d'aliasing
de type, qui sont elles *vraiment* tordues.


Peux-tu me rappeller ce que tu appelles "aliasing" ?


Les regles qui disent que le compilateur peut supposer que modifier un
membre int d'une structure A ne modifie pas un membre int d'une structure B
sauf si une declaration d'une union contenant un membre de type struct A et
un autre de type struct B est visible et que les struct commencent par des
membres du meme type jusqu'aux membres consideres. (Je suis pas clair mais
c'est pas grave).

A+

--
Jean-Marc
FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc
Site de usenet-fr: http://www.usenet-fr.news.eu.org


Avatar
espie
In article ,
Marc Boyer wrote:
On 2008-03-10, Marc Espie wrote:
In article <fr481f$ju8$,
Marc Boyer wrote:
Si on part de l'idée naïve qu'un pointeur est un entier représentant
l'adresse d'un char (représentation courante), alors, toutes les
subtilités de conversions entre pointeurs semblent là juste pour
compliquer les choses.


Euh, ces temps-ci, les regles a la con, c'est plus des problemes d'alignement
sur les trucs plus gros, ou des octets de bourrage... ou alors, les
vrais problemes de difference signe/pas signe... D'ailleurs ptrdiff_t et
size_t ne font qu'ajouter a l'immonde bordel ambient.


C'est vrai que j'avais zappé les alignements tellement ça me
paraît "naturel" maintenant ;-) Je pensais à des trucs comme
le "one past end".


Ca, c'est une realite. De plus en plus, meme. Une des facons de lutter
contre les buffer-overflow, c'est de jouer avec la carte memoire de ton
systeme. Typiquement, en essayant de placer certains malloc a la
frontiere d'une page, et en s'arrangeant pour que la page suivante (ou
precedente) declenche une segmentation fault.

C'est deprimant le nombre de programmes mal ecrits qu'on arrive a detecter
avec ca, d'ailleurs... qui jouent avec des pointeurs deux ou trois octets
apres/avant ce a quoi ils ont droit.



Avatar
espie
In article ,
Marc Boyer wrote:
Tient, ce matin en TD "mais monsieur, pourquoi il faut mettre
'static' devant les fonctions qui sont dans le .c et pas dans le
.h ? Le compilo peut pas s'en appercevoir tout seul ?"
Ben si, il pourrait facile en 2008. Mais en 1974, c'était différent...


Non, toujours pas en 2008... Comment tu fais la difference entre les
fonctions qui ne sont pas dans le .h de facon intentionnelle, et celles
qui n'y sont pas parce qu'on les a oubliees ?


Je n'en fais pas. D'ailleurs, celles qu'on a oublié, si on les utilise
ailleurs, ce sera une utilisation sans prototype, et ça risque de pas
bien marcher.
Donc, ça ne va casser que du mauvais code.


Super...

je prefere l'approche un peu plus robuste, industrielle et verbeuse.
D'ailleurs les -Wmissing-prototypes sont un peu une seconde nature chez moi.



Avatar
espie
In article ,
Marc Boyer wrote:
Ou alors, ca me parait plus important d'evoquer les regles d'aliasing
de type, qui sont elles *vraiment* tordues.


Peux-tu me rappeller ce que tu appelles "aliasing" ?


En Fortran, il y a un vrai type tableau. Ca permet aux physicien de faire
la nique au gens du C avec des optimisations `impossibles' en C, parce
qu'on ne sait pas trop si deux pointeurs correspondent a la meme zone
memoire ou pas (aliasing).

Les normes recentes (je sais plus si c'est deja en C89) introduisent un
typage fort: deux pointeurs de types differents ne peuvent pas correspondre
a la meme zone memoire, et donc le compilo a le droit de faire des
optimisations assez tordues.

Typiquement, ca pose des problemes au code qui suppose trop de chose sur
la representation memoire des objets, donc a pas mal de mauvais code...
et a un peu de code tres bas niveau, de style compilateur lisp ou assimile,
qui fait souvent des choses bizarres avec ces donnees.

Si tu veux du mal a quelqu'un, maudis-le a corriger des bugs d'aliasing...
c'est un peu comme les volatile manquants, mais en pire.
;-)

(comme on est en C, quand meme, la notion de type different est assez tordue,
puisqu'on regarde dans le pointeur pour savoir a quoi on a vraiment affaire
comme donnee... ainsi un struct { int a } *p et un int *q ont parfaitement
le droit de pointer sur la meme zone memoire, le systeme unifie egalement
signed/unsigned, et considere que tout acces a travers un
(signed/unsigned/) char * ou un void * peut etre aliase par n'importe
quoi.)


Il y a egalement un 2e mecanisme, __restrict, mais celui-ci est encore plus
foireux pour le compilateur (confere de looongues discussions sur la ml
gcc sur ce que __restrict signifie), et ne se rencontre guere que dans
les protos de fonctions standards, la ou la norme le reclame (et permet,
avec son ami const, de finir de casser du code foireux qui redeclare tout
seul comme un grand des fonctions de la bibliotheque standard).


Avatar
Jean-Marc Bourguet
(Marc Espie) writes:

In article ,
Marc Boyer wrote:
Ou alors, ca me parait plus important d'evoquer les regles d'aliasing
de type, qui sont elles *vraiment* tordues.


Peux-tu me rappeller ce que tu appelles "aliasing" ?


En Fortran, il y a un vrai type tableau. Ca permet aux physicien de faire
la nique au gens du C avec des optimisations `impossibles' en C, parce
qu'on ne sait pas trop si deux pointeurs correspondent a la meme zone
memoire ou pas (aliasing).

Les normes recentes (je sais plus si c'est deja en C89) introduisent un
De memoire, oui.

typage fort: deux pointeurs de types differents ne peuvent pas correspondre
a la meme zone memoire, et donc le compilo a le droit de faire des
optimisations assez tordues.
[...]

(comme on est en C, quand meme, la notion de type different est assez tordue,
puisqu'on regarde dans le pointeur pour savoir a quoi on a vraiment affaire
comme donnee... ainsi un struct { int a } *p et un int *q ont parfaitement
le droit de pointer sur la meme zone memoire, le systeme unifie egalement
signed/unsigned,


Tu es sur sur ou n'est-ce que la technique utilisees par les compilateurs
pour eviter de tout casser (ca ne correspond pas a ce que j'avais cru comprendre)

et considere que tout acces a travers un (signed/unsigned/) char * ou un
void * peut etre aliase par n'importe quoi.)


Ca correspond a ma memoire mais les acces a travers void* sont rares :-)

(Il y a la regle introduite pour valider l'OO a la Xlib qui n'est pas mal
non plus dans le genre).

A+

--
Jean-Marc
FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc
Site de usenet-fr: http://www.usenet-fr.news.eu.org



Avatar
Marc Boyer
On 2008-03-11, Marc Espie wrote:
In article ,
Marc Boyer wrote:
Tient, ce matin en TD "mais monsieur, pourquoi il faut mettre
'static' devant les fonctions qui sont dans le .c et pas dans le
.h ? Le compilo peut pas s'en appercevoir tout seul ?"
Ben si, il pourrait facile en 2008. Mais en 1974, c'était différent...


Non, toujours pas en 2008... Comment tu fais la difference entre les
fonctions qui ne sont pas dans le .h de facon intentionnelle, et celles
qui n'y sont pas parce qu'on les a oubliees ?


Je n'en fais pas. D'ailleurs, celles qu'on a oublié, si on les utilise
ailleurs, ce sera une utilisation sans prototype, et ça risque de pas
bien marcher.
Donc, ça ne va casser que du mauvais code.


Super...

je prefere l'approche un peu plus robuste, industrielle et verbeuse.


Que cela va-t-il changer ?
D'ailleurs, si tu oublies de mettre le static, tu peux avoir
collision avec une fonction de même nom déclarée elle tout à fait
correctement dans un .h.

D'ailleurs les -Wmissing-prototypes sont un peu une seconde nature chez moi.


Et ce warning va bien dans le sens que toutes les fonctions
sans prototype (donc pas dans le ?h) devraient être statiques.

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)




Avatar
Marc Boyer
On 2008-03-11, Jean-Marc Bourguet wrote:
Marc Boyer writes:

Ou alors, ca me parait plus important d'evoquer les regles d'aliasing
de type, qui sont elles *vraiment* tordues.


Peux-tu me rappeller ce que tu appelles "aliasing" ?


Les regles qui disent que le compilateur peut supposer que modifier un
membre int d'une structure A ne modifie pas un membre int d'une structure B
sauf si une declaration d'une union contenant un membre de type struct A et
un autre de type struct B est visible et que les struct commencent par des
membres du meme type jusqu'aux membres consideres. (Je suis pas clair mais
c'est pas grave).


Si, si, je vois bien.
C'est 6.5.3.3/5 et exemple 3.

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)



Avatar
Marc Boyer
On 2008-03-11, Marc Espie wrote:
In article ,
Marc Boyer wrote:
On 2008-03-10, Marc Espie wrote:
In article <fr481f$ju8$,
Marc Boyer wrote:
Si on part de l'idée naïve qu'un pointeur est un entier représentant
l'adresse d'un char (représentation courante), alors, toutes les
subtilités de conversions entre pointeurs semblent là juste pour
compliquer les choses.


Euh, ces temps-ci, les regles a la con, c'est plus des problemes d'alignement
sur les trucs plus gros, ou des octets de bourrage... ou alors, les
vrais problemes de difference signe/pas signe... D'ailleurs ptrdiff_t et
size_t ne font qu'ajouter a l'immonde bordel ambient.


C'est vrai que j'avais zappé les alignements tellement ça me
paraît "naturel" maintenant ;-) Je pensais à des trucs comme
le "one past end".


Ca, c'est une realite. De plus en plus, meme. Une des facons de lutter
contre les buffer-overflow, c'est de jouer avec la carte memoire de ton
systeme. Typiquement, en essayant de placer certains malloc a la
frontiere d'une page, et en s'arrangeant pour que la page suivante (ou
precedente) declenche une segmentation fault.

C'est deprimant le nombre de programmes mal ecrits qu'on arrive a detecter
avec ca, d'ailleurs... qui jouent avec des pointeurs deux ou trois octets
apres/avant ce a quoi ils ont droit.


Des trucs que l'on arrivait pas à détecter avec purify ou valgrind ?

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)




Avatar
espie
In article ,
Marc Boyer wrote:

Des trucs que l'on arrivait pas à détecter avec purify ou valgrind ?


Je soupconne que oui. En particulier, les acces une case avant le tableau.
Typiquement, on a corrige un sacre paquet pour arriver a compiler openoffice
sur OpenBSD: il y avait pas mal d'acces illegaux dans dmake...