3930

Ahah grin J'imagine bien le bébé dont le lange change de type...
Hop, lavable, hop en coton, hop jetable... grin
avatar

3931

Kevin Kofler (./3907) :
Le Java est moins puissant que le C++
La phrase que l'on voit typiquement quand on parle de langage de programmation, qui n'a aucun sens, ou du moins un sens très différents suivant les personnes :
- La capacité de faire des chose en peu de lignes de codes (Perl est tès puissant)
- La capacité de faire de la métaprogrammation avancée (LISP est très puissant)
- La capacité de faire du code dégeu qui a l'air de marcher ( JavaScript est très puissant)
- La capacité de faire un code dont on a une idée de comment il va être compilé (C est très puissant)
- La capacité de faire des choses avec un minimum d'apprentissage (Go est très puissant)
- La capacité de faire ce que fait mon langage préféré (mon langage préféré est très puissant)

Kevin Kofler (./3909) :
Le GC fait que tu dois fixer un seuil de mémoire arbitraire à partir duquel libérer la mémoire, donc tant que tu es en dessous du seuil, le programme en consomme de plus en plus sans rien libérer, et si tu le dépasses, plus rien ne marche (ça commence à passer tout le temps dans le GC et, si jamais ça sort de la boucle, ça finit avec une exception "Java heap space" ("exhausted", mais ce n'est pas écrit explicitement dans le message de l'exception)). Du coup, tu ne peux pas utiliser de manière efficace la RAM de ta machine: soit tu bouffes toute la RAM pour rien (seuil trop haut), soit le programme plante alors qu'il resterait plein de RAM dans la machine (seuil trop bas).
Tout d'abord, c'est plus un soucis de la VM de Sun/Oracle et de OpenJDK qui en a hérité que du langage en lui même. Il y a des langes avec GC qui gèrent leur mémoire de manière sensiblement différente. Cependant, contrairement à ton intuition, si tu ne consomme pas trop de RAM, la VM d'Oracle libère cependant la RAM bien avant d’atteindre le maximum. Ce qui est trompeur c'est que c'est vrai qu'elle ne libère pas immédiatement et si tu alloue souvent, tu va atteindre le maximum avant qu’elle ai libéré assez, et a ce point elle sera obligé de libérer en effet.

Kevin Kofler (./3909) :
Un autre gros inconvénient est que le GC bloque l'exécution régulièrement à des endroits difficilement prévisibles, ce qui non seulement rend le Java inutilisable pour toute application temps réel (Ce n'est pas par hasard qu'il y a un gros avertissement de Sun/Oracle de ne jamais utiliser la technologie Java dans un réacteur nucléaire, ce serait le prochain Tchernobyl!),
C'est vrai que les pauses du GC sont un vrai problèmes pour certains types d'application. Je peux témoigner, pour avoir développé des jeux en Java, Le GC était un problème qui revenait régulièrement.

Kevin Kofler (./3909) :mais se remarque aussi dans la vie courante quand l'interface utilisateurs d'un logiciel freeze soudain pour une seconde ou deux parce que le GC a choisi de s'activer de nulle part.
Par contre, les freeze de l'IHM sont rarement un problème du au GC en lui même mais plutôt à une mauvaise utilisation des bibliothèques IHM, particulièrement Swing qui exigent de travailler d'une manière particulière qui est souvent mal respectée. Les appli Java qui respectent les règles n'ont pas ce genre du problème.

Kevin Kofler (./3909) :Et le troisième gros inconvénient est que le GC fait que tu ne contrôles pas quand le finalisateur de l'objet sera appelé. (Du coup, les objets pour lesquels c'est important nécessitent un close() explicit qu'on risque d'oublier, et il y a ce hack de "try with resources" qui fait que finalement, ces objets s'utilisent de la même manière qu'un objet RAII en C++. Sauf que tu ne peux pas oublier d'appeler le destructeur en C++ alors que tu peux oublier d'utiliser "try with resources" ou d'appeler close() explicitement en Java.)
Si on ne pouvait pas oublier d'appeler le destructeur en C++, ça se saurait.


Warpten (./3921) :
le try-with-resources c'est ni plus ni moins qu'une copie du using de C#.
Et le C# à la base n'est ni plus ni moins qu'une copie du Java.
Les langages s'inspirent les un les autres et c'est tant mieux (sauf quand ils s'inspirent du JavaScript).

Warpten (./3921) :
Au niveau des spurious wakeups du GC, en C# on a des mecanismes pour dire au GC de s'absenter pendant l'execution d'une routine je crois. En Java je connais pas.
A ma connaissance, ça n’existe pas dans le VM J2SE standard. On peut juste essayer de forcer les GC aux moments les moins critiques pour réduire le risque qu'ils arrivent dans les sections critiques.

Godzil (./3929) :
Uther (./3927) :
mais il reste généralement plus performant et maintenable que les langes a typage dynamique
##pointgodzil##
Pas du tout, je voulais dire par là que ce sont des outils à destination des jeunes programmeurs ##rattrapage_aux_branches##
avatar

3932

Uther (./3931) :
- La capacité de faire ce que fait mon langage préféré (mon langage préféré est très puissant)
Et c'est même le meilleur pour ça !
(très bon résumé oui)
avatar

3933

Uther (./3931) :
Kevin Kofler (./3907) :
Le Java est moins puissant que le C++
La phrase que l'on voit typiquement quand on parle de langage de programmation, qui n'a aucun sens, ou du moins un sens très différents suivant les personnes :
- La capacité de faire des chose en peu de lignes de codes (Perl est tès puissant)
- La capacité de faire de la métaprogrammation avancée (LISP est très puissant)
- La capacité de faire du code dégeu qui a l'air de marcher ( JavaScript est très puissant)
- La capacité de faire un code dont on a une idée de comment il va être compiler (C est très puissant)
- La capacité de faire des choses avec un minimum d'apprentissage (Go est très puissant)
- La capacité de faire ce que fait mon langage préféré (mon langage préféré est très puissant)
Ma définition de "puissant" est une que tu n'as pas citée: la richesse en fonctionnalités du langage. Par exemple, le C++ permet la surcharge d'opérateurs, le Java ne la permet pas. Du coup, si on essaie par exemple de faire de l'arithmétique d'intervalles en Java (ce qu'on fait couramment dans l'équipe dans laquelle je travaille), le code devient vite totalement imbitable dès qu'on a une formule non-triviale. En C++, on peut utiliser la notation habituelle.

Par contre, les freeze de l'IHM sont rarement un problème du au GC en lui même mais plutôt à une mauvaise utilisation des bibliothèques IHM, particulièrement Swing qui exigent de travailler d'une manière particulière qui est souvent mal respectée. Les appli Java qui respectent les règles n'ont pas ce genre du problème.
Le fait que Swing ne permet pas de synchroniser l'IHM si on travaille dans le thread de l'IHM (contrairement à tous les autres frameworks d'IHM que j'ai utilisés jusqu'à présent: VB a DoEvents, Delphi a Application.processMessages, Qt a QCoreApplication::processEvents) est aussi un problème. Cela oblige à utiliser les threads, mais comme Swing n'est pas thread-safe et donc l'IHM ne peut être manipulée que dans le thread de l'IHM, tu te retrouves avec des problèmes de synchronisation. Du coup, certains développeurs préfèrent éviter et accepter les freezes.

Mais les freezes dus au GC existent aussi. (Il suffit de cliquer sur le graphique de consommation de mémoire dans NetBeans pour forcer un GC pour s'en rendre compte, l'IHM freeze immédiatement si tu fais ça.)

Si on ne pouvait pas oublier d'appeler le destructeur en C++, ça se saurait.
Certes, si tu utilises new, tu peux leaker l'objet, et du coup le destructeur ne sera pas appelé non plus. Mais si tu manages correctement ta mémoire, tu n'as pas ce problème.

Une méthode est la méthode RAII, où tu n'appelles jamais new, mais construis tout sur la pile. Si un objet est trop gros pour la pile, tu construis un smart pointer sur la pile, et celui-ci s'occupe d'allouer et libérer l'objet pointé comme s'il était sur la pile. Cela dit, si tu as besoin de retourner un objet alloué d'une fonction, tu dois du coup retourner un smart pointer adapté et faire attention à ne pas leaker celui-ci, donc les smart pointers ne résolvent pas tous les problèmes. Il faut quand-même savoir ce qu'on fait, contrairement à un langage à base de GC.

Les langages s'inspirent les un les autres et c'est tant mieux (sauf quand ils s'inspirent du JavaScript).
LOL la parenthèse!
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

3934

Kevin Kofler (./3933) :
Ma définition de "puissant" est une que tu n'as pas citée: la richesse en fonctionnalités du langage. Par exemple, le C++ permet la surcharge d'opérateurs, le Java ne la permet pas. Du coup, si on essaie par exemple de faire de l'arithmétique d'intervalles en Java (ce qu'on fait couramment dans l'équipe dans laquelle je travaille), le code devient vite totalement imbitable dès qu'on a une formule non-triviale. En C++, on peut utiliser la notation habituelle.
Sauf que, dans la majorité des cas, la surcharge d'opérateurs est plus un risque qu'un atout. C'est bien qu'un langage le permette s'il y a des besoins ; ce serait (très) dangereux que ce soit une norme vu ce que ça peut impliquer comme dangers pour la sécurité du code, surtout sur de gros projets ou lorsqu'il y a de la mutualisation de fichiers.
C'est aussi pour ça qu'il y a des langages très spécialisés, avec des possibilités d'interfaces/d'inclusions entre eux, que ce soit nativement ou pas.
avatar

3935

Moi je code en binaire, tu peux pas test. C'est de loin le langage le plus riche car il permet absolument tout.
avatar
« Nous avons propagé sur Extranet une histoire fabriquée de toutes pièces selon laquelle une certaine disposition d'étoiles, vue depuis la planète d'origine des butariens, formaient le visage d'une déesse galarienne.
Sans chercher à vérifier ces informations, certains ont décrété que c'était la preuve de l'existence de la déesse. Ceux qui notaient le manque de preuves se faisaient attaquer. »

Legion, geth trolleur à portée galactique

3936

Oui, mais le seul cas d’usage intéressant est le sien embarrassed
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

3937

Ah mais je te rassure, c'est tout à fait lisible : mon éditeur m'affiche les 0 et les 1 de deux couleurs différentes.
avatar
« Nous avons propagé sur Extranet une histoire fabriquée de toutes pièces selon laquelle une certaine disposition d'étoiles, vue depuis la planète d'origine des butariens, formaient le visage d'une déesse galarienne.
Sans chercher à vérifier ces informations, certains ont décrété que c'était la preuve de l'existence de la déesse. Ceux qui notaient le manque de preuves se faisaient attaquer. »

Legion, geth trolleur à portée galactique

3938

Meowcate (./3937) :
mon éditeur m'affiche les 0 et les 1 de deux couleurs différentes.
Pour être Brunni compatible, il faut qu'il n'y ait jamais deux fois la même couleur sur une même plage de mémoire, tu sais ?
avatar

3939

Merci mais non merci. La dernière fois que j'ai codé avec un IDE Brunni-compatible, mon médecin m'a collé 1 semaine dans une pièce sombre pour que je guérisse d'un daltonisme temporaire.
avatar
« Nous avons propagé sur Extranet une histoire fabriquée de toutes pièces selon laquelle une certaine disposition d'étoiles, vue depuis la planète d'origine des butariens, formaient le visage d'une déesse galarienne.
Sans chercher à vérifier ces informations, certains ont décrété que c'était la preuve de l'existence de la déesse. Ceux qui notaient le manque de preuves se faisaient attaquer. »

Legion, geth trolleur à portée galactique

3940

grin

bof on pourrait avoir 128 nuances de rouge pour les 1 et 128 nuances de bleu pour les 0...

3941

Ouais et on en ferait un best-seller !
avatar

3942

Kevin Kofler (./3926) :
Warpten (./3921) :
ils ont des problemes de memoire parce que y a du final partout pour reutiliser des variables dans des callback
Ce n'est pas final qui empêche la libération par le GC, mais l'utilisation dans le callback (qui maintient en vie la référence).

Et final permet de capturer la variable pour la reutiliser dans le callback (tu ne peux pas referencer de variable du scope englobant sans final), c'est l'equivalent d'un capture groupe pour une lambda en C++. J'en met jamais sinon.

Uther (./3931) :
Et le C# à la base n'est ni plus ni moins qu'une copie du Java.
Les langages s'inspirent les un les autres et c'est tant mieux (sauf quand ils s'inspirent du JavaScript).

Je sais bien.

3943

Pourquoi pas associer une couleur 32 bots avec chaque 0 ou 1, ça serait encore plus joli !!

3944

32 bots ? Ca fait beaucoup non ?
avatar

3945

Gnagnagna tongue

3946

(Bravo Zerosquare, en tout cas ! trioui)

3947

c'est sur que Nil préfère 32 bites...

3948

des bites de bots ?

3949

Warpten (./3942) :
(tu ne peux pas referencer de variable du scope englobant sans final)
Ce n'est plus le cas depuis Java 8, maintenant il suffit que la variable est "effectively final", c'est-à-dire qu'elle pourrait être déclarée final (mais tu n'es plus obligé de le mettre).

c'est l'equivalent d'un capture groupe pour une lambda en C++. J'en met jamais sinon.
Bah non, final en Java a toujours été l'équivalent de const en C++, rien de plus ni de moins.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

3950

Nil (./3934) :
Sauf que, dans la majorité des cas, la surcharge d'opérateurs est plus un risque qu'un atout. C'est bien qu'un langage le permette s'il y a des besoins ; ce serait (très) dangereux que ce soit une norme vu ce que ça peut impliquer comme dangers pour la sécurité du code, surtout sur de gros projets ou lorsqu'il y a de la mutualisation de fichiers.
Mais c'est à cause de ces boulets qui font n'importe quoi avec la surcharge d'opérateurs (dédicace spéciale à Boost qui les utilise entre autres pour représenter des grammaires en BNF sick) que les développeurs du Java refusent de la proposer pour les cas où ce serait vraiment utile, comme l'arithmétique d'intervalles.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

3951

(cross : heu non final c'est pas un const du tout, ou alors juste un "Type* const" mais pas un Type const* en tout cas)
Sinon oui, c'est à cause de la réalité que les quelques cas utiles à la surcharge ont été sacrifiés.

3952

En effet. Le Java ne propose aucune manière de protéger contre l'écriture abusive les objets pointés (seul le pointeur est constant), c'est un autre gros défaut du langage (et casse souvent l'encapsulation).
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

3953

Un des rares trucs que j'aime bien en C++, mais c'est pareil, c'est pas toujours évident à gérer quand tu récupères du code qui n'en a pas...

3954

Le problème c'est pas le langage, c'est les mauvais stagiaires embarrassed
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

3955

Aussi, oué grin

3956

Oh tu peux quand même const_cast en C++, et tricher quand tu connais la structure en dessous, mais sur des objets c'est souvent compilo/architecture-specific, donc c'est pas apprécié grin (enfin les vtable c'est standard mais rien n'empêche un compilo de faire autrement)

3957

Kevin Kofler (./3933) :

Ma définition de "puissant" est une que tu n'as pas citée
si. C'était la dernière de la liste...


Tu es sur que ton langage sait gérer le catchall?smile
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

3958

À mon avis, "faire ce que fait mon langage préféré" n'est pas la même chose que "avoir une multitude de fonctionnalités". Le premier critère est très subjectif et peut porter sur une seule fonctionnalité (comme la surcharge des opérateurs), le deuxième est plus objectif et porte sur la quantité de fonctionnalités (la surcharge des opérateurs est loin d'être la seule chose que le C++ permet et que le Java ne permet pas, il y a aussi au moins: types non signés*, arithmétique de pointeurs, pointeurs vers données constantes, types natifs dans les templates**, instruction goto etc.).

* Le Java a maintenant des workarounds pour utiliser les types signés pour des nombres non signés, mais la syntaxe est là aussi imbitable à cause de l'absence de la surcharge d'opérateurs. Ils auraient vraiment mieux fait de créer des types dédiés comme en C et C++, même avec la même implémentation niveau JVM que leur workaround. Le compilateur Java n'est pas à un sucre syntaxique près!
** Le projet Valhalla est censé rajouter cela au Java, mais ça n'a toujours pas été intégré, ils n'arrêtent pas de le repousser.

vince (./3957) :
Tu es sur que ton langage sait gérer le catchall?smile
catch (...)
(Les ... sont à écrire littéralement!)
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

3959

Si tu en es à citer le goto comme atout du C c'est que tu es vraiment à court d'arguments valables...
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

3960

pourquoi: puts("Pourquoi?"); goto pourquoi;
C'est une instruction très utile. L'implémentation qui va avec ma thèse de diplôme (maîtrise) en contient 5, celle qui va avec ma thèse de doctorat en contient 16 (hors code généré).
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité