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

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 Fri, 24 Jun 2011 12:30:59 +0200,
remy écrivait :
JKB a écrit :
Le Wed, 22 Jun 2011 05:47:49 -0700 (PDT),
Aeris Imirhil écrivait :
On 22 juin, 13:09, JKB wrote:
Ton exemple est typiquement du goret-codage. D'une part, si tu ne
sais pas quel est la prototype de la fonction, tu ferais bien de ne
pas l'utiliser.


Il ne s'agit pas de connaître uniquement le prototype de la fonction
mais la signification exacte de sa valeur de retour : est-ce une
donnée de retour ou un code d'erreur ?



Ça, mon grand, c'est spécifié dans le prototype et l'interface.




tien justement en parlent de truc a la con
voila se que je trouve dans uboot

void __show_boot_progress (int val)
{
return;
}
void show_boot_progress (int val) __attribute__((weak,
alias("__show_boot_progress")));

je devrait plutot dire

void inline __show_boot_progress (int val)
{
return;
}
void inline show_boot_progress (int val) __attribute__((weak,
alias("__show_boot_progress")));



Non.

qui ne passe pas le compilateur



C'est parfaitement normal.

en gros l'on "surcharge "la fonction show_boot_progress
au lieux de faire le ménage dans le code cool non



Au lieu de passer pour un idiot, tu devrais aller te plonger dans la
doc de gcc. Enfin, je dis ça, je dis rien.

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
Yliur
Le 24 Jun 2011 09:09:42 GMT
Nicolas George <nicolas$ a écrit :

Michel Talon, dans le message
<itt792$oeb$, a écrit :
> Dans le même ordre d'idée il y a le typage
> automatique et
> dynamique des variables, comme en python, et qui n'existe pas en
> Java,

Là, je ne suis franchement pas d'accord du tout, pour la combinaison
de ces deux raisons :

- Dans un programme correctement écrit et débuggé, une variable n'a
qu'un seul type : si quelque part on écrit « a = x + 42 », c'est que
a et x sont des nombres (entiers ou flottants), et si ailleurs on
utilise a ou x comme des pointeurs ou des tableaux, c'est qu'il y a
un bug.

- Quand il y a un bug, il vaut mieux le détecter le plus tôt
possible, si possible au moment où le programme est compilé ou chargé
plutôt qu'au moment où l'endroit où se trouve l'erreur est exécuté.

Le typage statique des variables permet justement ça, et ça évite en
particulier une quantité innombrable d'erreurs idiotes, tout en
posant des inconvénients minimaux au programmeur.

Après, on peut éventuellement préférer du typage statique
automatique, façon CaML, plutôt que du typage statique explicite
façon C, mais la charge de devoir écrire « int x » la première fois
est assez négligeable.

Tiens, un exemple : je suis en train de travailler sur le système de
gestion des adhérents d'une association. Dans la base de données,
chaque membre peut avoir plusieurs noms (ça sert surtout pour les
femmes mariées). Pour expédier du courrier, il faut choisir le quel
de ces noms on met sur l'enveloppe. Il y a des heuristiques, mais
surtout un champ dans la structure de données qui contient le nom. Ce
champ s'appelle nom_envoi. Mais j'avais oublié ça, et j'avais supposé
qu'il s'appelait envoi tout court, puisqu'il est de toutes façons
dans la structure nom. Le langage est à déclarations et typage
dynamique : il a accepté sans broncher que j'utilise ce champ sorti
de nulle part, et du coup le mécanisme ne marchait pas. Le bug n'a
été repéré que parce que la permanente de l'association fait son
boulot très consciencieusement et a vu l'erreur de nom sur certaines
des adresses.

Si j'avais utilisé un langage avec des déclarations statiques,
l'erreur aurait été vue immédiatement. Je considère que c'est une
déficience de ce langage que de ne pas permettre une telle analyse
statique du code. Évidemment, à côté de ça, ses avantages dans
d'autres domaines font que je persiste dans mon choix du langage,
mais s'il pouvait garder tous ses avantages _et_ avoir du typage
statique, ce serait infiniment mieux.



Je ne vais pas refaire le débat éternel sur le typage statique contre
les tests unitaire automatisés, mais il semble d'après ce que tu dis
que si tu avais testé le point précis que tu as modifié tu aurais
découvert l'erreur.

De manière plus générale : oui les développeurs peuvent faire des
erreurs et si le compilateur les rattrape tant mieux, mais je ne trouve
pas que l'intérêt des langages à typage dynamique ce soit le gain de
temps sur les déclarations (à part pour faire un prototype vite fait
peut-être). Ce serait plutôt sur la possibilité qu'ils offrent d'écrire
des choses plus génériques, de plus haut niveau (jusqu'à "créer des
langages" avec un langage comme Lisp). Et permettre d'écrire des choses
de plus haut niveau, c'est aussi limiter les possibilités d'erreur. Je
trouve que ça vient contrebalancer le fait que les types ne soient pas
déclarés, source d'erreurs plutôt facile à détecter (oui, pas toujours,
mais ce ne sont pas forcément les plus difficiles). Et les deux ne sont
pas toujours compatibles.
Avatar
remy
JKB a écrit :
Le Fri, 24 Jun 2011 12:30:59 +0200,
remy écrivait :
JKB a écrit :
Le Wed, 22 Jun 2011 05:47:49 -0700 (PDT),
Aeris Imirhil écrivait :
On 22 juin, 13:09, JKB wrote:
Ton exemple est typiquement du goret-codage. D'une part, si tu ne
sais pas quel est la prototype de la fonction, tu ferais bi en de ne
pas l'utiliser.


Il ne s'agit pas de connaître uniquement le prototype de la fon ction
mais la signification exacte de sa valeur de retour : est-ce une
donnée de retour ou un code d'erreur ?


Ça, mon grand, c'est spécifié dans le prototype et l' interface.



tien justement en parlent de truc a la con
voila se que je trouve dans uboot

void __show_boot_progress (int val)
{
return;
}
void show_boot_progress (int val) __attribute__((weak,
alias("__show_boot_progress")));

je devrait plutot dire

void inline __show_boot_progress (int val)
{
return;
}
void inline show_boot_progress (int val) __attribute__((weak,
alias("__show_boot_progress")));



Non.

qui ne passe pas le compilateur



C'est parfaitement normal.



ben si tu le dit ,perso je ne voie pas pourquoi
je ne peut pas introduire des "nop " en static dans le binaire
mais bon le ne suis pas très un pros des subtilités du C


en gros l'on "surcharge "la fonction show_boot_progress
au lieux de faire le ménage dans le code cool non



Au lieu de passer pour un idiot, tu devrais aller te plonger dans la
doc de gcc. Enfin, je dis ça, je dis rien.




ce qui ne change rien au fais que je trouve ce type de pratique
particulièrement peut propre pour reste poli




JKB





--
http://remyaumeunier.chez-alice.fr/
Avatar
remy
JKB a écrit :
Le Fri, 24 Jun 2011 12:30:59 +0200,
remy écrivait :
JKB a écrit :
Le Wed, 22 Jun 2011 05:47:49 -0700 (PDT),
Aeris Imirhil écrivait :
On 22 juin, 13:09, JKB wrote:
Ton exemple est typiquement du goret-codage. D'une part, si tu ne
sais pas quel est la prototype de la fonction, tu ferais bi en de ne
pas l'utiliser.


Il ne s'agit pas de connaître uniquement le prototype de la fon ction
mais la signification exacte de sa valeur de retour : est-ce une
donnée de retour ou un code d'erreur ?


Ça, mon grand, c'est spécifié dans le prototype et l' interface.



tien justement en parlent de truc a la con
voila se que je trouve dans uboot

void __show_boot_progress (int val)
{
return;
}
void show_boot_progress (int val) __attribute__((weak,
alias("__show_boot_progress")));

je devrait plutot dire

void inline __show_boot_progress (int val)
{
return;
}
void inline show_boot_progress (int val) __attribute__((weak,
alias("__show_boot_progress")));



Non.

qui ne passe pas le compilateur



C'est parfaitement normal.



ben si tu le dit ,perso je ne voie pas pourquoi
je ne peut pas introduire des "nop " en static dans le binaire
mais bon ,je ne suis pas un pro des subtilités du C

en gros l'on "surcharge "la fonction show_boot_progress
au lieux de faire le ménage dans le code cool non



Au lieu de passer pour un idiot, tu devrais aller te plonger dans la
doc de gcc. Enfin, je dis ça, je dis rien.



ce qui ne change rien, je trouve ce type de pratique
particulièrement peut propre pour rester poli

remy

--
http://remyaumeunier.chez-alice.fr/
Avatar
Nicolas George
Yliur , dans le message , a écrit :
mais il semble d'après ce que tu dis
que si tu avais testé le point précis que tu as modifié tu aurais
découvert l'erreur.



Oui, évidemment, j'ai été négligent. Mais pour faire le test, il faut
soupçonner que l'erreur puisse se produire. Pour une erreur triviale, c'est
justement ça le problème.

Ce serait plutôt sur la possibilité qu'ils offrent d'écrire
des choses plus génériques, de plus haut niveau (jusqu'à "créer des
langages" avec un langage comme Lisp).



Là, tu commets l'erreur de confondre typage dynamique et généricité. On peut
parfaitement faire des choses génériques en typage statique. Tout au plus,
ça alourdit légèrement la généricité intrusive (celle où on regarde le type
d'un objet et où on agit en conséquence), qui est de toutes façons une
mauvaise conception.
Avatar
Aéris
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Le 24/06/2011 11:09, Nicolas George a écrit :
Ce champ s'appelle nom_envoi. Mais
j'avais oublié ça, et j'avais supposé qu'il s'appelait envoi tout court,
puisqu'il est de toutes façons dans la structure nom.



Ce qui me gène le plus dans le typage dynamique, c'est surtout le cas
inverse.

« def foo ( bar ) »

— Je dois passer quoi comme contrat minimal pour « bar » pour que
*cette* méthode fonctionne ?
— Pire, je dois remplir quoi comme contrat pour que *toutes* les
méthodes en dépendant fonctionnent ?

En effet :

def foo ( bar ) :
if bar.fooBar … :

self._bar = bar

impose au minimum un attribut « fooBar » pour le paramètre « bar »
mais si *n'importe où* dans le code on trouve :

def foo2 ( ) :
return self._bar.fooBar2

alors le « foo » de départ avait aussi besoin d'un paramètre « fooBar2 »…

Mais le code va en réalité non pas planter sur le « foo » mais sur le «
foo2 », qui peut se trouver aux antipodes de la cause 1ère de l'erreur,
rendant le debug digne d'un parcours du combattant…

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

iQEcBAEBAgAGBQJOBN3BAAoJEK8zQvxDY4P9X0YIAKbnm/gA7LoHO8NtTqqYfnwE
lsOGm13v5t2BETLjVTzwo9vOL+wd9chwPgutR7OMVF8xsP+QtHl/V/ZjKS3rr8dd
2kPfDHf3039ICmGLdmLK/qpYAwCTYgE9X+CPU1kSTovYX7yF/Y2kgNTKGza0tzG5
KKwqLLvGcawCnxIn3Z2z6Ro8039ZkcdcavgvbkxJ/B1UCV4rmQjm6IJSfRtBXEVY
9HJVUwsg9iXIAyUf8TcXf63YOMb2UToUtz/Fv2/D7yB6clPToYeyZIMLEhHmqqgf
xayrRBW5IQRb3nFZ8HFIGBpUvPFzbRW0EW2+Fhldbj5lztdyEs7t9c0GLkwuYoc
41
-----END PGP SIGNATURE-----
Avatar
Mihamina Rakotomandimby (R12y)
On Wed, 22 Jun 2011 10:02:31 -0700, totof01 wrote:
Ya pas de "ccommun des développeurs" en C : il n'y a que des bons. Les
autres, ils se rendent vite compte que "le C c'est trop compliqué, faut
gérer la mémoire et des pointeurs", et ils se mettent à faire du Java,
ou pire, du Python. Les plus gorets d'entre eux font du Perl ou du
Visual Basic.



Yeah! Enfin une bonne discussion! :-)
Avatar
Yliur
> Ce serait plutôt sur la possibilité qu'ils offrent
> d'écrire
> des choses plus génériques, de plus haut niveau (jusqu'à "créer des
> langages" avec un langage comme Lisp).

Là, tu commets l'erreur de confondre typage dynamique et généricité.
On peut parfaitement faire des choses génériques en typage statique.



Avec beaucoup d'interfaces (pour ce qui concerne Java) ?

Tout au plus, ça alourdit légèrement la généricité intrusive (celle
où on regarde le type d'un objet et où on agit en conséquence), qui
est de toutes façons une mauvaise conception.



Euh... pas forcément, si tu fais des choses "vraiment
génériques" (disons de la méta-programmation).
Avatar
Nicolas George
Yliur , dans le message , a écrit :
Avec beaucoup d'interfaces (pour ce qui concerne Java) ?



Oui, les interfaces sont la manière java de faire ça. Ce n'est pas la seule
solution possible.

Euh... pas forcément, si tu fais des choses "vraiment
génériques" (disons de la méta-programmation).



Ça n'évite pas de devoir énumérer tous les cas possibles au niveau local, ce
qui est assez contradictoire avec le principe même de généricité.
Avatar
Dellara
Yliur a papoté sur Usenet le 27 juin 2011 18:15:


>Ce serait plutôt sur la possibilité qu'ils offrent
>d'écrire
> des choses plus génériques, de plus haut niveau (jusqu'à "créer des
> langages" avec un langage comme Lisp).

Là, tu commets l'erreur de confondre typage dynamique et généricité.
On peut parfaitement faire des choses génériques en typage statique.



Avec beaucoup d'interfaces (pour ce qui concerne Java) ?

Tout au plus, ça alourdit légèrement la généricité intrusive (celle
où on regarde le type d'un objet et où on agit en conséquence), qui
est de toutes façons une mauvaise conception.



Euh... pas forcément, si tu fais des choses "vraiment
génériques" (disons de la méta-programmation).



Ah bon, j'ai compris. Tu veux avoir des conversations privées avec
chacun de tes interlocuteurs! Ou alors tu ne juges pas opportun de faire
connaître les contribruiteurs avec qui tu discutes parce qu'ils n'en
valent pas la peine.