OVH Cloud OVH Cloud

Microsoft et Java

295 réponses
Avatar
Wykaaa
Microsoft semble reconnaître que Java permet de développer plus
rapidement que C# et qu'il y a moins de failles de sécurité dans Java
que dans .net :
http://dsi.silicon.fr/nouveautes/microsoft-java-forever%E2%80%A6-1366

10 réponses

Avatar
JKB
Le Mon, 20 Jun 2011 22:28:49 +0000 (UTC),
Michel Talon écrivait :
Toxico Nimbus wrote:

Les exception sont quand même quelque chose de plus élégant et
extensible que le code de retour + errno.




Le problème n'est pas que c'est plus ou moins élégant, c'est que ça
permet de poursuivre le traîtement ailleurs dans la pile d'appels.
JKB dit que c'est une mauvaise chose, les gens qui ont réfléchi au
problème ont inventé ce mécanisme car ils pensaient que ça avait une
utilité précise - à commencer, je me répète, par les concepteurs de



Je ne dis pas que c'est une mauvaise idée, simplement que le truc
est nocif quand on oublie ce qui est derrière cette gestion par
exception. Le problème de la gestion par exception, c'est simplement
l'ajout pour que ça fonctionne d'un tas de chose pour éviter d'aller
dans le mur trop vite. Et ce tas de chose commence par un garbage
collector.

Au risque de me répéter, je n'ai rien contre les exceptions à partir
du moment où elles sont traitées appel de fonction par appel de
fonction.

lisp, qui ont été suivis par ceux de Java, de Python, etc. Ce n'est pas
une grande surprise, car les concepteurs de Java, de Python, etc.
étaient souvent issus du monde lisp ou smalltalk. Il en est de
même d'ailleurs de la gestion automatique de mémoire, etc. Evidemment
si on considère que le C est l'alpha et l'omega de la programmation ...



Ça tombe bien, ce n'est pas du tout mon cas.

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
Avatar
Emmanuel Florac
Le Tue, 21 Jun 2011 08:32:27 +0800, ST a écrit:

On 6/21/11 2:37 AM, Aéris wrote:


sub write_to_file
{
my $file = shift;
my $data = shift;
open(OUT,">",$file) or die $!;
print OUT $data;
close(OUT);
return 1;
}




Tu as oublié de vérifier que le print a fonctionné :

print OUT $data or die $! ;

Et comme tu ne flushes pas la sortie, il faut _aussi_ vérifier le close :

close OUT or die $!;

Ça s'appelle "defensive programming" :) On dit aussi "only paranoids will
survive".

--
A human being should be able to change a diaper, plan an invasion,
butcher a hog, conn a ship, design a building, write a sonnet, balance
accounts, build a wall, set a bone, comfort the dying, take orders, give
orders, cooperate, act alone, solve equations, analyze a new problem,
pitch manure, program a computer, cook a tasty meal, fight efficiently,
die gallantly. Specialization is for insects.
Robert A. Heinlein.
Avatar
Yliur
>> La seule
>> différence, c'est qu'il faut avoir des gens plus
>> compétents.
>
> Non, ce n'est pas la seule différence. Plus de choses à gérer =>
> plus d'erreurs. A moins que tu écrives des programmes sans jamais
> aucune erreur ?

Alors explique-moi pourquoi les plus belles conneries qui
m'aient été données de voir, c'est justement dans des codes Java ?



C'est une expérience considérée comme statistiquement objective ?


> Moins d'attention du développeur gaspillée, moins de pollution dans
> le code.

Aucun rapport. Si tu ne fais pas attention, tu feras des
conneries quel que soit le langage.



Tu ne fais *jamais* de conneries ?


>> Ta métaphore est pour le moins bizarre. Là où il te faut un
>> débutant pour bricoler un tru sur un coin de table avec Java, il te
>> faudra des gens plus compétents avec du C ou du C++.
>
> Où est l'avantage du C ici ?

Du langage, rien. Tu auras simplement un dev plus compétent.



Non : tu auras plus de gens capables de faire le même programme, avec
le même niveau de qualité.


>> Et il ne faut
>> surtout pas me faire croire qu'un développeur Java qui ne connaît
>> ni ne comprend rien à la gestion de la mémoire est un bon
>> développeur.
>
> Il y a moins de choses à écrire pour gérer la mémoire correctement
> en Java, si tu ne vois pas l'avantage de mettre moins de bordel
> dans du code, je ne vois pas le problème.

C'est juste un faux avantage. Ça permet juste à des gens qui
ne comprennent pas vraiment ce qu'ils font d'écrire des trucs, choses
qu'ils ne pourraient jamais faire dans un autre langage. Et
c'est ce qui est pervers dans l'utilisation de Java. Utiliser des tas
de notions sans comprendre ce qui est derrière est suicidaire. Et Java
est mauvais à cause de ça. Maintenant, je ne vais pas passer
des heures à essayer d'expliquer pourquoi. J'arrive à comprendre qu'on
trouve pratique certains points du langage, mais cela reste à
mes yeux l'un des pires langages qui existe.



Ça ne permet pas "juste" ça, ça permet aussi à tout le monde d'avoir
autre chose à foutre que se préoccuper des détails. Et s'il y a moins
de choses à comprendre, ce n'est pas forcément suicidaire que les
développeurs en sachent moins sur certains points. Il suffit qu'il
comprenne ce qu'il leur reste à gérer.


> La partie à comprendre en moins en java c'est les destructeurs
> (C++),

Oui, et on voit les conneries des pointeurs qui ne sont jamais
déréférencés avec ce que ça implique, par exemple...



On parle toujours de Java là ? Il y a très peu de choses à
déréférencer, seulement quelques ressources particulières, comme déjà
mentionné (gestion de cache par exemple ; même pour ça on peut
utiliser des références faibles).


> la libération de tous les objets en profondeur [jusque là il n'y a
> pas grand chose d'important pour la programmation en général, c'est
> surtout de la pratique] et sans doute des trucs obscurs avec les
> pointeurs, les passages par valeur ou par référence (C++), ... En
> fait pas grand chose, la plupart des choses simplifiées en Java ne
> servent pas à comprendre fondamentalement le fonctionnement de la
> mémoire, il s'agit de bazar à gérer. Ben oui, il y a quelques trucs
> à comprendre quand on programme, il y a juste moins de choses à se
> rappeler en Java, et la plupart ne sont que des contraintes de
> gestion manuelle.

Et c'est justement là qu'on n'est plus du tout d'accord. On
n'est pas d'accord parce que quelqu'un qui passe par les étapes
Fortran->C->C++->Java ne codera pas du tout de la même façon
que ceux qui attaquent directement par du Java. Et bizarrement, ils
feront moins de conneries. On ne peut pas utiliser un
langage, même un truc qui masque tout à l'utilisateur, sans savoir
peu ou prou ce qu'on fait.



Oui, les développeurs qui ont une formation plus large et/ou plus
approfondie sont mieux formés et donc plus compétent (enfin en
supposant qu'ils aient tout assimilé). Tu veux démontrer que les
développeurs mieux formés sont meilleurs ? Youhou, quelle grande
découverte. Sauf que toutes ces compétences ne sont pas forcément
nécessaires. Dans "peu ou prou", il y a "peu" : les développeurs n'ont
pas besoin de connaître autant de subtilité (ça ne veut pas dire rien,
mais moins de choses), et surtout pas à s'en préoccuper, même s'il
savent comment ça fonctionne.


> Et tu n'expliques pas en quoi c'est un problème qu'il fasse ça
> quand ça lui chante ou quand il en a besoin. Oui, sur le moment
> c'est plus complexe, et donc ?

Et donc ça te bouffe pour rien des ressources qui seraient
utiles ailleurs. Et ne me dis pas qu'on peut multiplier par dix la
puissance de la machine qui fait tourner la JVM. C'est une réponse
aberrante parce que sur un serveur, on est toujours au taquet. Alors
la JVM qui swappe et qui se fige parce que le GC a décidé de regarder
ce qui se passe en mémoire, c'est juste complètement idiot comme
fonctionnement.



Euh... "la JVM qui swappe" ? Tu autorises la JVM à consommer tout ça de
mémoire ?
Si tu veux que le travail du collecteur soit mieux réparti, tu regardes
ses options de configuration au lancement de la JVM et/ou tu le lances
à la main à certains endroits dans ton programme.

>> > Tu répètes toujours ça en bougonnant parce que le collecteur
>> > ramasse la mémoire quand ça lui chante plutôt que quand toi tu le
>> > décides à la main de vrai développeur avec qui on ne la fait pas,
>> > mais tu te gardes d'expliquer précisément en quoi c'est
>> > "contre-productif". De quel point de vue ? Elle est quand même
>> > récupérée ta mémoire, non ?
>>
>> Oui, elle est quand même récupérée. Il faut simplement
>> lancer à la main une usine à gaz pour la récupérer. C'est juste ça.
>
> Mais non. Le collecteur récupère la mémoire tout seul s'il en a
> besoin, il n'y a pas besoin de le lancer à la main. Tu peux si tu
> veux, mais ce n'est pas nécessaire.

Ai-je dis le contraire ? Oui, il fonctionne tout seul.
Néanmoins, il vaut mieux dans certains softs le lancer à la main. Je
te donne un exemple très bête. J'ai un programme Java, un serveur,
qui alloue 35 Mo par session utilisateur. Le truc est utilisé par
3000 personnes. Je te laisse le calcul à faire. Problème : lorsqu'un
utilisateur distant a un problème sur sa connexion internet, sa
session s'arrête. Tu me crois si tu veux, mais le GC de la JVM de
Sun, sous Solaris 10/sparc mais plusieurs minutes à libérer
effectivement la mémoire. Alors tu me diras aussi que la JVM de va
pas planter parce qu'en dernier ressort, le GC va passer par là. Mais
avant qu'il ne commence à bosser ton serveur rame comme ce n'est pas
permis parce qu'il swappe ! Donc si tu veux garder des performances
correctes, tu colles un thread qui tourne dans un coin avec un appel
au GC toutes les trentes secondes. C'est exactement ce que j'appelle
de la programmation dégueulasse. Ce qui est aussi marrant, c'est que
la même JVM (numéro de version identique) ne se comporte pas de la
même façon sous Windows, sous OpenVMS ou sous Linux. Sous OpenVMS et
Linux, le GC fonctionne à peu près normalement. Sous Solaris,
il faut se méfier, et sous Windows, c'est une catastrophe. Ne me
demande pas pourquoi, c'est une constatation.



Je ne sais pas si c'est "dégueulasse" (terme technique à définir), mais
c'est plus simple. Et s'il manque 2 minutes de mémoire sur ton serveur,
il n'y a pas déjà un problème ? Tu veux dire que la collecte
automatique de la mémoire te consomme une poignée de mémoire en plus ?
Le collecteur de mémoire devrait sans doute pouvoir faire ça tout seul,
regarde ses options de configuration.


>> > De ne pas être obligé de se faire chier à écrire du code partout
>> > pour traiter les erreurs et arriver au même résultat ? C'est
>> > vrai, c'est trop triste...
>>
>> Le problème des exceptions, c'est exactement le même que
>> celui des GC. Ça récupère tout et n'importe quoi, mais ça le
>> récupère.
>
> On peut parler de trucs précis de la vraie vie ? Comment ça ça
> récupère tout et n'importe quoi ? Les exceptions ne récupèrent rien
> en elle-même.

Rajoute 'gestionnaire' si ça peut te faire plaisir.



J'ai compris, les gestionnaires d'exceptions récupèrent "tout et"
n'importe quoi. Mais ce n'est pas précis, tu peux expliquer le problème
exact ?
Avatar
JKB
Le Tue, 21 Jun 2011 14:06:58 +0200,
Yliur écrivait :

>> La seule
>> différence, c'est qu'il faut avoir des gens plus
>> compétents.
>
> Non, ce n'est pas la seule différence. Plus de choses à gérer =>
> plus d'erreurs. A moins que tu écrives des programmes sans jamais
> aucune erreur ?

Alors explique-moi pourquoi les plus belles conneries qui
m'aient été données de voir, c'est justement dans des codes Java ?



C'est une expérience considérée comme statistiquement objective ?



Avec quinze ans de pratique sur les deux, je pense que ça commence
à montrer une tendance.

> Moins d'attention du développeur gaspillée, moins de pollution dans
> le code.

Aucun rapport. Si tu ne fais pas attention, tu feras des
conneries quel que soit le langage.



Tu ne fais *jamais* de conneries ?



Ai-je prétendu le contraire ?

>> Ta métaphore est pour le moins bizarre. Là où il te faut un
>> débutant pour bricoler un tru sur un coin de table avec Java, il te
>> faudra des gens plus compétents avec du C ou du C++.
>
> Où est l'avantage du C ici ?

Du langage, rien. Tu auras simplement un dev plus compétent.



Non : tu auras plus de gens capables de faire le même programme, avec
le même niveau de qualité.



C'est justement là que l'on n'est pas d'accord.

>> Et il ne faut
>> surtout pas me faire croire qu'un développeur Java qui ne connaît
>> ni ne comprend rien à la gestion de la mémoire est un bon
>> développeur.
>
> Il y a moins de choses à écrire pour gérer la mémoire correctement
> en Java, si tu ne vois pas l'avantage de mettre moins de bordel
> dans du code, je ne vois pas le problème.

C'est juste un faux avantage. Ça permet juste à des gens qui
ne comprennent pas vraiment ce qu'ils font d'écrire des trucs, choses
qu'ils ne pourraient jamais faire dans un autre langage. Et
c'est ce qui est pervers dans l'utilisation de Java. Utiliser des tas
de notions sans comprendre ce qui est derrière est suicidaire. Et Java
est mauvais à cause de ça. Maintenant, je ne vais pas passer
des heures à essayer d'expliquer pourquoi. J'arrive à comprendre qu'on
trouve pratique certains points du langage, mais cela reste à
mes yeux l'un des pires langages qui existe.



Ça ne permet pas "juste" ça, ça permet aussi à tout le monde d'avoir
autre chose à foutre que se préoccuper des détails. Et s'il y a moins
de choses à comprendre, ce n'est pas forcément suicidaire que les
développeurs en sachent moins sur certains points. Il suffit qu'il
comprenne ce qu'il leur reste à gérer.



Sans commentaire.

> La partie à comprendre en moins en java c'est les destructeurs
> (C++),

Oui, et on voit les conneries des pointeurs qui ne sont jamais
déréférencés avec ce que ça implique, par exemple...



On parle toujours de Java là ? Il y a très peu de choses à
déréférencer, seulement quelques ressources particulières, comme déjà
mentionné (gestion de cache par exemple ; même pour ça on peut
utiliser des références faibles).



Lorsqu'il reste un pointeur quelque part qui pointe sur une zone de
la mémoire, cette zone n'est pas libérée. C'est un effet pervers du
GC, que tu le veuilles ou non. Et ce genre de bêtise est très vite
fait.

> la libération de tous les objets en profondeur [jusque là il n'y a
> pas grand chose d'important pour la programmation en général, c'est
> surtout de la pratique] et sans doute des trucs obscurs avec les
> pointeurs, les passages par valeur ou par référence (C++), ... En
> fait pas grand chose, la plupart des choses simplifiées en Java ne
> servent pas à comprendre fondamentalement le fonctionnement de la
> mémoire, il s'agit de bazar à gérer. Ben oui, il y a quelques trucs
> à comprendre quand on programme, il y a juste moins de choses à se
> rappeler en Java, et la plupart ne sont que des contraintes de
> gestion manuelle.

Et c'est justement là qu'on n'est plus du tout d'accord. On
n'est pas d'accord parce que quelqu'un qui passe par les étapes
Fortran->C->C++->Java ne codera pas du tout de la même façon
que ceux qui attaquent directement par du Java. Et bizarrement, ils
feront moins de conneries. On ne peut pas utiliser un
langage, même un truc qui masque tout à l'utilisateur, sans savoir
peu ou prou ce qu'on fait.



Oui, les développeurs qui ont une formation plus large et/ou plus
approfondie sont mieux formés et donc plus compétent (enfin en
supposant qu'ils aient tout assimilé). Tu veux démontrer que les
développeurs mieux formés sont meilleurs ? Youhou, quelle grande
découverte. Sauf que toutes ces compétences ne sont pas forcément
nécessaires. Dans "peu ou prou", il y a "peu" : les développeurs n'ont
pas besoin de connaître autant de subtilité (ça ne veut pas dire rien,
mais moins de choses), et surtout pas à s'en préoccuper, même s'il
savent comment ça fonctionne.



Il y a deux niveaux. Celui où le dev sait que ça se passe d'une
certaine façon même s'il ne doit pas le gérer et celui où le dev ne
pipe mot à ce qu'il fait parce qu'il n'a pas conscience des
mécanismes. Mon expérience me dit que la plupart des devs java qui
n'ont fait que du java sont dans la deuxième catégorie. Et
figure-toi, ça me pose quelques problèmes quand je suis obligé de
passer derrière eux.

> Et tu n'expliques pas en quoi c'est un problème qu'il fasse ça
> quand ça lui chante ou quand il en a besoin. Oui, sur le moment
> c'est plus complexe, et donc ?

Et donc ça te bouffe pour rien des ressources qui seraient
utiles ailleurs. Et ne me dis pas qu'on peut multiplier par dix la
puissance de la machine qui fait tourner la JVM. C'est une réponse
aberrante parce que sur un serveur, on est toujours au taquet. Alors
la JVM qui swappe et qui se fige parce que le GC a décidé de regarder
ce qui se passe en mémoire, c'est juste complètement idiot comme
fonctionnement.



Euh... "la JVM qui swappe" ? Tu autorises la JVM à consommer tout ça de
mémoire ?
Si tu veux que le travail du collecteur soit mieux réparti, tu regardes
ses options de configuration au lancement de la JVM et/ou tu le lances
à la main à certains endroits dans ton programme.



Pour ta gouverne, la JVM de Sun outrepasse allègrement les options
de mémoire minimale et maximale. Ne me demande pas pourquoi, mais
c'est un fait. J'ai un processus qui est censé ne pas dépasser plus
d'un Go de mémoire, et il occupe présentement 6 Go de mémoire de
autant de swap (Solaris sparc avec une JVM 1.6 64 bits). La aussi,
la JVM (ou son GC) sait mieux que le dev ce qu'il faut utiliser comme
paramètres. En fait, j'ai de plus en plus l'impression que Java,
c'est le microsoft des langage. Il sait mieux qu'un dev ce qui est
bon pour lui.

>> > Tu répètes toujours ça en bougonnant parce que le collecteur
>> > ramasse la mémoire quand ça lui chante plutôt que quand toi tu le
>> > décides à la main de vrai développeur avec qui on ne la fait pas,
>> > mais tu te gardes d'expliquer précisément en quoi c'est
>> > "contre-productif". De quel point de vue ? Elle est quand même
>> > récupérée ta mémoire, non ?
>>
>> Oui, elle est quand même récupérée. Il faut simplement
>> lancer à la main une usine à gaz pour la récupérer. C'est juste ça.
>
> Mais non. Le collecteur récupère la mémoire tout seul s'il en a
> besoin, il n'y a pas besoin de le lancer à la main. Tu peux si tu
> veux, mais ce n'est pas nécessaire.

Ai-je dis le contraire ? Oui, il fonctionne tout seul.
Néanmoins, il vaut mieux dans certains softs le lancer à la main. Je
te donne un exemple très bête. J'ai un programme Java, un serveur,
qui alloue 35 Mo par session utilisateur. Le truc est utilisé par
3000 personnes. Je te laisse le calcul à faire. Problème : lorsqu'un
utilisateur distant a un problème sur sa connexion internet, sa
session s'arrête. Tu me crois si tu veux, mais le GC de la JVM de
Sun, sous Solaris 10/sparc mais plusieurs minutes à libérer
effectivement la mémoire. Alors tu me diras aussi que la JVM de va
pas planter parce qu'en dernier ressort, le GC va passer par là. Mais
avant qu'il ne commence à bosser ton serveur rame comme ce n'est pas
permis parce qu'il swappe ! Donc si tu veux garder des performances
correctes, tu colles un thread qui tourne dans un coin avec un appel
au GC toutes les trentes secondes. C'est exactement ce que j'appelle
de la programmation dégueulasse. Ce qui est aussi marrant, c'est que
la même JVM (numéro de version identique) ne se comporte pas de la
même façon sous Windows, sous OpenVMS ou sous Linux. Sous OpenVMS et
Linux, le GC fonctionne à peu près normalement. Sous Solaris,
il faut se méfier, et sous Windows, c'est une catastrophe. Ne me
demande pas pourquoi, c'est une constatation.



Je ne sais pas si c'est "dégueulasse" (terme technique à définir), mais
c'est plus simple. Et s'il manque 2 minutes de mémoire sur ton serveur,
il n'y a pas déjà un problème ? Tu veux dire que la collecte
automatique de la mémoire te consomme une poignée de mémoire en plus ?
Le collecteur de mémoire devrait sans doute pouvoir faire ça tout seul,
regarde ses options de configuration.



Je ne t'ai pas attendu.

>> > De ne pas être obligé de se faire chier à écrire du code partout
>> > pour traiter les erreurs et arriver au même résultat ? C'est
>> > vrai, c'est trop triste...
>>
>> Le problème des exceptions, c'est exactement le même que
>> celui des GC. Ça récupère tout et n'importe quoi, mais ça le
>> récupère.
>
> On peut parler de trucs précis de la vraie vie ? Comment ça ça
> récupère tout et n'importe quoi ? Les exceptions ne récupèrent rien
> en elle-même.

Rajoute 'gestionnaire' si ça peut te faire plaisir.



J'ai compris, les gestionnaires d'exceptions récupèrent "tout et"
n'importe quoi. Mais ce n'est pas précis, tu peux expliquer le problème
exact ?



Je te l'ai déjà expliqué. Lorsque tu remontes les erreurs à la main,
tu n'es pas contraint à l'utilisation d'un GC pour faire le boulot à
ta place, parce que tu peux le faire efficacement à tous les
endroits où c'est nécessaire. L'exception peut remonter automatiquement la
pile en sautant des appels sans intervention du programmeur. Du
point de vu du processeur, c'est ignoble (il y a des sauts calculés de
pile_s_ partout), et du point de vue des performances, c'est
catastrophique (il _faut_ un GC avec tout ce que ça implique pour libérer
tout ce qui doit être libéré). Du point de vue du programmeur, c'est
peut-être élégant (encore que...).

Je t'ai aussi déjà expliqué que dans la vraie vie, le dev qui est
pressé et dont le compilateur râle colle un gestionnaire
ramasse-tout (c'est aussi vrai en C++) et au final, c'est
contre-productif.

Et pour terminer, oui, je suis contre les GC parce que c'est une
hérésie. Lorsqu'on alloue quelque chose, on le libère lorsqu'on n'en
a plus besoin. Je suis contre, parce que le truc qui libère
automatiquement sous réserve de ne plus avoir de référence sur la
mémoire se transforme presque toujours en truc qui libère
automatiquement la mémoire !

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
Avatar
Nicolas George
Yliur , dans le message , a écrit :
Euh... "la JVM qui swappe" ? Tu autorises la JVM à consommer tout ça de
mémoire ?



Avoir deux couches successives de limites, c'est le meilleur moyen d'arriver
à une allocation largement sous-optimale des ressources, avec de temps en
temps des trucs qui refusent de fonctionner parce qu'ils ont atteint leur
limite alors qu'il reste plein de ressources à l'échelle globale, et dans
l'autre sens de temps en temps des trucs qui ne libèrent pas leurs
ressourcent immédiatement alors que le système est en train de swapper à
mort.
Avatar
totof01
On 20 juin, 20:43, Aéris wrote:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Le 20/06/2011 14:50, totof01 a écrit :

> Imagine que ton code est chargé de gérer le déplacement d'une mac hine-
> outil, et que ton malloc se vautre alors que tu es en train de faire
> un positionnement en vitesse rapide de ton outil. Il serait plus
> judicieux de couper les moteurs de déplacement de ton outil avent de
> se vautrer non ? Si tu laisses un segfault se produire avant de couper
> ton moteur, et que tu attaques la matiere en vitesse rapide, ça risqu e
> d'être drole.

Ai-je dis le contraire ?


Plus ou moins ... Tu as coupé la partie intéressante du commentaire
qui disait que tu préférais laisser le segfault se passer (ou message
d'erreur indiquant qu'il n'y a plus assez de mémoire) plutot que de
gérer toi-même l'erreur. Et moi je t'ai répondui que ce n'est pas
toujours possible en te citant un exemple.
Avatar
Aéris
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Le 21/06/2011 14:57, JKB a écrit :
Avec quinze ans de pratique sur les deux, je pense que ça commence
à montrer une tendance.



C'est facile de comparer un code en C avec 15 ans d'XP avec le même code
Java avec 0 XP et d'en tirer des conclusions sur la comète…

Moi aussi avec mes 15 ans d'XP en Java, j'en vois aussi du code C
totalement bloated…

- --
Aeris
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iQEcBAEBAgAGBQJOAN4OAAoJEK8zQvxDY4P9bSYH/jNZ9oX9NoNxEkx0xCKNBfRy
YUGP7VVaDYpnZprb0rPymoHbL7VoXmsS+1fV+TaCO3XY1eu+JfeUmPws33VDo++d
qJpps9xK3CxijNVdbmHhPd22NkJS+I9sBhG9GaClM7ugGkNpsaVduf1N+G5jmVsG
FebMrEbRrKSC0Xey3UaT2K4iY2NuW0ao27EItPFUtwAEoENA8mbj/e+oOv3hB9Ki
UGerVEhIzRD5cGfWaH6hReaQNmf7smtskJalgwV/c8YQNwei1VEJ6e56nqbcrDy5
bycFCBND9m4MX+UVgrSfpw3iptcPeazVnAZJKN1CpqM6WODdKvJchOG2kdtWjY4 =oymT
-----END PGP SIGNATURE-----
Avatar
Aéris
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Le 21/06/2011 08:50, JKB a écrit :
Qu'est-ce qu'il ne faut pas lire...

JKB



Ben excuse-moi, mais avec mes exemples de code C totalement sûrs bardés
de if dans tous les coins, la complexité moyenne de test est de 2^(nb
appel de fonctions) alors qu'en Java elle est de 0.

Ajouter une fonction supplémentaire en Java coûte donc 0 quelque soit la
taille du projet. En C, le coût proportionnel à la taille du projet
(passer de 10 à 11 appels passe la complexité de 2^10 = 1024 à 2^11 2048, passer de 30 [qui est la limite généralement admise en taille max
de fonction] à 31 de 1e19 à 2e19…).

Le code en C devient donc de moins en moins maintenable au fur et à
mesure des évolutions…

- --
Aeris
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iQEcBAEBAgAGBQJOAN9tAAoJEK8zQvxDY4P9t4IIAK8g+8Ru9Dlm6wskkSIJ9bJf
Ywz57/Wo2QOALATp5SUVY90GOEO7T1yl+H6n7f4zkWVMIih1scmTBbzNHUevl3Wl
HD+GLFxCrk1sq+Wgv1+4k3IbCco+p+EEshAAD0fpxEj0PUxXw5l9l/t+HCR1bqZn
CnDK9yC2MX9VVev025jJdfDe+zhoxd9xkTKBHF9GeIn/zpaKkUKUDedQAp6lPQPI
IQ3WdoJG49R08Lw91Q9dhT7GOijg5XmSR72Cv19aO8duMic5XhX7L46IzM9IpwZ2
8ICqLYLvMSl86ITgwjtcQVVKs15iB7EtU6olhjMRlk/yJ1dIUmXzNNfd2Y7wQbY =ia7L
-----END PGP SIGNATURE-----
Avatar
Yliur
>> > Non, ce n'est pas la seule différence. Plus de choses à gérer =>
>> > plus d'erreurs. A moins que tu écrives des programmes sans jamais
>> > aucune erreur ?
>>
>> Alors explique-moi pourquoi les plus belles conneries qui
>> m'aient été données de voir, c'est justement dans des codes Java ?
>
> C'est une expérience considérée comme statistiquement objective ?

Avec quinze ans de pratique sur les deux, je pense que ça
commence à montrer une tendance.



Bah tu es tout seul et rien de vérifiable, même pas de comparaison
dans des conditions objectives, rien... Est-ce que tu prétends que la
réputation du C de produire des programmes illisible est totalement
usurpée ?


>> > Moins d'attention du développeur gaspillée, moins de pollution
>> > dans le code.
>>
>> Aucun rapport. Si tu ne fais pas attention, tu feras des
>> conneries quel que soit le langage.
>
> Tu ne fais *jamais* de conneries ?

Ai-je prétendu le contraire ?



Et comme personne n'est parfait, la quantité de conneries dépend de la
difficulté et du nombre de trucs à surveiller. Pourquoi il y a plein de
failles dans des logiciels écrits en C ? Est-ce que les gens qui
écrivent Apache (par exemple) sont des grosses quiches ? Ou est-ce que
le fait qu'il y ait 255 trucs à se rappeler par ligne de code peut
intervenir ?


>> > La partie à comprendre en moins en java c'est les destructeurs
>> > (C++),
>>
>> Oui, et on voit les conneries des pointeurs qui ne sont
>> jamais déréférencés avec ce que ça implique, par exemple...
>
> On parle toujours de Java là ? Il y a très peu de choses à
> déréférencer, seulement quelques ressources particulières, comme
> déjà mentionné (gestion de cache par exemple ; même pour ça on peut
> utiliser des références faibles).

Lorsqu'il reste un pointeur quelque part qui pointe sur une
zone de la mémoire, cette zone n'est pas libérée. C'est un effet
pervers du GC, que tu le veuilles ou non. Et ce genre de bêtise est
très vite fait.



Pas plus qu'en C. En Java on ne le fait pas partout, on se concentre
sur les quelques ressources concernées, c'est tout. Et il y en a peu.
Le cas que tu cites est assez rare.


> Oui, les développeurs qui ont une formation plus large et/ou plus
> approfondie sont mieux formés et donc plus compétent (enfin en
> supposant qu'ils aient tout assimilé). Tu veux démontrer que les
> développeurs mieux formés sont meilleurs ? Youhou, quelle grande
> découverte. Sauf que toutes ces compétences ne sont pas forcément
> nécessaires. Dans "peu ou prou", il y a "peu" : les développeurs
> n'ont pas besoin de connaître autant de subtilité (ça ne veut pas
> dire rien, mais moins de choses), et surtout pas à s'en préoccuper,
> même s'il savent comment ça fonctionne.

Il y a deux niveaux. Celui où le dev sait que ça se passe
d'une certaine façon même s'il ne doit pas le gérer et celui où le
dev ne pipe mot à ce qu'il fait parce qu'il n'a pas conscience des
mécanismes. Mon expérience me dit que la plupart des devs
java qui n'ont fait que du java sont dans la deuxième catégorie. Et
figure-toi, ça me pose quelques problèmes quand je suis
obligé de passer derrière eux.



De fait il y a moins de choses à comprendre. Pour éviter les fuites de
mémoire il suffit en gros de savoir que ça marche presque tout seul,
les exceptions étant une poignée de ressources (dont il faut se
préoccuper de manière particulière dans d'autres langages aussi, comme
les fichiers ou le cache).


Pour ta gouverne, la JVM de Sun outrepasse allègrement les
options de mémoire minimale et maximale. Ne me demande pas pourquoi,
mais c'est un fait. J'ai un processus qui est censé ne pas dépasser
plus d'un Go de mémoire, et il occupe présentement 6 Go de mémoire de
autant de swap (Solaris sparc avec une JVM 1.6 64 bits). La
aussi, la JVM (ou son GC) sait mieux que le dev ce qu'il faut
utiliser comme paramètres. En fait, j'ai de plus en plus l'impression
que Java, c'est le microsoft des langage. Il sait mieux qu'un dev ce
qui est bon pour lui.



S'il y a un gros bug dans la JVM de Solaris, tu le signales aux gens
compétents. Je n'ai jamais vu ce comportement.


Je t'ai aussi déjà expliqué que dans la vraie vie, le dev qui
est pressé et dont le compilateur râle colle un gestionnaire
ramasse-tout (c'est aussi vrai en C++) et au final, c'est
contre-productif.



Ben je t'ai déjà répondu que le développeur pressé fera aussi des
conneries en C, c'est pareil.
Avatar
JKB
Le Tue, 21 Jun 2011 20:08:23 +0200,
Aéris écrivait :

Le 21/06/2011 14:57, JKB a écrit :
Avec quinze ans de pratique sur les deux, je pense que ça commence
à montrer une tendance.



C'est facile de comparer un code en C avec 15 ans d'XP avec le même code
Java avec 0 XP et d'en tirer des conclusions sur la comète…



J'ai écrit _sur les deux_. Je code effectivement plus en
C/C++/Fortran que Java, mais ce n'est pas pour ça que je suis in
néophyte en Java !

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr