Sujet Le pub des programmeurs
- 1 925 réponses
- 117 participants
- 123 070 vues
- 130 followers
Anonyme
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
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.
- < Liste des sujets
- Charte