OVH Cloud OVH Cloud

Beuuurk !

87 réponses
Avatar
Cyrille Szymanski
En me balladant tranquillement dans les sources de la libc de
FreeBSD, j'ai rencontré un petit bout de code effrayant au
détour de malloc.c :

/* If it's empty, make a page more of that size chunks */
if (!page_dir[j] && !malloc_make_chunks(j))
return 0;

C'est pas très beau ça quand même, mais on dirait que ça
fonctionne... pour combien de temps ?

--
cns

10 réponses

Avatar
mips
On Fri, 23 Apr 2004 17:25:44 +0000 (UTC)
(Marc Espie) wrote:

Bof, l'evaluation paresseuse des && et des || en C et en shell est
idiomatique. Quelqu'un qui trebuche sur une ligne de code comme
celle donnee en exergue ne connait tout simplement pas bien le
langage. C'est encore plus marque en shell, mais les constructions
du type:

if (!j_essaie_ce_truc_ci() && !j_essaie_ce_truc_la()) {
return CA_N_A_PAS_MARCHE;
}

c'est extremement frequent et naturel comme logique.


Tiens un elitiste :)

mips

Avatar
mips
On 24 Apr 2004 12:19:32 GMT
Cyrille Szymanski wrote:

On 2004-04-24, Michel Talon wrote:
Michel Talon wrote:
Ca ne fait pas exactement la même chose que le machin initial.
Le machin initial avait un &&, avec l'évaluation paresseuse le
premier échec suffisait. Le tien a un || ce qui nécessite dans
tous les> cas les deux évaluations.


Non, je ferais mieux de ne pas poster le matin!
!A && !B est vrai dés que A==NULL, sinon il faut évaluer B et
c'est vrai si B==NULL

(A==NULL)||(B==NULL) est vrai dans les mêmes conditions. Donc les
deux formes sont bien équivalentes sous l'évaluation paresseuse.


Oui c'est la loi de de Morgan :
!(a&&b) == (!a)||(!b)
!(a||b) == (!a)&&(!b)

Comme quoi manipuler ce genre d'expression en faisant attention aux
effets de bord est loin d'être trivial.


Ce qui tombe pile poil dans mon discours.

mips



Avatar
Miod Vallat
C'est pourtant chose manifeste : la réécriture en deux tests occupe au
moins une ligne de plus, sauf à l'écrire dans un style trop dense pour
être honnête.


c'est sûr que sur un terminal vt100, ça prend du coup plus de 10% de
l'espace d'affichage vertical T.T


Exactement. C'est une vérité générale : plus le code occupe d'espace
verticalement, plus il est bogué.


Avatar
espie
In article ,
mips wrote:
On Fri, 23 Apr 2004 17:25:44 +0000 (UTC)
(Marc Espie) wrote:

Bof, l'evaluation paresseuse des && et des || en C et en shell est
idiomatique. Quelqu'un qui trebuche sur une ligne de code comme
celle donnee en exergue ne connait tout simplement pas bien le
langage. C'est encore plus marque en shell, mais les constructions
du type:

if (!j_essaie_ce_truc_ci() && !j_essaie_ce_truc_la()) {
return CA_N_A_PAS_MARCHE;
}

c'est extremement frequent et naturel comme logique.


Tiens un elitiste :)


Non, je maintiens ce que je dis. C'est juste une semantique
`goal-directed' des tests logiques. C'est une aberration de ne
pas l'avoir dans les langages imperatifs et meme ailleurs.

Faisons un tour d'horizon:
- Pascal ne l'a pas. C'est *hyper-chiant*. Ca empeche de s'en servir
dans son role naturel de garde: if (i < borne_sup && tab[i] != 0)
plante en Pascal.
- C'est le moteur d'un langage comme Icon, ou comme Prolog.
Dans Icon, on a des expressions qui peuvent renvoyer plusieurs resultats,
avec un & et un | qui sont naturellement goal-directed. J'aime beaucoup
pouvoir y ecrire: if (i|j) = 0 then.
Ce qui est helas complique dans d'autres langages.
L'analogie avec:
PourFaireCa :- FaireCeci, FaireCela.
PourFaireCa :- OuBienFaireCetAutreTruc.
du prolog est totalement evidente.
- en shell, c'est super frequent de passer par plusieurs alternatives,
modele,
if !cmd_vachement_importante; then
ecrire_sur_la_console_de_root || { envoyer_un_mail_a_root &&
ecrire_sur_la_console_de_tous_les_gens_loggues; }

Suffit d'avoir suivi un cours d'introduction a la semantique, ou de logique
un peu raisonnable (je dirais qu'en gros, si vous avez entendu parler de
bases de Herbrand, vous verrez de quoi je veux parler) pour que la
semantique des connecteurs logiques du C paraisse naturelle.

Vouloir la remplacer par quelque chose de plus simple et plus
`mathematique' est une erreur. Ca n'a rien de plus mathematique, on
sait parfaitement lui donner un sens. Et en plus, on nie completement
la structure imperative du langage.


Avatar
mips
On Mon, 26 Apr 2004 11:39:49 +0000 (UTC)
(Marc Espie) wrote:

Non, je maintiens ce que je dis. C'est juste une semantique
`goal-directed' des tests logiques. C'est une aberration de ne
pas l'avoir dans les langages imperatifs et meme ailleurs.

Faisons un tour d'horizon:
[COUIC]


Suffit d'avoir suivi un cours d'introduction a la semantique, ou de
logique un peu raisonnable (je dirais qu'en gros, si vous avez
entendu parler de bases de Herbrand, vous verrez de quoi je veux
parler) pour que la semantique des connecteurs logiques du C
paraisse naturelle.

Vouloir la remplacer par quelque chose de plus simple et plus
`mathematique' est une erreur. Ca n'a rien de plus mathematique, on
sait parfaitement lui donner un sens. Et en plus, on nie
completement la structure imperative du langage.


Et moi je maintiens que c'est illisible. Je maintiens aussi que c'est
reserver la lecture des sources a une pseudo elite, cad des gens qui,
par exemple, ont entendu parler de Herbrand.

Pour moi un source lisible est un source qui se comprend du premier
coup d'oeil. Or ce genre de construction je ne fais pas qu'y jeter
qu'un coup d'oeil vu qu'il est si facile de se meprendre.

M'enfin bon a priori je bataille pour rien car de toutes facons tu ne
peux pas avoir mon point de vue.

mips

Avatar
espie
In article ,
mips wrote:
Et moi je maintiens que c'est illisible. Je maintiens aussi que c'est
reserver la lecture des sources a une pseudo elite, cad des gens qui,
par exemple, ont entendu parler de Herbrand.

Pour moi un source lisible est un source qui se comprend du premier
coup d'oeil. Or ce genre de construction je ne fais pas qu'y jeter
qu'un coup d'oeil vu qu'il est si facile de se meprendre.


La oui, je vais etre elitiste. Je trouve absurde, aberrant, et dangereux
de prendre des etudiants et de pretendre les transformer en programmeurs
sans leur donner quelques bases de mathematiques. Pas forcement des trucs
hyper-avances, hein, juste un feeling raisonnable de ce qui se passe.
Un minimum de formalismes exotiques, histoire de pouvoir ecrire autre
chose que pisser du bete code imperatif, et une intuition raisonnable sur
les ordres de grandeur et le cout de la recursivite, histoire de savoir
quoi et quand optimiser. Ah oui, et des bases de theorie logique, ca
sert toujours a eviter de confondre API et implementation. Et un peu de
semantique. C'est bien pour faire du code robuste et pas trop troue.

Evidemment, ca supposerait de revoir un peu les programmes d'enseignement
pour rendre un minimum ca attractif.

Mais bon, en attendant, on dit aux gens `vous etes pas bon en maths, venez
faire de l'informatique'. Et ca pond des programmeurs limités à la
pelle...


M'enfin bon a priori je bataille pour rien car de toutes facons tu ne
peux pas avoir mon point de vue.
Heureusement encore.


Avatar
espie
In article ,
Erwan David wrote:
Cyrille Szymanski écrivait :

Oui c'est la loi de de Morgan :
!(a&&b) == (!a)||(!b)
!(a||b) == (!a)&&(!b)


Ça c'est en logique, ça ne tient pas compte des évaluations
paresseusses...


Donne-moi un exemple de transformation logique qui ne fonctionne
pas en tenant compte des evaluations paresseuses.

Pour autant que je sache, la seule transformation qui ne fonctionne pas,
c'est evidemment la commutativite.


Avatar
Olivier Brisson
mips schrieb:

Pour moi un source lisible est un source qui se comprend du premier
coup d'oeil. Or ce genre de construction je ne fais pas qu'y jeter
qu'un coup d'oeil vu qu'il est si facile de se meprendre.


Tu peux avoir du code très bien écrit et ne pas le comprendre car l'algo
te dépasse...

M'enfin bon a priori je bataille pour rien car de toutes facons tu ne
peux pas avoir mon point de vue.

mips


Olivier
--

Avatar
mips
On Mon, 26 Apr 2004 12:41:29 +0000 (UTC)
(Marc Espie) wrote:

La oui, je vais etre elitiste. Je trouve absurde, aberrant, et
dangereux de prendre des etudiants et de pretendre les transformer
en programmeurs sans leur donner quelques bases de mathematiques.
Pas forcement des trucs hyper-avances, hein, juste un feeling
raisonnable de ce qui se passe. Un minimum de formalismes exotiques,
histoire de pouvoir ecrire autre chose que pisser du bete code
imperatif, et une intuition raisonnable sur les ordres de grandeur
et le cout de la recursivite, histoire de savoir quoi et quand
optimiser. Ah oui, et des bases de theorie logique, ca sert toujours
a eviter de confondre API et implementation. Et un peu de
semantique. C'est bien pour faire du code robuste et pas trop troue.

Evidemment, ca supposerait de revoir un peu les programmes
d'enseignement pour rendre un minimum ca attractif.


La oui tu est clairement elitiste. Tu fermes carrement la porte au nez
aux personnes qui n'ont pas fait d'etudes.

Pourtant en pratique je vois des autodidactes qui se demerdent
beaucoup mieux que certains diplomes.

Enfin bref ...

mips

Avatar
Miod Vallat
La oui tu est clairement elitiste. Tu fermes carrement la porte au nez
aux personnes qui n'ont pas fait d'etudes.


Bah, faudrait voir à ne pas éxagérer non plus. J'ai appris, grâce à
Marc, l'existence de monsieur Herbrand cet après-midi, et je ne suis pas
sûr de comprendre ses travaux; mais connaître la priorité des opérateurs
et l'ordre des évaluations, ça me semble un b.a.ba de programmation,
quel que soit le langage.

Et quoi que tu dises, sur ce point, le langage C ne se classe pas la
catégorie des langages fournis avec planche savonnée au savon noir.