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 20:37:18 +0200,
Aéris écrivait :

Le 20/06/2011 14:52, JKB a écrit :
Ah, tu vois, finalement, tu es d'accord avec moi. Et dans ce cas,
l'exception n'apporte rien puisque l'intérêt de l'exception est
justement de ne pas gérer les erreurs ligne après ligne.



Code selon JBK :

int writeToFile(char *filename, char *data, int *written) {
File *file = new File();
if ( open(filename, file) != 0 ) {
*written = -1;
return ERROR_UNABLE_TO_OPEN_FILE;
}

int w = 0;
if ( write(file, data, &w) != 0 ) {
*written = -1;
delete file;
return ERROR_UNABLE_TO_WRITE_DATA;
}

*written = w;
delete file;
return 0;
}

Noter :
— les multiples passages par référence parce que la valeur de retour est
déjà occupée par le code d'erreur



Soit précis. Ce sont des passages par pointeur et non par référence.
Passons.

— la complexité absurde de la gestion de « written », obligeant à
déclarer une variable locale afin de ne pas affecter une valeur débile
en cas d'erreur
— l'ultra-complexité du nettoyage du « file » temporaire
– la longueur du code
– la duplication du « *written = -1; » ou encore du « delete file; »



Tu le fais vraiment exprès. J'abandonne.

Je n'ose trop ajouter le moindre bout de code là-dedans de peur
d'exponentialiser la complexité de la gestion des variables temporaires
(de plus en plus seront à nettoyer au fur et à mesure de la progression
dans la fonction.

À comparer à la même fonction en Java :

int writeToFile(String filename, String data) throw FileException,
IOException {
File file = new File();
try {
// Lancera une FileException en cas d'erreur
open(filename, file);
// Lancera une IOException en cas d'erreur
return write(file, data);
} finally {
file.close();
}
}



À comparer à rien du tout parce que les deux fonctions ne sont pas
identiques puisque ce que tu fais explicitement dans la fonction C
doit être fait explicitement dans l'appelant Java au travers de deux
gestionnaires d'exception.

2× moins de code, 0 duplication, aucune variable locale bidon, pas de
complexité ni d'imbrication…

Je laisse au lecteur le soin de décider quel code est le plus propre, le
plus réutilisable, le plus maintenable…



Écris les deux jusqu'au vout et on en reparle. Jusque-là, fin de la
discussion pour ma part.

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
Aéris
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Le 20/06/2011 21:14, JKB a écrit :
À comparer à rien du tout parce que les deux fonctions ne sont pas
identiques puisque ce que tu fais explicitement dans la fonction C
doit être fait explicitement dans l'appelant Java au travers de deux
gestionnaires d'exception.



Faux

Dans les 2 cas je fais strictement la même chose : écrire des données
dans un fichier indiqué par son nom et retourner la longueur écrite, en
signalant une erreur d'accès au fichier ou d'écriture dans le fichier.

La gestion de l'erreur dans la couche du dessous pose de toute façon le
même problème : gérer chaque ligne une par une en C, alors que la
gestion sera globale en Java.

int foo(…) {
int w = 0;
int t = writeToFile(filename, data, &w);
if ( t == ERROR_FILE_ACCESS ) {
handleFileError();
cleanResources1();
return ERROR_FILE_ACCESS;
} else ( t == ERROR_WRITE_ACCESS ) {
handleWriteError();
cleanResources2();
return ERROR_WRITE_ACCESS;
} else ( t != 0 ) {
whatTheFuck(???);
return ERROR_UNKNOW;
}
}

void foo(…) throw FileException, IOException {
try {
return writeToFile(filename, data);
} catch (FileException e) {
handleFileError();
throw e;
} catch (IOException e) {
handleWriteError();
throw e;
}
// No, WTF is impossible !!!
}

Rien que le cas « WTF » en cas d'erreur inconnue ou oubliée en C est
éliminatoire pour la sécurité…

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

iQEcBAEBAgAGBQJN/5/TAAoJEK8zQvxDY4P9DkQH/0nrzQq+8zbeBpSCUNDhEzdK
ncbEwbae/ZKKf4Hk9f+329O6XoOKaYhdcyWIawFfmiOBDL7uiXIr9f/DyC1RHQ79
N6Vqsq7mMWgk/W4KTqrts11TRp/Rs905Cl+SwvjbyUOQSgwBZBMCQ/8+XnxYWr5Y
IPVsUvhaik4JFw5FNt+GwXeL6K9Sx9fCRc9WkQbfzkDYl6VEeYAbhPhvzGs2xYQ6
pR+so1jmNWAzP87UHu6Ekknv047Vj4acaaVIMPVxp+mxeihrezo4JxSgbhpJLNBL
Ixo3XOem3/bi7mjdf+D4LbO9jLkpE1WFm3i5xX3XpvMppOG632jy4onyrukXrOo =7TsJ
-----END PGP SIGNATURE-----
Avatar
Nicolas George
JKB , dans le message , a
écrit :
Tu peux regarder comment est fichu
Boehm-GC, c'est instructif.



Là, cet argument est vraiment pourri. Boehm GC, c'est fait pour ajouter un
GC au C++, qui a été conçu sans GC et en laissant le programmeur manipuler
directement les pointeurs. Du coup, Boehm GC doit utiliser des heuristiques
complexes pour essayer de deviner ce qui est une racine de structure de
données, et dans les structures de données, ce qui peut être un pointeur à
suivre. Ces heuristiques, d'ailleurs, ne sont totalement fiables ni dans un
sens ni dans l'autre.

Dans un langage comme java, Perl ou CaML, en revanche, qui a été conçu dès
le départ pour fonctionner avec un GC, la structure des objets en mémoire
est connue, et parcourir les références est beaucoup plus simple.

Il y a de bonnes raisons de critiquer les GC, en particulier leurs
interactions désastreuses avec tout ce qui est cache ou swap (on est un peu
short en mémoire, le système commence à swapper : n'est-ce pas le meilleur
moment pour aller parcourir dans un ordre aléatoire toute la mémoire du
processus, y compris des bouts qui n'ont pas servi depuis des heures et ne
resserviront pas avant des heures ?), et de les rejeter pour tout ce qui
demande un tant soit peu de performance.

Mais la complexité du code de Boehm n'est pas une de ces bonnes raisons.
Avatar
Aéris
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Le 20/06/2011 22:15, Nicolas George a écrit :
Il y a de bonnes raisons de critiquer les GC



Il y en a surtout une qui avantage énormément les GC : les mecs de chez
Sun, Oracle ou IBM sont bien plus compétents que nous pour savoir
comment gérer (proprement si possible) la mémoire.

Et même si vous n'êtes pas d'accord avec ça, vous serez d'accord avec la
contraposée : il est totalement délirant de laisser chaque développeur
gérer sa mémoire.
Déjà parce que la plupart du temps il ne s'agira pas de sa mémoire mais
de celle de l'appelant, mais en plus il y a fort à parier qu'il n'est
pas ou très peu compétent sur toutes les vraies problématiques de ce
qu'est une gestion au moins correcte sinon propre de la mémoire.

Le problème est donc toujours le même :
— le niveau d'une équipe de dev en C est égale à celle de son plus
faible maillon, le reste de l'équipe n'ayant aucun moyen d'éviter et de
contourner les erreurs (visibles ou non) qu'il a pu commettre.
— le niveau d'une équipe de dev en Java est sensiblement égale à celle
de son plus fort maillon, celui-ci aillant toujours la possibilité de
bâtir un code et une architecture ne faisant aucune hypothèse sur la
fiabilité du code réalisé par des devs moins compétents (au pire un gros
try/catch).

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

iQEcBAEBAgAGBQJN/69xAAoJEK8zQvxDY4P9up8H/RYiEck41h/ghhvi3Yiwjznh
BihSNw/W2r13cxdfQxtvVhtya4hi9Cn3OP9+nJn3v3umOne4+RnnD7/cSs9lGp6U
jMLopLNMQYvnGFD2qpJs9/VHTQDRkX/aqfSA/8K1DZuDg7hDlND1wzdSczzpMPiL
9PtMZX4EcAmtgsJTqc+g0QCIsvs+N1mG10tZfPdqGrQxozDbVepElzZ7Lbo2nz2U
lOL74S+ESY34cD21tkkEDk5J0WLD6uXrujMhxLqlB5SSHcq+BYlUaxdFlZl1QD9d
tC7AsoX3ACDX8mSlMeRa5NdXZnv3koF78aLLIbZDgCv64QWh/Qe5rzFndAC2198 ko2
-----END PGP SIGNATURE-----
Avatar
Nicolas George
Aéris , dans le message <4dffb0a8$0$11311$, a
écrit :
Il y en a surtout une qui avantage énormément les GC : les mecs de chez
Sun, Oracle ou IBM sont bien plus compétents que nous pour savoir
comment gérer (proprement si possible) la mémoire.



N'importe quoi.

Et même si vous n'êtes pas d'accord avec ça, vous serez d'accord avec la
contraposée : il est totalement délirant de laisser chaque développeur
gérer sa mémoire.



Tu devrais réviser tes cours de logique élémentaire, ça n'a rien d'une
contraposée.

— le niveau d'une équipe de dev en C est égale à celle de son plus
faible maillon, le reste de l'équipe n'ayant aucun moyen d'éviter et de
contourner les erreurs (visibles ou non) qu'il a pu commettre.



N'importe quoi.

— le niveau d'une équipe de dev en Java est sensiblement égale à celle
de son plus fort maillon, celui-ci aillant toujours la possibilité de
bâtir un code et une architecture ne faisant aucune hypothèse sur la
fiabilité du code réalisé par des devs moins compétents (au pire un gros
try/catch).



N'importe quoi.
Avatar
JKB
Le Mon, 20 Jun 2011 22:42:16 +0200,
Aéris écrivait :

Le 20/06/2011 22:15, Nicolas George a écrit :
Il y a de bonnes raisons de critiquer les GC



Il y en a surtout une qui avantage énormément les GC : les mecs de chez
Sun, Oracle ou IBM sont bien plus compétents que nous pour savoir
comment gérer (proprement si possible) la mémoire.



Non. Les mecs de Sun, IBM et autres ont écrit des specs pour que le
programmeur final n'ait pas à se poser les questions qui fâchent
quitte à avoir des performances minables.

Et même si vous n'êtes pas d'accord avec ça, vous serez d'accord avec la
contraposée : il est totalement délirant de laisser chaque développeur
gérer sa mémoire.



Certes, mais il y a un juste milieu et ce juste milieu ne passe
certainement pas par un garbage collector. J'ai développé un
ensemble de bibliothèque dans lesquelles l'utilisateur n'effectue
_jamais_ un malloc(), _jamais_ un free(), et il n'y a aucun garbage
collector. Comme quoi, quand on veut, on peut.

Déjà parce que la plupart du temps il ne s'agira pas de sa mémoire mais
de celle de l'appelant, mais en plus il y a fort à parier qu'il n'est
pas ou très peu compétent sur toutes les vraies problématiques de ce
qu'est une gestion au moins correcte sinon propre de la mémoire.

Le problème est donc toujours le même :
— le niveau d'une équipe de dev en C est égale à celle de son plus
faible maillon, le reste de l'équipe n'ayant aucun moyen d'éviter et de
contourner les erreurs (visibles ou non) qu'il a pu commettre.



Tu as une drôle de conception de la revue de code. Passons.

— le niveau d'une équipe de dev en Java est sensiblement égale à celle
de son plus fort maillon, celui-ci aillant toujours la possibilité de
bâtir un code et une architecture ne faisant aucune hypothèse sur la
fiabilité du code réalisé par des devs moins compétents (au pire un gros
try/catch).



Idem.

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
Aéris
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Le 20/06/2011 23:03, JKB a écrit :
Tu as une drôle de conception de la revue de code. Passons.



La revue de code en C⁺⁺ se termine généralement par « eh les mecs,
comment ça se fait que ces codes de retour ne sont pas testés ? »
Pour ensuite finir par un « Oui mais on avait déjà 42 niveaux de if
imbriqués et faudrait encore en ajouter 13 pour être complet… »

Et la décision finale est « Bon, on ne peut rien faire, ça demande de
casser les ¾ du code… »


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

iQEcBAEBAgAGBQJN/7m7AAoJEK8zQvxDY4P9RYwH/0mbo4GSvEMeJruBzqZPVXgj
8pSsliyJ3H0qFcrIMSJE4XSQwpNt0aUHUBCs66KvuInpj24fB1ZhGejSlR7phIQZ
VWAFYbM32J0n+RLxBlDhFjJMEtQlemWzN16P8nJ2UWYMiIGFKU7sQ7UdqJFjSK5H
wdhSaK/OC82pdfBZ2bU02u2GdzzAWXPl/4tPfdeX2H2oqrk8Sgm0ROqZ0hsCiRKA
fI1sVIgBF66HtuncjARl+lI9Bx6diO56NsLY9Ch+xiO1vGB3nw3Rn1lsRAvcvIRH
Ny+krd0i41yuyCwz0zrzDtHPeyeI7pkcJymL5ieG7JT2RakzcGqBQGmGP0TAW/8 =tYaF
-----END PGP SIGNATURE-----
Avatar
talon
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
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 ...


--

Michel TALON
Avatar
ST
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;
}

Code selon JBK :

int writeToFile(char *filename, char *data, int *written) {
File *file = new File();
if ( open(filename, file) != 0 ) {
*written = -1;
return ERROR_UNABLE_TO_OPEN_FILE;
}

int w = 0;
if ( write(file, data,&w) != 0 ) {
*written = -1;
delete file;
return ERROR_UNABLE_TO_WRITE_DATA;
}

*written = w;
delete file;
return 0;
}

Noter :
— les multiples passages par référence parce que la valeur de retour est
déjà occupée par le code d'erreur
— la complexité absurde de la gestion de « written », obligeant à
déclarer une variable locale afin de ne pas affecter une valeur débile
en cas d'erreur
— l'ultra-complexité du nettoyage du « file » temporaire
– la longueur du code
– la duplication du « *written = -1; » ou encore du « delete file; »

Je n'ose trop ajouter le moindre bout de code là-dedans de peur
d'exponentialiser la complexité de la gestion des variables temporaires
(de plus en plus seront à nettoyer au fur et à mesure de la progression
dans la fonction.

À comparer à la même fonction en Java :

int writeToFile(String filename, String data) throw FileException,
IOException {
File file = new File();
try {
// Lancera une FileException en cas d'erreur
open(filename, file);
// Lancera une IOException en cas d'erreur
return write(file, data);
} finally {
file.close();
}
}






--
http://www.unices.org
Avatar
JKB
Le Mon, 20 Jun 2011 23:21:04 +0200,
Aéris écrivait :

Le 20/06/2011 23:03, JKB a écrit :
Tu as une drôle de conception de la revue de code. Passons.



La revue de code en C⁺⁺ se termine généralement par « eh les mecs,
comment ça se fait que ces codes de retour ne sont pas testés ? »
Pour ensuite finir par un « Oui mais on avait déjà 42 niveaux de if
imbriqués et faudrait encore en ajouter 13 pour être complet… »



Non, ça ne se fait pas comme ça. Effectivement, si la revue de code
s'arrête à ce genre de considération, autant utiliser l'usine à
gaz avec des fuites qu'est Java !

Une revue de code un tant soit peu sérieuse, ça prend un peu plus de
temps que l'écriture du code et les tests unitaires. On ne la prend
pas à la légère.

Et la décision finale est « Bon, on ne peut rien faire, ça demande de
casser les ¾ du code… »



Qu'est-ce qu'il ne faut pas lire...

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