Le pub des programmeurs
- 1 927 réponses
- 117 participants
- 131 717 vues
- 130 followers

Anonyme



jujupauty

Hors sujet : Comme disait Coluche: con promis chose due
Jul

Pov Gabou

Citation :
Quand tu fais de la programmation réseau bas niveau.
Tu sais, quand t'écris tes paquets IP à la main...pour des algos de routage par exemple...
Y'a eu un client Kademlia qui a été tenté en Java, c'est une merde innomable qui te bouffe toute ta RAM (bon c'est aussi en grande partie dûe à la VM).
Ou quand je fais du développement pour téléphone portable et en technos embarqués. Même si la plupart du code est maintenant en NesC (dialecte de C), y'en a quand même en C++.
Du calcul 3D...
Des algos de recherche opérationnelle..
En gros, à chaque fois que les ressources machines peuvent être limitées.
Non mais ce sont des niches, tout ca: programmation reseau bas niveau, moteur graphique, etc... c'est quand meme pas la majorite du code ecrit aujourd'hui. Le code bas niveau est ecrit avec des langages de bas niveau, on est d'accord. Evidemment, la pile IP de linux, elle va pas etre faite en java

Mais meme dans certaines applis que tu cites, on voit des langages haut niveau apparaitre Le premier, evident, qui vient en tete, c'est erlang, pour certaines applis backend de telephonie.
Citation :
Pour la rapidité de prototypage, ben dans les gros softs ce n'est pas recherché, au contraire
Y a pas que le prototypage, il y a aussi la refactorisation.
Citation :
Que signifie "duck typing" ?
If it is behaving like a duck, it is a duck

def foo(a):
return a.bar()
La fonction foo marchera tout le temps tant que a a une fonction bar. Et c'est super utile pour changer en cours de route une api, car si jamais avant a etait derive quelque part d'une classe A, et que maintenant c'est derive de classe B, en C++, tu vois le bordel.
Alors le pendant, c'est que parfois, si tu passes un mauvais object, tu peux avoir un bug (genre une liste au lieu d'une chaine de characteres). Au moins pour les problemes pour lesquels j'utilise python, ca ne ma jamais pose de pb fondamental.
Je suis d'accord que tu vas pas utiliser ca pour du code militaire sensible

Le college qui m'a fait decouvrir python, il a bosse 10 ans dans l'industrie du jeu video avant de fonder sa boite de service informatiques pour petites entreprises


batman14

Citation :
la gestion de la memoire a la main, ce sera bientot marginal comme l'est l'assembleur aujourd'hui: indispendable dans certains cas, mais la plupart du temps, la machine (compilateur, VM) le fait mieux.
L'assembleur reste un must have du développeur de haut vol.
Tu n'imagines même pas le nombre de codeurs Java au chômage et le nombre de boite qui cherche des codeurs assembleur...
En Java il faut connaitre au minimum deux frameworks sur le bout des doigts pour être à peu près sûr d'être toujours opérationnel sur un projet quelconque au sein d'une SSII...
Tu parlais de traitement du signal : l'aéronautique, l'aérospatiale, la télépnonie, le transport sont quand même des sacrés industries et elles emploient à prix d'or des codeurs assembleurs et C/C++.
Ce sont des secteurs beaucoup plus que des niches.
Le web est une autre histoire, et il est clair qu'il y a du boulot dans le domaine, notamment en javascript que beaucoup dénigrent.
Je ferais une analyse plutôt différente, car je pense que ce sont les VM qui vont devenir marginales : avec la conversion générale vers l'architecture unique pc pour les terminaux clients, à quoi bon utiliser une VM comme java ?
Sur le marché grand public, java est en net recul (moins de postes possédant une VM).
(j'espère que quelqu'un m'apportera un argument pour garder le système de VM à la java).
Dès que l'on recherche de l'efficacité, le code devient d'autant plus spécifique à l'environnement de la machine et la VM ne sert plus à rien.
Finalement, java est lourd et coûte cher aux entreprises (serveurs hors de prix, environnement complexe).
Gaz de France par exemple en a réellement marre de certains prog java qu'ils ont :
-> les benchs sont hors de prix et les tests unitaires hyper lourds à déployer (étant donnés que ls outils d'analyse pour java sont en java...)
-> les codeurs java des SSII documentent souvent mal, laissent des bugs, récupèrent mal les erreurs, dû à la facilité d'apprentissage du langage qui permet de lancer des codeurs en projet avec deux mois d'expérience. Ceci est plus un problème lié à la politique des SSII quoi qu'il en soit.
-> il faut sortir le bazooka pour péter la mouche, comparé à python ou php (C++ est dans la même m*rde que java pour cela d'ailleurs).
-> lors d'un déploiement d'application sur poste client, il faut vérifier les versions des VM (javasound en est un bon exemple qui ne marche qu'avec d'anciennes VM)...alors que l'on s'assure généralement d'avoir au plus deux ou trois versions d'OS pour l'ensemble de son parc.
-> on se rend compte que le script et le fonctionel ont quand même du bon, que le tout objet à la java est fatiguant.
C'est pour toutes ses raisons que je pense, en tout cas pour java, que les développements sur VM vont progressivement ralentir dans les grands comptes.
Non pas disparaître, mais arréter de progresser.
Je crois au grand retour du compilé ! (ouaiff, pas trop en fait mais bon).
http://soundcloud.com/bat-manson

zieQ

Je suis bien d'accord qu'on peut faire mieux que le C++ niveau langage. D'un autre côté, personne ne t'obliges à utiliser toutes les subtilités du langage : macros, templates... Finalement, avec quelques bonnes habitudes, tu arrives à un C++ épuré, portable et peu sujets aux bugs. En tout cas, je ne connais pas tous les problèmes qu'on peut imputer au C++.
Je suis complètement d'accord avec Dr Pouet, il n'y a pas de bon ou de mauvais langage dans l'absolu, ça dépend du contexte.

cptn.io

Par rapport à l'assembleur, je nuancerais tout de meme, je suis en DUT GEII ( Electronique Informatique Indus), vous savez là où on programme des microcontroleurs, et microproc, ba ils ont enlevé l'assembleur car apparement les boites recherchent les mecs assez polyvalents pour entrer avec un DUT GEII mais faire un boulot de DUT GEII+DUT Info (+concierge


Donc l'assembleur, c'est encore pratique si tu veux t'amuser à faire vraiment du hard, si t'es sur du tiny tiny et que tu veux avoir une fusée avec une deudeuch de uC ...
Par rapport au système VM, ba je vais pas t'apporter d'arguments contre, mais je pense que ptet que java va aller plus vers le python mnan ...
cptn.io

batman14

En tout cas les débats sur les langages c'est comme le débat des différentes qualité des séquenceurs...
Mais bon, je m'y fais prendre à chaque fois. (vive la polémique héhé.)
Promis, j'arrête.
http://soundcloud.com/bat-manson

cptn.io



cptn.io

Dr Pouet

Citation : En tout cas les débats sur les langages c'est comme le débat des différentes qualité des séquenceurs...
Mais bon, je m'y fais prendre à chaque fois. (vive la polémique héhé.)


Pov Gabou

Citation :
L'assembleur reste un must have du développeur de haut vol.
Faut etre coherent, avant on parlait de dev de gros projets, maintenant on parle d'assembleur ;) Serieusement, le rapport developpeur assembleur / java, c'est quoi, 1 pour 100, 1 pour 1000 ? En signal, je pense que matlab est plus utile que l'ASM pour trouver un boulot aujourd'hui.
Citation :
Je ferais une analyse plutôt différente, car je pense que ce sont les VM qui vont devenir marginales : avec la conversion générale vers l'architecture unique pc pour les terminaux clients, à quoi bon utiliser une VM comme java ?
Sur le marché grand public, java est en net recul (moins de postes possédant une VM).
(j'espère que quelqu'un m'apportera un argument pour garder le système de VM à la java).
Dès que l'on recherche de l'efficacité, le code devient d'autant plus spécifique à l'environnement de la machine et la VM ne sert plus à rien.
Deja, le coup de la VM super lourde, c'est un argument que j'achete pas du tout. Le but de la VM, ca fait longtemps que c'est plus la portabilite l'argument. MS a sa VM avec .net, et ce sont bien les derniers a s'occuper de portabilite, puisqu'ils marchent avec un OS, une architecture (sur PC du moins; je sais pas si les xbox360 utilisent une VM pour certaines parties).
La VM, c'est un systeme possible pour :
- la securite, une sorte de sandbox. Impossible a realiser en pratique avec du code a la C/C++
- avec des trucs style JIT et cie, ca peut facilement etre aussi voire plus performant que du C.
- c'est aussi un moyen pour surveiller les bornes, etc...
Bref, ca permet de faire au runtime ce qu'il est impossible de faire en statique (surtout avec des langages sous specifies comme le C ou pire le C++).
Mac OS X (je drague pouet, la), version leopard, utilise une machine virtuelle (llvm: https://en.wikipedia.org/wiki/LLVM) pour le pipeline graphique: LLVM peut supprimer au runtime (c'est quoi le mot exact en francais pour runtime ?) des branches inutilisees, ce qu'un langage statique comme le C ne peut pas faire.
Alors evidemment, ca s'adapte pas pour tout, mais dans 10 ans, on verra plus de machines virtuelles (dans le sens large; un interpreteur evolue, pour moi, c'est deja presque une VM), pas moins.
Citation :
inalement, java est lourd et coûte cher aux entreprises (serveurs hors de prix, environnement complexe).
Gaz de France par exemple en a réellement marre de certains prog java qu'ils ont :
-> les benchs sont hors de prix et les tests unitaires hyper lourds à déployer (étant donnés que ls outils d'analyse pour java sont en java...)
-> les codeurs java des SSII documentent souvent mal, laissent des bugs, récupèrent mal les erreurs, dû à la facilité d'apprentissage du langage qui permet de lancer des codeurs en projet avec deux mois d'expérience. Ceci est plus un problème lié à la politique des SSII quoi qu'il en soit.
-> il faut sortir le bazooka pour péter la mouche, comparé à python ou php (C++ est dans la même m*rde que java pour cela d'ailleurs).
-> lors d'un déploiement d'application sur poste client, il faut vérifier les versions des VM (javasound en est un bon exemple qui ne marche qu'avec d'anciennes VM)...alors que l'on s'assure généralement d'avoir au plus deux ou trois versions d'OS pour l'ensemble de son parc.
-> on se rend compte que le script et le fonctionel ont quand même du bon, que le tout objet à la java est fatiguant.
Je suis plus ton raisonnement: tu es en train de dire que parce que java ne marche plus en entreprise, on va revenir au C et au C++, a des langages sans systeme de memoire automatique, sans verification de bornes, etc... ? Les langages fonctionnels, t'es conscient qu'ils marchent tous avec vm ou interpreteur; je connais aucun langage fonctionnel sans gestion de memoire automatique, ca n'aurait vraiment aucun sens. Perl est en train de passer sous pure VM pour la version 6 (mais ca se passe pas super bien, je sais pas pourquoi), y a des efforts dans ce sens pour python, etc...
Tout ton argument, comme je le comprends, il va dans le sens de ce que je disais, cad on s'en va des langages bas niveau style C/C++, etc.. pour aller vers des langages plus haut niveau pour la majorite du code. Le C/C++ etant relegue a ce qu'est l'ASM aujourd'hui; des niches, importants certes, ca disparaitrait pas de sitot, mais des niches.
Si tu me dis que la majorite du code java produit est a chier, je suis d'accord, je suis convaincu que la majorite du code tout court produit est a chier. La majorite des produits informatiques n'est meme jamais deploye, alors bon.
Citation :
Parce que toutes les librairies dont on peut avoir besoin sont écrites en C++. Pendant que Pov Gabou écrit des wrappers, moi je perfectionne mon appli
J'ai developpe avant en C/C++. La librairie standart C ou C++, c'est ridicule par rapport a celle du python; le coup du wrapper, je te reponds que pendant que tu cherches pourquoi t'as un segfault, j'ai le temps d'ecrire une doc correcte ;). J'ai developpe pas mal de code ces dernieres annees en C/C++ + matlab; ma productivite elle a clairement augmente en ajoutant python, elle a pas diminue, crois moi. T'as une librairie standart pour le XML, le reseau, le multi threading, etc...
L'argument du C++ contre python, c'est uniquement performance/latence/occupation memoire pour certains projets, certainement pas les facilites disponibles.
Je le repete: j'ai deja programme du C et du C++, plus que du python en quantite surement, donc je suis conscient des avantages de ces derniers dans certaines conditions.
Le fait est que si tu peux programmer avec un autre langage, tu vas le faire, et tu seras beaucoup plus productif. Je suis persuade que le programmeur a plus d'influence sur la qualite du code, y compris son efficacite, que le langage dans la majorite des cas.
Citation :
c'est parce que c'est des languages fondamentaux, y a une différence ...
Je vois pas ce que tu veux dire ? Si tu connais C, je vois vraiment pa ce que ca t'apporter niveau *concept* le C++ ou meme java. Si tu me disais smalltalk ou python pour de l'objet, lisp, scheme pour du fonctionnel, etc... Je comprendrais. Quand j'ai appris java, j'ai pas eu l'impression de decouvrir un nouveau moyen de programmer, quand meme, par rapport au C/C++; a la limite, ADA m'avait plus marque a l'epoque, par l'etendue de l'analyse syntaxique.
Sinon, Erlang, c'est le langage invente par ericsson. C'est un langage fonctionnel fondamentalement concu pour la programmation concurrente, utilise pour les serveurs http, wap, les switch, etc... chez Ericsson.
Citation :
Je suis complètement d'accord avec Dr Pouet, il n'y a pas de bon ou de mauvais langage dans l'absolu, ça dépend du contexte.
C'est un peu une lapalissade, ce que tu dis. Evidemment que ca depend du contexte. Mon argumentaire, c'est que les contextes dans lesquels on utilise le C++, ils vont diminuant, pas augementant, et que c'est pas juste une mode.

cptn.io

Citation : Sinon, Erlang, c'est le langage invente par ericsson. C'est un langage fonctionnel fondamentalement concu pour la programmation concurrente, utilise pour les serveurs http, wap, les switch, etc... chez Ericsson.
Oki d'accord merci, mais bon, perso les languages portés par un seul constructeur j'y crois moyen ... C'est bien pour ceux qui font que du télécom chez Ericsson, et meme ...
cptn.io

Pov Gabou


Dr Pouet

Citation : Je suis persuade que le programmeur a plus d'influence sur la qualite du code, y compris son efficacite, que le langage dans la majorite des cas.
Certains langages permettent d'aller plus loin dans l'horreur (par exemple Perl face à java), mais je suis d'accord. Je connais même de bons exemples de code in-maintenable en Ada.
Citation : au runtime (c'est quoi le mot exact en francais pour runtime ?)
je dirais au runtime -> à l'exécution
Citation : Si tu connais C, je vois vraiment pa ce que ca t'apporter niveau *concept* le C++ ou meme java.
C'est moins le langage que l'objet tout court. En fait, faut surtout lire le bouquin "Design patterns" (de E.Gamma et les 3 autres) !
Tu aurais une référence pour une bonne introduction à Erlang ?

zieQ

C++ est un mélange de langage haut niveau (concepts objets) et bas niveau (restes de C). Quand je te lis Pov Gabou, j'ai l'impression que l'apport de l'objet ne compte pas ! Or, pour moi ça fait une énorme différence au niveau langage et abstraction. Pour vraiment savoir ce qu'est l'objet, faut lire des bouquins sur les Design Patterns et en particulier celui mentionné par Dr Pouet. Sans ça, on est condamné à faire des architectures peu extensibles où il faut tout refaire à chaque ajout de fonctionnalités, et on retombe alors sur les travers des langages de bas-niveau. C'est p-e ça que tu voulais dire, parce qu'à te lire, j'ai vraiment l'impression que tu ne connais pas la programmation orientée objets.

Dr Pouet

Hors sujet : Appelle nous Pouet et Gabou, restons simples, cher zieQ

Pov Gabou

Citation :
Pov Gabou, quand je parlais de libraries tierces, je ne visais pas la STL. Tu ne peux pas contester que la majorité des librairies sont écrites en C++
J'admets totalement etre oriente, mais le nombre de librairies C++ contre C doit etre dans le rapport 1 sur 50 sur ma workstation linux. Peut etre que sous windows, c'est different; sous windows, je connais que les MFC (que je veux oublier jusqu'au nom) et quelques vagues notions de win32.
C'est quoi les librairies extraordinaires en C++ ? Je connais QT, qui est vraiment bien, boost, qui va de l'horreur au tres bon, blitz++ que je trouve horrible et ? Encore une fois, LE domaine ou le C++ a vraiment un clair avantage selon moi par rapport au C, ce sont les GUI.
Citation :
j'ai l'impression que l'apport de l'objet ne compte pas !
Deja, langage oriente objet, ca veut dire pleins de choses differentes pour chaque personne. Tu demandes a 10 programmeurs, t'as 10 reponses.
Perso, par oriente objet, je pense:
- encapsulation des donnees. C'est la base de la programmation structuree pour moi, C++ n'offre pas grand chose par rapport au C, a part la syntaxe this dont je parlais dans un post precedent. Tout langage digne de ce nom permet ca.
- polymorphisme: fonction capable de prendre en arguement plusieurs types differents.
- toute valeur est objet (tous les langages de haut niveau ont cette facilite; des trucs moyen niveau comme java pas vraiment, des trucs bas niveau comme le C++ pas du tout).
- heritage simple/multiple.
Un langage objet sans gestion automatique de la memoire, je vois pas tres bien l'interet, car ca limite vachement ce que tu peux faire avec les objets. Les semantiques de copie/passage par reference sont horriblement complexes en C++; il est impossible de retourner des valeurs sans les copier a moins de sacrement faire compliquer sans la gestion automatique (GC ou reference counting).
Le C++ est le seul langage (avec ADA95) soit disant oriente objet snas gestion de memoire automatique.
Ensuite, une grosse partie de tout le bordel avec l'heritage, c'est finalement un moyen de contourner la limitation par le typage static de C, C++ ou Java. Typiquement, l'heritage, en python, c'est beaucoup moins utile, car c'est dynamique (mais a typage fort quand meme).
Par exemple, en C++, t'as une hierarchie comme:
class A {};
class B : public A {};
Mais si tu t'es plante dans ton design, et que tu utilises vachement A et B, va falloir beaucoup refactoriser (l'impossibilite de prototyper en C/C++). En python (et dans la majorite des langages haut niveau, en fait tous ceux auxquel je pense a part ML que je connais encore tres peu, le font pour sur), tu t'en branles, parce que ca change rien, du moment que tu peux passer les bons messages.
Le bouquin du gang of four, je l'ai lu; alors qu'en C++ tu vas te prendre la tete sur des details d'implementation, la plupart des autres langages te permettent d'exprimer tres facilement les concepts developpes: factory, singleton, decorator, etc... Les concepts de meta class, de classes objets, c'est possible en C++, mais c'est une horreur a faire (suffit de voir comment marche QT par derriere).
La fameuse dichotomie composition/heritage dont ils parlent beaucoup, elle est inexistente avec les langages de haut niveau, car tu n'as pas besoin d'utiliser l'heritage pour implementer une interface; c'est utile dans un langage a typage statique comme C++, mais pour tous les autres langages, ca sert a pas grand chose (a part dans certains types de projets ou la hierarchie de classes est tres naturelle: GUI encore une fois, softs de CAO, softs de fouilles de donnes complexes).
Un autre truc que j'ai decouvert recemment, et que je vois pas comment faire simplement en C++, c'est les class objet. Une classe est un objet en python, et ca permet de faire pas mal de choses; par exemple remplacer a la volee certains fonctions, une introspection tres puissante, etc... Les fan de LISP vont evidemment trouver ca ridicule par rapport aux macro, mais perso, je trouve que ca me suffit; j'utilise python dans un domaine qui n'est pas riche en types de donnees, faut dire (calcul scientifique).
Citation :
C'est moins le langage que l'objet tout court. En fait, faut surtout lire le bouquin "Design patterns" (de E.Gamma et les 3 autres) !
Je vois pas de langage pire que le C++ pour apprendre les design pattern, honnetement. Si tu connais deja a fond le langage, Ok; mais n'importe quel autre langage, java, python, occaml, C#, ruby, est nettement plus approprie pour apprendre les *concepts*.

zieQ

Citation : Perso, par oriente objet, je pense:
- encapsulation des donnees. C'est la base de la programmation structuree pour moi, C++ n'offre pas grand chose par rapport au C, a part la syntaxe this dont je parlais dans un post precedent. Tout langage digne de ce nom permet ca.
Tu oublies la protection des données encapsulées : public, protected, private... Tu vas me dire que c'est une contrainte de protéger les données, moi je vais te répondre que ça évite de faire des conneries ;) C'est pour moi un aspect fondamental d'un langage objet.
Citation : - polymorphisme: fonction capable de prendre en arguement plusieurs types differents.
Avec ça, pour moi, on arrive déjà dans les langages de haut-niveau !
Citation : - toute valeur est objet (tous les langages de haut niveau ont cette facilite; des trucs moyen niveau comme java pas vraiment, des trucs bas niveau comme le C++ pas du tout).
Là va falloir m'expliquer cette remarque parce que je ne comprends pas ce que tu veux dire.
Citation : - heritage simple/multiple.
Encore que le multiple c'est pas toujours une bonne idée, excepté pour l'héritage d'interfaces.
Citation : Par exemple, en C++, t'as une hierarchie comme:
class A {};
class B : public A {};
Mais si tu t'es plante dans ton design, et que tu utilises vachement A et B, va falloir beaucoup refactoriser (l'impossibilite de prototyper en C/C++). En python (et dans la majorite des langages haut niveau, en fait tous ceux auxquel je pense a part ML que je connais encore tres peu, le font pour sur), tu t'en branles, parce que ca change rien, du moment que tu peux passer les bons messages.
Et bien justement ! En lisant Design Patterns, le conseil récurrent c'est d'utiliser la composition plutôt que l'héritage pour les problèmes que tu viens de citer. Ce problème est inhérent à *tous* les langages objets, et pas spécifiquement le C++.
Citation : Un langage objet sans gestion automatique de la memoire, je vois pas tres bien l'interet, car ca limite vachement ce que tu peux faire avec les objets. Les semantiques de copie/passage par reference sont horriblement complexes en C++; il est impossible de retourner des valeurs sans les copier a moins de sacrement faire compliquer sans la gestion automatique (GC ou reference counting).
Ben euh tu passes ton objet en référence ? Sinon, la gestion automatique de la mémoire, ça se discute. Perso, je préfère avoir le contrôle de la mémoire plutôt que d'avoir un garbage collector qui bouffe les resources à des moments imprévisibles. En tout cas c'est vital pour les applis temps-réel. Maintenant je suis bien d'accord que dans certains cas, la gestion automatique de la mémoire est un plus et que cette fonctionnalité est un plus dans un langage "haut niveau". Faut pas oublier que dans certains cas, ça peut être emmerdant cette gestion automatique.
Pour tout le reste, puisque tu parles de typage, moi j'aime bien le typage statique du C++ car tu détectes les problèmes à la compilation, et non pas à l'exécution. C'est moins souple à l'utilisation mais ça fait des programmes avec moins d'erreurs. Cette approche se défend dans un contexte industriel où on doit sortir des programmes aussi stables que possible. Mais ça, Pouet en a déjà parlé !

Pov Gabou

Citation :
Ne pas oublier la protection des données encapsulées : public, protected, private... Tu vas me dire que c'est une contrainte de protéger les données, moi je vais te répondre que ça évite de faire des conneries
Je dis pas que c'est pas important, je dis que c'est trivial, et que tout langage a cette possibilite, y compris le C finalement.
La encore, cette difference private/public/protected n'existe qu'en C++ et en java, parce que c'est une limitation du typage statique. En plus, en C++, t'as un gros probleme a ce niveau la a cause de headers, qui revient a faire pareil qu'en C finalement. Si tu veux cacher l'implementation dans des projets d'un peu gros calibre (et par la, j'entends a peu pres n'importe quoi qui ne soit pas un exemple de bouquin)
header:
/* forward declaration */
class A_imp;
class A {
private:
A_imp *m_imp;
};
implementation
class A_imp {
// bla bla
};
Du coup, c'est comme en C ou tu declares les structures, mais ou tu les definis pas (tu peux declarer FILE* a, mais pas FILE a avec stdio). Tu peux aussi utiliser une classe virtuelle, et heriter d'elle, mais c'est pas super joli non plus.
En C++, t'as pas de mecanisme pour decoupler fonctions membres et "variables" membres (pas sur du terme technique).
Citation :
Là va falloir m'expliquer cette remarque parce que je ne comprends pas ce que tu veux dire.
C'est fondamental: deja, tu ne peux deriver aucun type du langage C++. Tu peux pas faire "class MyInt : public int". Ensuite, une fonction n'est pas un objet en C++, donc tu peux pas passer facilement des fonctions en arguments (les pointeurs de fonctions membres en C++, je suis pret a parier que la majorite des programmeurs C++ savent pas comment ca marche). Une classe non plus.
En python (je prends python parce que je connais plus que superficiellement, mais ca reste valable pour pleins d'autres langages), le fait qu'une classe EST un objet est super utile; rien que pour avoir des attributs de classe par exemple.
Le fait que ce soit dynamique est aussi super utile: par exemple, j'ai une classe qui modele un modele numerique en python, GMM. Normalement, ca marche en multi dimension, mais en 1 dimension, on peut faire plus rapidement, surtout si j'implemente la dite fonction en C. Et bien en python, je peux faire (self est l'equivalent de this en C++; en python, il est explicite):
from foo import super_fast_func
class GMM:
def __init__(self, dim):
if dim == 1:
self.foo = super_fast_foo
Si je suis en dimension 1, l'implementation est changee a la volee. Le truc super important, c'est que ca se change n'importe quand, y compris quand l'objet instancie de GMM est deja cree (en fait, avant l'appel d'__init__, l'objet est deja construit en python, mais je veux pas rentrer dans les details). Donc par exemple, tu peux rajouter des fonctions a la volee selon l'etat de l'objet.
Citation : Ce problème est inhérent à *tous* les langages objets, et pas spécifiquement le C++.
Non, c'est inherent aux langages a typage statique (C++ et Java, en gros). Dans un langage a typage dynamique, si tu as fait une erreur de conception, c'est pas un probleme, car tu n'utilises pour ainsi dire *jamais* le fait qu'une instance de B est aussi de type A. On s'en fout, ce qui compte, c'est que l'interface (ie les membres, fonctions, attributs, etc..) soit la meme.
Un des inventeurs du concept objet, Kay, qui a aussi invente le smalltalk, il l'a fait avec un langage a typage dynamique. C'est pas par hasard, je pense.
Citation : Ben euh tu passes ton objet en référence ?
Je parle de la valeur de *retour*. C'est la le probleme, pas l'entree. Tu peux pas passer une valeur de retour par reference en C++ (puisque ca n'a pas de sens sans gestion automatique de la memoire).
La gestion de memoire automatique: le temps reel, Ok, les GC courants sont pas adaptes, car ils privilegient le debit par rapport a la latence, alors que temps reel est le contraire. Mais quand tu fais du temps reel, je crois que tu geres de toute facon pas de memoire dans les threads temps reels; malloc est souvent plus couteux qu'un declenchement de GC (a moins que le malloc soit gere a l'aide de mmap/pools, mais a ce niveau la, c'est plus facile de toute allouer a l'avance). Bon, je m'avance beaucoup sur ce point, j'ai tres peu d'experience; pour la MAO, en tout cas, tout ce qui est DSP, le malloc est fortement deconseille (tout appel systeme est prohibe en fait). Tu lockes une partie de la memoire pour eviter le cout eventuel de la pagination, et tu fais avec ce que tu as allouer a l'initialisation ou au reste de l'algo dsp, point barre.
Ensuite, pour a peu pres tout le reste, ca sert pas a grand chose, la grestion memoire a la main. Par exemple, la memoire allouee par un GC respecte beaucoup le principe de localite qu'un malloc classique (au moins sous linux; mais je suis pres a parier que le malloc sous linux est bien plus performant que sous windows de toute facon); y a moins de pbs de fragmentation. Quand tu sais comment fonctionne un malloc et un GC basique, tu vois vite que c'est pas si different dans le principe.
En particulier, pour les containers STL, java est aujourd'hui tout aussi performant si tu utilises les JVM IBM sous linux sur tous les benchmarks que j'ai pu voir (j'ai pas pousse trop loin non plus; il y a surement des cas ou ca foire; en fait, le pire cas doit etre bien pire en java qu'en C++, je pense). C'est aussi lie au pb que je soulevais avant vis a vis de l'absence de retour sans copie en C++ (la STL etant base sur la copie; t'es sur de te planter a un moment si tu as list<blop> ou blop est un pointeur; tu peux eviter ca en utiliser noncopyable de boost, cependant, mais c'est pas tres elegant).
Citation :
C'est moins souple à l'utilisation mais ça fait des programmes avec moins d'erreurs.
Encore une fois, ton raisonnement sous entend que toute autre chose etant egal, le typage statique est plus safe. Mais justement, tout autre chose n'est pas du tout egale. Je suis d'accord qu'il y a des projets ou declarer le type de certains fonctions est tres utile, et c'est un manque dans python.
Pour finir sur une note positive, je trouve que le meilleur argumentaire *pour* le C++, c'est celui de L. Soras que je copie de la:
http://lalists.stanford.edu/lad/2003/02/0068.html
(contexte: reponse a une interview de E. Castro de Lopo, un des developpeurs les plus celebres de la scene programmation audio sous linux, auteur de libsndfile, et SRC, qui a bosse pour fairlight pendant qqs annees, et haissant profondement le C++, plus que moi; je suis entre autre pas d'accord sur le fait que le C est plus adapte, ou plutot moins pire que le C++ pour de la conception objet; je suis d'accord pour les template par contre

Citation :
Erik de Castro Lopo wrote:
>
> 1) C++ is not the only solution.
> 2) OO can be done in Standard C.
> 3) Some people (me included) might prefer doing OO programing in C
> rather than C++.
I agree, but partially. My opinion about OO in C vs C++ :
I think C++ adds (very useful) functionalities to C. You
can still emulate them, but it's often a pain and less
"encapsulated" than equivalent C++ concept. More, goals
of language constructions are more obvious if written
in native C++, making easier communication between
developers. C++ is just more suitable for OO developement.
Who does seriously want to write a book with a typewriter
when one can use a word processor ?
C++ is not safer or faster than C or whatever. If you want
to make something stupid, nothing prevents you to do it.
I agree C++ is still far from perfect, but for me it's today
the best solution for audio development. It needs strong
coding rules, deep comprehension of the language, software
engineering knowledge and experience to be used efficiently.
It won't make miracles just because it's C++. Learning and
applying all these concepts won't happen "in 21 days", for
sure.
Finally I'd say it makes gain time when mastered, a lot of
time, one of the most valuable ressource in today's world
IMHO.
-- Laurent

Pov Gabou

- gestion par GC par defaut, mais a la main possible pour certains objets si besoin
- pas de multi heritage autre qu'interface
- modules a la place des headers/cpp
- support de doc en ligne
- abi specifiee

emx

Hors sujet : ouhlala j'ai appris tous ces trucs à la fac (maitrise info) mais ça m'est bien vite sorti du crane, maintenant je programme en PHP ou Lingo sur Director en freelance, c'est facile et ça rapporte plein de sous pour acheter des synthés

Dr Pouet

Citation : C'est quoi les librairies extraordinaires en C++ ?
Je pense que zieQ parlait surtout de librairies commerciales (type produits Ilog, ou BEA, ou IBM etc.) ou de librairies propriétaires à l'entreprise où tu bosses.
Ya aussi des trucs comme ACE / TAO, mais c'est vrai qu'en logiciels libres le C++ est moins populaire. Je pense que c'est largement historique avec le choix C, voire C orienté objet (Gtk...). Par contre dans l'industriel c'est l'inverse, le C n'est généralement utilisé qu'en dernier recours.
Citation : Le bouquin du gang of four, je l'ai lu; alors qu'en C++ tu vas te prendre la tete sur des details d'implementation, la plupart des autres langages te permettent d'exprimer tres facilement les concepts developpes: factory, singleton, decorator, etc... Les concepts de meta class, de classes objets, c'est possible en C++, mais c'est une horreur a faire (suffit de voir comment marche QT par derriere).
Je te trouve un peu excessif sur ce coup.
Par ailleurs, le type que l'on change à la volée, les fonctions que l'on affecte, et pire, les pointeurs de fonctions, tout ça c'est plutôt à éviter dans des gros projets. Mais normalement les modèles de conception permettent justement d'éviter de manipuler des pointeurs de fonction et autres call-backs qui rendent le code difficile à maintenir.

zieQ

Citation : Zieq, t'as deja fait de la programmation avec un langage de haut niveau (ie plus haut niveau que java, pour moi: python, ruby, lisp, occaml, n'importe quoi du style) ?
Pour ce qui est du typage dynamique, j'ai pratiqué php et javascript ! Et dans ces langages, je trouve vraiment emmerdant que les problèmes de types ne soient détectés qu'à l'exécution. Je veux bien que ça ait des aspects pratiques mais ça a aussi des contraintes.
Citation : Je dis pas que c'est pas important, je dis que c'est trivial, et que tout langage a cette possibilite, y compris le C finalement.
Faut croire que non. Comment tu protèges les membres d'une classe en C (déjà y a pas de classe) ou en php ? Je ne parlais pas de cacher l'implémentation, mais seulement d'empêcher les accès sauvages aux membres d'une classe. Pour ce qui est de cacher l'implémentation, je ne vois pas ce qui te gêne dans les forward declaration. Après tout, déclarer un nom avant de l'utiliser mais paraît logique puisqu'il faut que le compilateur puisse vérifier les types.
Citation :
C'est fondamental: deja, tu ne peux deriver aucun type du langage C++. Tu peux pas faire "class MyInt : public int". Ensuite, une fonction n'est pas un objet en C++, donc tu peux pas passer facilement des fonctions en arguments (les pointeurs de fonctions membres en C++, je suis pret a parier que la majorite des programmeurs C++ savent pas comment ca marche). Une classe non plus.
Euh, dans la STL justement, les fonctions sont représentées par des objets (souvent templatisés certes), dans <algorithm> notamment. Rien ne t'empêche de créer des objets fonctions (fonctors), le langage C++ ne t'empêche pas de le faire. Le fait de ne pas pouvoir dériver les types de bases : oui c'est un problème du C++ mais on peut le contourner en utilisant par exemple la composition.
Pour changer une fonction à la volée, c'est possible aussi en C ou C++. Tu peux écrire un fonctor et remplacer l'objet fonctor en fonction de la valeur de membres de ta classe. Tu peux également spécialiser des templates pour optimiser certains cas particuliers.
Citation : Je parle de la valeur de *retour*. C'est la le probleme, pas l'entree. Tu peux pas passer une valeur de retour par reference en C++ (puisque ca n'a pas de sens sans gestion automatique de la memoire).
Pour la valeur retour, tu passes l'objet de retour en référence dans les paramètres d'entrée. C'est moins élégant qu'en matlab c'est sûr, mais c'est possible d'éviter les recopies quand même.
Pour conclure, je ne prétends pas que le C++ est parfait, bien au contraire. Je dis seulement qu'il n'est pas si mauvais que tu veux nous faire croire. Il y a des langages plus élégants, certes. Mais il y a souvent d'autres aspects que l'élégance du langage à prendre en compte lorsqu'on veut réaliser un projet : disponibilité de libraries tierces, langage adapté ou non à ce qu'on veut faire et aux contraintes (temps-réel, langage objet, fonctionnel, inférence), adéquation du langage avec les compétences de tes collaborateurs. Bref, le choix dépend du contexte, et dans certains cas, le C++ est le moins "mauvais" des choix.

zieQ

Citation : Citation :
C'est quoi les librairies extraordinaires en C++ ?
Je pense que zieQ parlait surtout de librairies commerciales (type produits Ilog, ou BEA, ou IBM etc.) ou de librairies propriétaires à l'entreprise où tu bosses.
Justement, pas de libraries extraordinaires, juste des libraries ordinaires pour tout ce que tu peux chercher à faire : calcul scientifique, graphisme, moteur 3D, algèbre, interpréteur, compilateur... En C ou C++ puisque les deux langages sont compatibles.

zieQ

Citation : Par ailleurs, le type que l'on change à la volée, les fonctions que l'on affecte, et pire, les pointeurs de fonctions, tout ça c'est plutôt à éviter dans des gros projets. Mais normalement les modèles de conception permettent justement d'éviter de manipuler des pointeurs de fonction et autres call-backs qui rendent le code difficile à maintenir.
+1

Pov Gabou

Citation :
Par ailleurs, le type que l'on change à la volée, les fonctions que l'on affecte, et pire, les pointeurs de fonctions, tout ça c'est plutôt à éviter dans des gros projets. Mais normalement les modèles de conception permettent justement d'éviter de manipuler des pointeurs de fonction et autres call-backs qui rendent le code difficile à maintenir.
Non mais pointeur de fonction, ca existe qu'en C/C++. Fonction comme variable "nornale", au meme titre qu'un entier ou un float: tous les autres langages le font. Et je vois vraiment pas le probleme de maintenance. En GUI, tu fais comment sans les callbacks ?
Y a quand meme un truc que je comprends pas. Ca veut dire quoi gros projet pour vous ? Parce que bon, les gros projets en libre, par exemple, c'est pas ca qui manque, et y en a pas beaucoup en C++ quand meme.
Citation :
Ya aussi des trucs comme ACE / TAO, mais c'est vrai qu'en logiciels libres le C++ est moins populaire. Je pense que c'est largement historique avec le choix C, voire C orienté objet (Gtk...). Par contre dans l'industriel c'est l'inverse, le C n'est généralement utilisé qu'en dernier recours.
Le fait que le C soit pas beaucoup utilise en libre, c'est parce que le libre s'est developpe sur unix, et que le C++ est a l'antithese de la philosophie unix, je pense. Contrairement a toi, je pense que c'est fondamentalement un probleme esthetique/ideologique, plus que pratique. Je pense que l'association windows/c++ est assez pertinente, modestie mise a part: c'est vraiment la meme philosophie. Et elle me convient pas, d'un point de vue programmeur.
Citation :
Euh, dans la STL justement, les fonctions sont représentées par des objets (souvent templatisés certes), dans <algorithm> notamment. Rien ne t'empêche de créer des objets fonctions (fonctors), le langage C++ ne t'empêche pas de le faire.
bien sur que c'est possible, mais ca l'est aussi en C a ce niveau la. A ce niveau la, si tu trouves que c'est elegant, alors on a clairement pas le meme sens de l'elegance. Perso, je trouve ca hideux, et c'est trop facile d'avoir des bugs impossibles a trouver.
Le probleme de la valeur de retour, t'as pas compris le probleme, je crois (et matlab est certainement pas elegant a ce niveau la; matlab est elegant pour l'algebre lineaire; sorti de ca, le fait que a(1) soit un appel de fonction ou le premier element d'un tableau, c'est quand meme pas fantastique). Ce que je disais, c'est que sans GC, tu peux pas retourner efficacement de valeurs sans les allouer a l'avance (ou alors avec des trucs bien chiants genre smart pointer avec reference counting).
Citation :
Faut croire que non. Comment tu protèges les membres d'une classe en C (déjà y a pas de classe) ou en php ?
php, je connais pas du tout. Mais en C, tu connais les membres de FILE, toi ? Non, moi non plus. FILE est une classe, fopen et cie les fonctions membres. L'implementation est cachee, seule l'API est decouverte.
Citation :
Je ne parlais pas de cacher l'implémentation, mais seulement d'empêcher les accès sauvages aux membres d'une classe.
Ca revient au meme. Concretement, dans la plupart des bons framework C++, je pense que c'est implemente comme je l'ai fait: un pointeur prive vers une 2d classe implementation declaree par avance. Exactement comme en C.
La forward declaration me gene pas du tout par ailleurs, je le fais tout le temps en C perso pour implementer cette technique (c'est le seul moyen quasiment pour eviter les memory leaks dans tout code un peu complexe, surtout si c'est destine a etre utilise par des langages haut niveau).

Pov Gabou

Citation :
En C ou C++ puisque les deux langages sont compatibles.
Ca fait longtemps que c'est plus le cas, quand meme, au niveau des sources... Et au niveau binaire, ca revient a ecrire des wrappers, et je pense pas que ca mette plus de temps en python qu'en C++ d'ecrire des wrappers compatibles avec les semantiques modernes du langage (exception safe, entre autre).
Un langage generaliste doit evidemment etre capable de reutiliser les librairies ecrites en C, surtout sous unix. Ca a toujours ete un des buts du python, d'ailleurs (et de pleins d'autres langages bien evidemment).
- < Liste des sujets
- Charte