Se connecter
Se connecter

ou
Créer un compte

ou
FR
EN

Le pub des programmeurs

  • 1 927 réponses
  • 117 participants
  • 131 719 vues
  • 130 followers
Sujet de la discussion Le pub des programmeurs
Salut :coucou: y a des programeurs sur AF si oui vous bossez sous quoi ?
Afficher le sujet de la discussion
526

Citation : Et je vois vraiment pas le probleme de maintenance. En GUI, tu fais comment sans les callbacks ?



Un callback, c'est une fonction, sans attributs. Un objet possède à la fois des attributs et des fonctions qui modifient les attributs. Et bien tu fais une classe de base, et tu dérives tes composants de cette classe de base, en spécialisant leur comportement. Il n'y a aucun callback dans les libraries GUI écrites en C++.

Citation : 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.



On ne te parle pas spécifiquement de projets *libres*. Un gros projet, c'est maintenu plus de dix ans en entreprise, et par plusieurs personnes. Ce n'est pas tjs la même personne qui gère telle ou telle partie du code. C'est pourquoi, il faut que le code soit compréhensible et facilement maintenable.

Citation :
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.



Et bien en l'occurence, FILE c'est un type (une struct il me semble) et les fonctions f* sur les FILE sont des fonctions. Ce n'est pas objet du tout, ce sont des restes de C qui ont été intégrés dans le C++. Dans le C, la notion de classe et fonction membres n'existent pas, il n'y a que les struct et les fonctions.

Citation : 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).



Ben ça c'est pas vrai. Je mixe allègrement du C++ avec des appels de fonctions C sans problème dans mon code, et sans encapsuler.
527

Citation :
Et bien en l'occurence, FILE c'est un type (une struct il me semble) et les fonctions f* sur les FILE sont des fonctions. Ce n'est pas objet du tout, ce sont des restes de C qui ont été intégrés dans le C++. Dans le C, la notion de classe et fonction membres n'existent pas, il n'y a que les struct et les fonctions.



Non mais tu joues sur les mots, la. Oui, il y a pas le mot cle class en C, Mais concretement, ca change pas grand chose. En C++, le compilo t'aide un peu, c'est tout. Quand tu fais a.foo(), en fait, c'est juste foo(a); le compilateur fait la transcription, mais c'est juste un peu de syntaxe. C'est ce que je disais precedemment

Donc en gros, FILE *a = fopen(blabla), et fstream = file_op(blabla), c'est pareil. Les deux grosses differences, c'est que t'as pas a passer this, et que t'as le mecanisme d'acquisition memoire, qui je le reconnais, est un gros point fort du C++ par rapport au C.

Citation :
Il n'y a aucun callback dans les libraries GUI écrites en C++.



QT, les signals et les slots, ce sont des mots cles pour finalement avoir des fonctions comme objets. Alors si pas callback tu entends pointeur de fonction, oui, c'est pas tout a fait ca, mais si la encore tu vois un peu plus haut niveau, cad fonction comme argument d'une autre fonction, ben c'est pareil.

Citation : Je mixe allègrement du C++ avec des appels de fonctions C sans problème dans mon code, et sans encapsuler.



Je crois qu'on parle pas de la meme chose. Ce que je voulais dire, c'est qu'en general, tu peux pas compiler du code C avec un compilateur C++; donc le C n'est pas un subset du C++. C'Etait vrai il y a longtemps, mais ca l'est plus.

Pour les wrappers en C++, pour tout librairie un peu complexe, t'as des structures avec initialisation/destruction en C (par exemple fopen/fclose). Si tu veux utiliser ca en C++, a cause entre autres du probleme des exceptions dans les constructeurs, t'es oblige de wrapper ca dans des classes.

Par exemple, dans mon exemple bidon poste il y a qqs semaines, d'hote basique VST en python, il y a un wrapper pour les appels dlopen/dlclose, un pour l'appel de l'init/destruction du plug (faite au travers de l'interface C), etc...en C++, qui est ensuite envoye au python pas boost::python (tu vois, j'utilise le C++ parfois).
528

Citation :
On ne te parle pas spécifiquement de projets *libres*. Un gros projet, c'est maintenu plus de dix ans en entreprise, et par plusieurs personnes.



linux, apache, python, perl, gcc, mozilla, kde, qt, X, open office, c'est des petits projets avec 2 personnes pendant 3 mois ? Bien sur qu'il y a pas que le libre, mais il y a en tout cas de sacres gros projets maintenus sur le long terme en libre, *aussi*.

Et comme par definition, ce sont les seuls gros projets dispo pour les personnes externes, ben je me base pas mal la dessus.

Mais je suis vraiment curieux, parce qu'une grosse partie de ton argumentaire, a toi et pouet, est base sur ces fameux gros projets maintenus sur 10 ans, et que je vois toujours pas ce qu'ils ont de si particulier.
529

Citation : Non mais tu joues sur les mots, la. Oui, il y a pas le mot cle class en C, Mais concretement, ca change pas grand chose. En C++, le compilo t'aide un peu, c'est tout. Quand tu fais a.foo(), en fait, c'est juste foo(a); le compilateur fait la transcription, mais c'est juste un peu de syntaxe. C'est ce que je disais precedemment



Non je ne joue pas sur les mots. Là, t'es en train de dire que le fonctionnel c'est pareil que l'objet. Non ! Que fais-tu du polymorphisme, de la protection des données encapsulées ? Je sais bien qu'on peut écrire un compilo C++ en C, c'est pas pour ça que les langages sont identiques.

Citation :
QT, les signals et les slots, ce sont des mots cles pour finalement avoir des fonctions comme objets. Alors si pas callback tu entends pointeur de fonction, oui, c'est pas tout a fait ca, mais si la encore tu vois un peu plus haut niveau, cad fonction comme argument d'une autre fonction, ben c'est pareil.



Mauvais exemple, les mots clés rajoutés par QT ne sont pas du C++ standard. Ils ont été introduit pour palier à une limitation du C++. N'empêche qu'avec d'autres librairies GUI, tu n'as pas besoin de ces mots-clés et ça ne justifie pas non plus l'utilisation de callbacks (ou pointeurs de fonction si tu veux).

Citation : Je crois qu'on parle pas de la meme chose. Ce que je voulais dire, c'est qu'en general, tu peux pas compiler du code C avec un compilateur C++; donc le C n'est pas un subset du C++. C'Etait vrai il y a longtemps, mais ca l'est plus.



Et bien si justement :

extern "C" {
// ton code C ici
}

Et avec ça, t'es pas obligé de wrapper (même si c'est conseillé).
530

Citation : linux, apache, python, perl, gcc, mozilla, kde, qt, X, open office, c'est des petits projets avec 2 personnes pendant 3 mois ? Bien sur qu'il y a pas que le libre, mais il y a en tout cas de sacres gros projets maintenus sur le long terme en libre, *aussi*.



J'ai pas dit le contraire. Ce qu'on disait, c'est que dans ces grands projets, on ne fait pas de pirouettes avec le langage. Je connais pas mal Qt et un petit peu Mozilla, c'est très "objet", le code est très propre et lisible, et ne verras pas de pointeurs de fonction dedans, tu n'auras pas de membres de classe en public, bref, c'est bétonné pour éviter que d'autres fassent des bêtises en utilisant le code. La plupart des limitations que tu imputes au C++ concernent justement des pirouettes qui rendent difficile la maintenance de gros projets. En gros, je te conseille de relire le bouquin de Gamma et al. car j'ai l'impression que tu as loupé pas mal de trucs.
531

Citation : Mais je suis vraiment curieux, parce qu'une grosse partie de ton argumentaire, a toi et pouet, est base sur ces fameux gros projets maintenus sur 10 ans, et que je vois toujours pas ce qu'ils ont de si particulier.


Citation : 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.


Dans les projets du libre, comme la plupart du temps c'est bénévole, si le projet est gros et compliqué tu n'auras (quasiment) que des développeurs compétents, voire très ou extrêmement compétent. Dans l'industrie, pour une bonne partie, c'est un gagne-pain, voire le seul boulot que tu as trouvé (je connais des docteurs en électro-magnétisme, un agrégé de poissons exotiques... qui pissent du code sur des applis de "gestion" ). Donc dans une équipe de 10 personnes, tu as au moins un maillon faible ( :mrg: ), voire plusieurs.

Je connais des sources d'une appli de supervision avec des fonctions de 3.000 lignes, truffé de
char*c=malloc(sizeo(char*))
, des applis multi-processus, chacun multi-threadé mélangeant Ada et C+Motif, conçu par une équipe qui découvrait la programmation multi-tâche... Une autre appli avec des gars "compétents" qui se sont fait plaisirs, résultat de l'héritage en C++ sur 7 niveaux en hauteur, 5 en largeur, et bien sûr, en bas, du multi-héritage. Les mêmes se sont faits des functors de folie avec des template de template. Imagine quand le gars du malloc va maintenir ça...

Dans ces cas-là, il faut faire simple et clair, et éviter comme la mort le "balaize", "l'acrobatique", "l'astucieux"... D'ailleurs même quand c'est du code que tu as écrit toi-même, si tu dois le retoucher après l'avoir laissé 2 ans, tu as du mal à t'y retrouver si ce n'est pas "simple voire stupide".

D'où mon "heureux homme" un peu plus haut... :bravo:
532

Citation : 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.


Je n'ai jamais réellement développé sous Windows, et l'essentiel du C++ que j'ai vu (et voit dans de très gros projets qui démarrent) c'est sous Unix (Linux désormais). Mais c'est dans un contexte industriel, et pas logiciel libre. Je pense que la frontière est plutôt là (une fois que tu es parti sur un choix, tu t'y tiens un moment). D'ailleurs j'ai fait partie de ceux qui ont essayé de faire découvrir le libre (à commencer par Linux), et au début les réticences étaient assez surréalistes... comme l'a été ensuite l'adoption quasi du jour au lendemain...

Citation : Un callback, c'est une fonction, sans attributs. Un objet possède à la fois des attributs et des fonctions qui modifient les attributs. Et bien tu fais une classe de base, et tu dérives tes composants de cette classe de base, en spécialisant leur comportement. Il n'y a aucun callback dans les libraries GUI écrites en C++.


C'est exactement ce à quoi je pensais. Ya pas 36 solutions d'ailleurs.

De plus, mais là je ne fais que répéter ce qu'on m'a dit, Ilog Views est une utilisation de l'objet bien plus convaincante que les MFC de Windows.
533
Erlang : ça http://www.erlang.org/white_paper.html ça m'a l'air pas mal, notamment en bas les exemples concrets...
534

Hors sujet :
desole pour la reponse un peu tardive a plusieurs posts, mais AF rame a mort, la



Citation :
Non je ne joue pas sur les mots. Là, t'es en train de dire que le fonctionnel c'est pareil que l'objet.



J'ai jamais parle de fonctionnel (serieux, ou est ce qu'on parle de currying, de closures, etc... la ? :???: ), ni de polymorphisme, juste de cacher l'implementation, et a ce niveau la, le C++ n'apporte rien, puisque dans les deux cas tu declares juste la strucure d'implementation, et tu l'implementes (entre autre declaration des variables membres) dans les fichiers c ou cpp lorsque tu programmes correctement.

Bon, visiblement, je m'exprime tres mal, donc je cite ce que dit paul Davis et E Castro de Lopo sur ce point precis:

https://ccrma.stanford.edu/mirrors/lalists/lad/2003/02/0061.html

Citation :
>"I also think that there is a real problem with the way classes are defined
>in C++ and this is a problem which really does impact design. The problem is
>that you are forced to define the private data members and functions at the
>same time as the public ones. This is OK for the trivial C++ examples you
>see in textbooks but as soon as you REALLY want to hide the private
>information you end up defining the class to have a single private void
>pointer which gets something allocated to it in the implementation. This is
>basically the same thing you do when doing OO programming in C, so where is
>the benefit of C++?"
>
>--
>
>You are not forced to define the private data members and functions at the
>same time as
>the public ones in C++. The way to handle this is to put the public
>interface in a pure
>virtual class:
>
>class animal
>{
>public:
> virtual int legs() = 0; // returns number of legs the animal uses when
>moving around
>};
>
>and then derive from that interface:
>
>class dog : public animal
>{
>public:
> int legs() { return 4; }
>};

i love C++. i think its one of the best things ever. but i happen to
agree with Erik. the solution proposed by martijn doesn't scale well,
and doesn't really address the issue in a comprehensive way. it
requires one pure virtual class per distinct set of private members,
for a start.

the kinds of problems i have with C++ stem from the fact that you
cannot mark a section of protected members as accessible from only a
particular set of friends. the only way to say "only class Foo can
access these member (functions)" is to create a separate class, make
Foo a friend of that class, and then inherit from it.

this gets really messy really soon. the editor object in Ardour
contains many distinct sets of functionality that i would really like
to partition. i could create a set of discrete classes that cover each
aspect of the functionality, and then do MI from all of them. the
problem is that is each one of these aspects *internally* needs to
know about the others, which now means that they each have to be
friends of each other. so what's the point? i'd end up with something
ludicrous like:

class EditorFoo {
...
protected:
friend class EditorThis;
friend class EditorThat;
friend class EditorTheOther;
...
friend class ObjectThatInteractsWithEditorFoo;
...
};

...

class Editor : public EditorFoo, EditorThis, EditorThat,
EditorTheOther .... {
}

which is really no help at all. the other alternative is to use HAS-A
instead of IS-A, and its even worse. we end up with lots of code like:

editor->foo->...
editor->that->...
editor->theother->...

all i'd really like it to be able to say:

class Foo {
protected:
/* scope A */
friend class Bar;
...
protected:
/* scope B */
friend class Baz;
...
};

such that Bar can only access stuff within "scope A" and Baz can only
access stuff in "scope B". that is, access control keywords
("private", "protected", "public" define access scopes). right now, a
friend class declared anywhere within the class declaration is a
friend, period.

none of this helps with the problem erik identified. i would really
love a C++ that did this:

class Foo {
public:
... stuff ...
private:
<some tokens that meant something like #include>
};

and then in other files, you would do:

#use "foo.h"

or

#implementation "foo.h"

or something like that. the first one would just bring in the public
declarations, and its what you'd use when you're calling or creating
Foo objects. the second one would be used in the definitions for the
member functions of Foo, and hence would almost certainly be limited
to "foo.cc".

note that the private stuff would be in a file that looked just like
the class declaration, but had no public (and protected?)
declarations. in other words, the class declaration it includes is
implicitly 100% private, but it can include header files that are
necessary for the private declarations.

just dreaming.

--p



Citation :
Mauvais exemple, les mots clés rajoutés par QT ne sont pas du C++ standard. Ils ont été introduit pour palier à une limitation du C++. N'empêche qu'avec d'autres librairies GUI, tu n'as pas besoin de ces mots-clés et ça ne justifie pas non plus l'utilisation de callbacks (ou pointeurs de fonction si tu veux)



Bon, c'est quoi les GUI dont tu parles ? Je viens de regarder wxwindow, c'est plus moche que QT avec des macros, avec gtkmm (wrapper c++ de gtk), ca utilise les template, mais c'est juste une maniere d'avoir un callback safe, etc... En python, que ce soit pygtk ou pyqt, ce sont des callbacks, win32, ce sont des callback. Alors avec ca, je pense qu'on couvre deja au moins 50 % dues librairies pour GUI.

Citation :
Et bien si justement :

extern "C" {
// ton code C ici
}



extern C, c'est la convention de linkage; rien a voir avec la compatibilite C/C++ au niveau source. Ca permet au contraire aux fonctions C++ d'etre appeles par des facilites faites pour le C (par exemple dlopen sous unix).

Par exemple:

extern "C" {
int foo()
{
double *a = malloc(sizeof(*a));
free(a);
}
}

Ca compilera pas, parce que C++ interdit la promotion automatique de void*. Par contre, ca permet d'ouvrir la fonction foo a partir d'une librairie dynamique en utilisant dlopen et assimiles a partir d'un programme C, comme ca le nom foo n'est pas "mangle" (tu dois faire ca pour utiliser du code c++ sous matlab, par exemple).

Citation :
Je connais pas mal Qt et un petit peu Mozilla, c'est très "objet", le code est très propre et lisible, et ne verras pas de pointeurs de fonction dedans



C'est bien ce que je dis pour QT: t'as pas de pointeurs de fonctions, parce que c'est laid. En C, t'as pas le choix. En c++, t'as en gros l'approche template, qui n'est pas dynamique et utilisee dans gtkmm par exemple au travers de libsig++

http://libsigc.sourceforge.net/libsigc2/docs/manual/html/ch02.html#id2446517

Ou l'approche QT (ou par macro, mais je pense que derriere, c'est equivalent). Tous les deux sont des astuces pour donner l'impression que tu peux passer une fonction en argument d'une autre (ce que moi j'appelle un callback, mais je pense que le terme est ambigu, car pour toi, ca veut dire pointeur, alors que pour moi, ca veut juste dire pouvoir passer une fonction comme une variable).

Citation :
En gros, je te conseille de relire le bouquin de Gamma et al. car j'ai l'impression que tu as loupé pas mal de trucs.



Je crois pas non, mais je veux bien que tu me donnes un exemple d'un truc que j'ai pas compris :bravo2: Vu qu'on a jamais parle des design pattern pour l'instant, je vois difficilememtn comment tu pourrais savoir ce que j'en ai compris ou pas, cependant...

Citation :
La plupart des limitations que tu imputes au C++ concernent justement des pirouettes qui rendent difficile la maintenance de gros projets



Mais c'est bien ce que je reproche au C++: le fait que c'est tellement complexe quie chacun implemente un sous ensemble, qui est chaque fois different... LE sous ensemble de QT me convient tres bien, par contre. Pas de template, un bon mecanisme pour les evenements (on va eviter callback :) ), une putain de doc, une bonne license, et de loin la plus cross plateforme que je connaisse :) Mais encore une fois, c'est dans le domaine des GUI complexes, ou je pense que le C++ est le plus souvent LE langage de choix.

Citation :
Dans les projets du libre, comme la plupart du temps c'est bénévole, si le projet est gros et compliqué tu n'auras (quasiment) que des développeurs compétents, voire très ou extrêmement compétent. Dans l'industrie, pour une bonne partie, c'est un gagne-pain, voire le seul boulot que tu as trouvé (je connais des docteurs en électro-magnétisme, un agrégé de poissons exotiques... qui pissent du code sur des applis de "gestion" ). Donc dans une équipe de 10 personnes, tu as au moins un maillon faible ( ), voire plusieurs.



Je suis bien conscient de ca. Mais du coup, je trouve que ca apporte beaucoup d'eau a mon moulin sur le fait que le C++ n'est pas un langage fantastique; en gros, on l'utilise parce que c'est ce que les gens connaissent, et que comme tout le monde connait le C ou le Java, on peut faire du C++, les 3 langages etant tres similaires... :)

Hors sujet :
Je me rends compte qu'encore une fois, je m'emporte un peu, et ca peut passer pour des attaques personnelles... C'est pas l'effet voulu, mais je trouve que ce genre de discussions permet d'approfondir des points qu'on connait pas forcement, et de voir un autre point de vue. Donc meme si j'en ai pas l'air, je trouve tres interessant vos arguments, car vous venez pouet et toi d'un autre contexte que le mien.

535

Citation :
Dans ces cas-là, il faut faire simple et clair, et éviter comme la mort le "balaize", "l'acrobatique", "l'astucieux"... D'ailleurs même quand c'est du code que tu as écrit toi-même, si tu dois le retoucher après l'avoir laissé 2 ans, tu as du mal à t'y retrouver si ce n'est pas "simple voire stupide".



Donc ton argument, c'est que le C++ est un bon langage pour eviter ca ? Serieusement, je comprends pas le raisonnement. Faire du code lisible, c'est quand meme nettement plus possible en python (ou en ruby, lisp, VB, ce que tu veux) qu'en C++. Si je veux appliquer une fonction a une liste C++, on fait un truc du style


int foo(int);
for_each(v.begin(), v.end(), _1 = bind(foo, _1));


en python (et dans la plupart des langages ou les fonctions peuvent etre des variables au meme titre qu'entier, chaine de caracteres, c'est similair, donc c'est pas propre du tout a python), ca donne


[foo(i) for i in v]


Faire du code lisible, c'est important pour moi parce que la duree, c'est en annee, et c'est souvent un peu complique algorithmiquement (les structures de donnees sont hyper simples, par contre, dans la majorite des cas). C'est une des raisons pour laquelle j'ai abandonne tres vite blitz, par exemple.
536
Erratum, j'ai écrit fonctionnel au lieu d'impératif. Pour l'objet en C, je trouve qu'il y a déjà un abus de langage. Si tu peux effectivement coder à la main une structure d'objet en C, tu n'as pas tous les avantages d'un vrai langage objet. Et le C, pour moi c'est de l'impératif car la notion d'objet, de polymorphisme, d'encapsulation des données et des méthodes n'existent pas en C "normal".

Citation : extern C, c'est la convention de linkage; rien a voir avec la compatibilite C/C++ au niveau source. Ca permet au contraire aux fonctions C++ d'etre appeles par des facilites faites pour le C (par exemple dlopen sous unix).



Ben écoutes, j'utilise des libraries écrites initialement en C dans mes programmes C++ grâce à cette technique donc je sais bien que ça fonctionne.

Citation : Je crois pas non, mais je veux bien que tu me donnes un exemple d'un truc que j'ai pas compris Vu qu'on a jamais parle des design pattern pour l'instant, je vois difficilememtn comment tu pourrais savoir ce que j'en ai compris ou pas, cependant...



Dans le bouquin de Gamma, il n'y a pas que la description des Design Patterns mais aussi des conseils sur la conception objet, les problèmes que l'on rencontre dans un design et leurs solutions. Par exemple, tu dis par exemple que c'est dur de faire des callback en C++. Et ben dans le bouquin de Gamma, ils précisent que de toute façon c'est pas une bonne idée à la base de vouloir faire des callbacks. Pour ton exemple d'héritage et de factorisation de code, ben ils en parlent dans le même bouquin et expliquent qu'il faut préférer l'aggrégation à l'héritage pour cette raison. Bref, les problèmes que tu soulèves avec le C++ me semblent plutôt mettre en évidence des problèmes de conception objet plutôt que les limitations du langage C++ - même si je ne nie pas qu'il y a bien des limitations du langage hein ;) C'est pour ça que je te suggère de relire le bouquin.

Pour QT, je trouve que c'est un très bon exemple de design objet dans sa majorité, excepté pour le coup des signals/slots puisque la syntaxe n'est pas entièrement C++. Sinon comme dis Dr Pouet, ilog views est bien fichu aussi d'après ce que j'ai entendu.

Citation : Ou l'approche QT (ou par macro, mais je pense que derriere, c'est equivalent). Tous les deux sont des astuces pour donner l'impression que tu peux passer une fonction en argument d'une autre (ce que moi j'appelle un callback, mais je pense que le terme est ambigu, car pour toi, ca veut dire pointeur, alors que pour moi, ca veut juste dire pouvoir passer une fonction comme une variable).



Ce que j'appelle callback c'est bien une fonction que tu passes en paramètre, et la fonction n'a pas d'attributs propres comme pour les objets. Donc en C++ c'est un forcément pointeur sur une fonction. Je ne sais plus ce qu'impliquent les signals et slots en termes de fonctionnalités du langage, mais ça ne se situe pas au niveau des callbacks il me semble puisque c'est réalisable en C++ standard.

Citation : Mais c'est bien ce que je reproche au C++: le fait que c'est tellement complexe quie chacun implemente un sous ensemble, qui est chaque fois different...



Dans le fond, je suis un peu d'accord, mais je ne pense pas que le C++ ait l'exclusivité sur la diversité des approches pour parvenir à la même solution. La faute incombe selon moi plus aux mauvaises habitudes des programmeurs qu'au langage ;) D'ailleurs, les bouquins sur les Design Patterns sont justement fait pour éduquer les programmeurs à la conception objet.
537

Citation : J'ai jamais parle de fonctionnel (serieux, ou est ce qu'on parle de currying, de closures, etc... la ? )


Je pense que zieQ veut dire "impératif" au lieu de "fonctionnel".

Citation : The problem is that you are forced to define the private data members and functions at the same time as the public ones.


C'est vrai que c'est bien dommage ça.

Citation : Je suis bien conscient de ca. Mais du coup, je trouve que ca apporte beaucoup d'eau a mon moulin sur le fait que le C++ n'est pas un langage fantastique; en gros, on l'utilise parce que c'est ce que les gens connaissent, et que comme tout le monde connait le C ou le Java, on peut faire du C++, les 3 langages etant tres similaires...


Pas fantastique, on est bien d'accord. Mais je trouve que dans la plupart des cas, c'est un peu mieux que C au sens où il est un peu plus facile de faire du code lisible, et un peu plus difficile de faire des erreurs.

Mon "retour de vécu" était là aussi pour dire que plus le compilateur trouve d'erreurs (donc avant les tests que l'on fait manuellement), moins il en reste ensuite.

Dans ce contexte je ne pense pas que la richesse d'expression de langages comme python, perl ou php compense la perte d'un typage fort. Par contre un langage qui conjuguerait le meilleur des deux mondes serait vraiment chouette, et apparemment Ocaml le fait. Mais sera-t-il assez répandu un jour pour être utilisé dans ces contextes ? Pas sûr du tout (malheureusement).

Citation : Donc ton argument, c'est que le C++ est un bon langage pour eviter ca ? Serieusement, je comprends pas le raisonnement. Faire du code lisible, c'est quand meme nettement plus possible en python (ou en ruby, lisp, VB, ce que tu veux) qu'en C++. Si je veux appliquer une fonction a une liste C++, on fait un truc du style


La lisibilité serait un avantage de C++ sur C ; et le typage un avantage de C++ sur les langages que tu cites (VB je sais pas, mais là l'inconvénient c'est Windows et c'est rédhibitoire !). L'exemple de la liste n'est effectivement pas à l'avantage de C++ !

Citation : Faire du code lisible, c'est important pour moi parce que la duree, c'est en annee, et c'est souvent un peu complique algorithmiquement (les structures de donnees sont hyper simples, par contre, dans la majorite des cas). C'est une des raisons pour laquelle j'ai abandonne tres vite blitz, par exemple.


Tu donnes peut-être bien un éclairage clé à notre discussion là : en "informatique de gestion" les algorithmes sont rarement bien compliqués (et ces parties sont vraiement isolées), par contre ils sont très nombreux, et les structures de données sont complexes et nombreuses. Depuis quelque temps, il y a en plus le parallélisme qui rajoute de la complexité (au sens de gros bordel à gérer / ordonner, et pas "algorithme pointu qui fait mal à la tête" ).

Citation : Je me rends compte qu'encore une fois, je m'emporte un peu, et ca peut passer pour des attaques personnelles... C'est pas l'effet voulu, mais je trouve que ce genre de discussions permet d'approfondir des points qu'on connait pas forcement, et de voir un autre point de vue. Donc meme si j'en ai pas l'air, je trouve tres interessant vos arguments, car vous venez pouet et toi d'un autre contexte que le mien.


;)
T'inquiète, je m'en doute un peu. Je suis pas sûr que ça te plairait ce genre de domaine d'ailleurs, en tout cas ça t'énerverait au moins au début (avec pas mal de bonnes raisons). Au moins avec ce genre de discussion tu sais mieux à quoi ces univers ressemblent !
538
Pour parler d'une (bonne) expérience que j'ai eu est le framework juce en C++. Très propre, porte sur absolument tout (de l'entier en passant par la GUI, les listes, les threads, le VST...). Le code est hyper bien documenté, et les exemples font foisons.
Regardez du code en Juce est simple. Il fait toutes ces surcouches des types de bases pour éviter les abus habituels des codeurs.
Enfin je vous laisse jeter un coup d'oeil par vous même à la démo. Par contre la première compilation n'est pas triviale en soit (prenez donc la demo précompilée, les sources sont consultables dedans).

http://www.rawmaterialsoftware.com/juce/download.php

Le code y est très propre. On peut encore faire des ignominies, c'est sûr, mais juste par curiosité de voir quelque chose de bien fait.
(le gars qui a fait cela est esponsable de Tracktion aussi).

http://soundcloud.com/bat-manson

539

Citation : Sinon comme dis Dr Pouet, ilog views est bien fichu aussi d'après ce que j'ai entendu.


En plus à l'origine il a été écrit en lisp (et s'appelait Aïda Masaï) (je drague Gabou là ;) ) avant d'être ré-écrit en C++ pour connaître une plus large diffusion. Tout ça vient de l'Inria (Ilog en est une émanation).

Citation : 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.


En fait, mon argumentation sur les développeurs pas toujours rigoureux vaut surtout en faveur des langages typés statiquement. Pour les logiciels libres, je pense qu'il y a d'autres facteurs qui ont joué :
- gcc n'a bien géré le C++ que assez récemment, et pas mal d'années après certains compilos industriels
- une large part du code (libc, gcc, emacs) date de bien avant C++, et une bonne part des développeurs aussi (Stallman le premier), et n'ont pas vraiment eu envie de changer leurs habitudes.

Dans le domaine public aussi il y a des compromis finalement. Ce ne sont pas les mêmes, il y a moins de développeurs avec un niveau insuffisant, mais il est plus difficile d'avoir 10 personnes qui vont démarrer un projet de zéro en bossant à temps plein dessus pendant 2 ans, avec une bonne coordination (plus facile quand il y a un "chef", même si ça n'a pas que des avantages ;) ).
540
La discution ne pourra jamais se terminer! :8O:
541
Oué clair faudrait déplacer dans le coin des gentlemen, parce que meme si c'est instructif, c'est surtout des débats polémiques ...

cptn.io

542
Ben c'est un pub quoi...
Disons que le truc sympa, c'est en le mettant ici, personne de censé viendrait fouiller dans bidouilles informatiques. :lol:
On reste en informaticien prépubère. :aime:
:bravo: :bravo: :mdr:
Les smileys, c'est pour faire plus authentique.

http://soundcloud.com/bat-manson

543

Citation :
Erratum, j'ai écrit fonctionnel au lieu d'impératif. Pour l'objet en C, je trouve qu'il y a déjà un abus de langage. Si tu peux effectivement coder à la main une structure d'objet en C, tu n'as pas tous les avantages d'un vrai langage objet. Et le C, pour moi c'est de l'impératif car la notion d'objet, de polymorphisme, d'encapsulation des données et des méthodes n'existent pas en C "normal".



C'est ce que je disais: le C++ apporte un peu de syntaxe. La ou on n'est pas d'accord, c'est sur le fait que ca fait une grosse difference. Sur une echelle prog objet de 0 a 10, avec 1 pour le C, 10 pour smalltalk, perso, je mets le C++ a 2 ou 3, pas a 8 ou 9.

Sinon, l'encapsulation, le post de P. Davis montre bien que c'est pareil en C et en C++, fondamentalement. Polymorphisme et cie, ca n'a de reel sens que pour un langage de type dynamique comme je l'ai dit precedemment; c'est rajouter au langage statique un hack pour le rendre dynamique.

Citation :
Pour ton exemple d'héritage et de factorisation de code, ben ils en parlent dans le même bouquin et expliquent qu'il faut préférer l'aggrégation à l'héritage pour cette raison.



La encore, je me suis pas fait comprendre. Oui, il faut preferer l'aggregation au l'heritage au C++ d'apres le bouquin. Mais la raison, c'est quoi ? C'est parce que l'heritage est statique, et qu'une fois que c'est fait, c'est tres difficile a changer: si tu as la classe B quiherite de A, et que tu vois qu'en fait, tu aurais du faire B qui herite de rien avec une instance de A comme membre, toutes les fonctions, classes et cie qui dependent du fait que B est aussi A doivent etre changes.

En python ou en smalltalk, la difference joue nettement moins.

Dit differement: un des buts fondamental de l'objet, et des design en particulier, c'est le decouplage. Le C++ etant hyper statique, il faut pas mal de boulot pour ca. EN python, smalltalk et cie, c'est nettement plus simple.

Par exemple, une factory, en python, c'est hyper naturel. En fait, t'en fais tout le temps sans y penser tellement c'est evident dans ce langage. Un decorator, c'est aussi super simple.

par exemple:


class Foo:
# do nothing
pass

class Decorator:
def __init__(self, decoree):
self.inst = decoree
def __getattr__(self, name):
return getattr(self.inst, name)

f = Foo()
d = Decorator(f)
# -> si blop existe dans decorateur, c'est Decorator.blop qui est excutee,
# c'est dispatche vers les membres de f sinon
d.blop()

En 5 lignes, t'as un decorator qui marche pour n'importe quel objet, qui redispatche les methodes de decoree non trouvees dans Decorator vers les membres de la classe de f. Si t'as pas besoin de la hiearchie, tu peux aussi tout simplement rajouter les fonctions du decorator a la volee (tiens, d'ailleurs, sur le coup des fonctions ajoutees a la volee qui seraient pas utilisees dans du code de production, ca veut dire que t'utilises pas de decorator non plus ?).

Et des exemples comme ca, je te le fais pour n'importe quel pattern qui a un sens en C++.

Alors oui, c'est nettement plus lent, oui il y a pas de typage statique (mais me dit pas que a n'a pas un avantage evident, la, quand meme), mais si tu apprends l'OO, pour comprendre le concept sans se faire chier avec les details, je pense qu'on est d'accord sur le fait qu'entre C++ et python, il y a quand meme pas photo.

Le bouquin du gang of 4, je le trouve pas fantastique personellement. Les idees qui y sont sont importantes, pas de toute la dessus, mais si le bouquin avait ete fait avec un langage objet comme ca l'a ete concu dans les annees 60/70, ca aurait ete beaucoup plus clair.

Depuis que je programme en python, je programme nettement mieux en C et en C++ :)

Citation :
Ben écoutes, j'utilise des libraries écrites initialement en C dans mes programmes C++ grâce à cette technique donc je sais bien que ça fonctionne.



Oui, mais c'est de la compatibilite binaire, pour appeler des fonctions dans un autre module de compilation (fichier). Rien a voir avec les sources donc: le C n'est pas un sous ensemble du C++, et tu peux pas compiler du code C avec un compilo C++, a moins de faire super gaffe des le depart. extern "C", ca sert pas a appeler du C depuis le C++, ca sert exactement a l'inverse: dire au compilo d'avoir un linkage C, pour que les fonctions incluses soient appelable depuis n'importe quel systeme s'appuyant sur la convention C. Ca sert aussi lorsque tu veux inclure des headers de C dans du C++, mais ca ne fait qu'importer les declaration, aucune implementation.

extern "C" n'a qu'un seul but: dire a un compilateur C++ de considerer les fonctions avec du linkage C, et pas C++:


extern "C" {
int foo(void);
}

int bar(void);

int main(void)
{
bar();
foo();
return 0;
}


Tu compile le fhicher, et tu passes nm pour voir les symboles exportes:


U foo
U __gxx_personality_v0
T main
T _Z3barv


ben bar esty linke en C++, avec mangling qui est dependant du compilateur; et foo est pas mangle, parce que declaree externe C. Ca permet donc au linker C++ de chercher foo et non _sdkglksdjhBABA_foo dans l'autre fichier/librairie qui implemente foo.

Apres, bien sur que tu peux appeler du C depuis le C++, sinon ca ferait longtemps que plus personne n'utiliserait le C++.

Citation :
Ce que j'appelle callback c'est bien une fonction que tu passes en paramètre, et la fonction n'a pas d'attributs propres comme pour les objets. Donc en C++ c'est un forcément pointeur sur une fonction. Je ne sais plus ce qu'impliquent les signals et slots en termes de fonctionnalités du langage, mais ça ne se situe pas au niveau des callbacks il me semble puisque c'est réalisable en C++ standard.



En Qt, une classe qui supporte signal/slot, tu connectes unsignal (l'evenement) a un slot (le listener) avec connect. Les arguments de la fonction connect, c'est bien des fonctions, non ?

En Qt C++: connect(objet emetteur, signal, objet recepteur, slot), signal et slot etant des fonctions.

QU'une fonction soit un objet, un pointeur, etc... niveau concept, c'est exactement pareil. Je comprends pas pourquoi tu veux faire une difference entre fonction avec attribut propre ou simple variable. Ca change rien conceptuellement.
544
J'ai reouvert effective C++, (que j'avais pas ouvert depuis longtemps, je vais le depoussierer :) ), car je me souvient qu'il y expliquait pourquoi tu ne pouvais pas passer un objet par reference en retour:

Citation :
No, the right way to write a function that must return a new object is to have that function return a new object. For Rational's operator*, that means either the following code (which we first saw back on page 102) or something essentially equivalent: (Item E23, P24)

inline const Rational operator*(const Rational& lhs,
const Rational& rhs)
{
return Rational(lhs.n * rhs.n, lhs.d * rhs.d);
}

Sure, you may incur the cost of constructing and destructing operator*'s return value, but in the long run, that's a small price to pay for correct behavior. Besides, the bill that so terrifies you may never arrive. Like all programming languages, C++ allows compiler implementers to apply certain optimizations to improve the performance of the generated code, and it turns out that in some cases, operator*'s return value can be safely eliminated (see Item M20). When compilers take advantage of that fact (and current compilers often do), your program continues to behave the way it's supposed to, it just does it faster than you expected.



Et ce type de problemes est fondamental dans le design de la STL (impose la copie). Si t'as un GC, tu peux optimiser le truc en general; ca accelere dont en principe; c'est un exemple classique ou le GC est plus efficace que la gestion type C++.

Pour le extern C, je recopie ce qui est donne dans le more effective C++, son explication est certainement plus comprehensible que la mienne :oops:; perso, j'aime bien son style, a Meyers. Il rappelle d'ailleurs que le name mangling n'est pas le seul probleme pour la compatibilite binaire (mais j'ai vraiment pas envie de me prendre la tete sur les autres problemes, POD et cie).

Citation :
Name Mangling ¤ Item M34, P4

Name mangling, as you may know, is the process through which your C++ compilers give each function in your program a unique name. In C, this process is unnecessary, because you can't overload function names, but nearly all C++ programs have at least a few functions with the same name. (Consider, for example, the iostream library, which declares several versions of operator<< and operator>>.) Overloading is incompatible with most linkers, because linkers generally take a dim view of multiple functions with the same name. Name mangling is a concession to the realities of linkers; in particular, to the fact that linkers usually insist on all function names being unique. ¤ Item M34, P5

As long as you stay within the confines of C++, name mangling is not likely to concern you. If you have a function name drawLine that a compiler mangles into xyzzy, you'll always use the name drawLine, and you'll have little reason to care that the underlying object files happen to refer to xyzzy. ¤ Item M34, P6

It's a different story if drawLine is in a C library. In that case, your C++ source file probably includes a header file that contains a declaration like this, ¤ Item M34, P7

void drawLine(int x1, int y1, int x2, int y2);

and your code contains calls to drawLine in the usual fashion. Each such call is translated by your compilers into a call to the mangled name of that function, so when you write this, ¤ Item M34, P8

drawLine(a, b, c, d); // call to unmangled function name

your object files contain a function call that corresponds to this: ¤ Item M34, P9

xyzzy(a, b, c, d); // call to mangled function mame

But if drawLine is a C function, the object file (or archive or dynamically linked library, etc.) that contains the compiled version of drawLine contains a function called drawLine; no name mangling has taken place. When you try to link the object files comprising your program together, you'll get an error, because the linker is looking for a function called xyzzy, and there is no such function. ¤ Item M34, P10

To solve this problem, you need a way to tell your C++ compilers not to mangle certain function names. You never want to mangle the names of functions written in other languages, whether they be in C, assembler, FORTRAN, Lisp, Forth, or what-have-you. (Yes, what-have-you would include COBOL, but then what would you have?) After all, if you call a C function named drawLine, it's really called drawLine, and your object code should contain a reference to that name, not to some mangled version of that name. ¤ Item M34, P11

To suppress name mangling, use C++'s extern "C" directive: ¤ Item M34, P12

// declare a function called drawLine; don't mangle
// its name
extern "C"
void drawLine(int x1, int y1, int x2, int y2);

Don't be drawn into the trap of assuming that where there's an extern "C", there must be an extern "Pascal" and an extern "FORTRAN" as well. There's not, at least not in °the standard. The best way to view extern "C" is not as an assertion that the associated function is written in C, but as a statement that the function should be called as if it were written in C. (Technically, extern "C" means the function has C linkage, but what that means is far from clear. One thing it always means, however, is that name mangling is suppressed.) ¤ Item M34, P13

For example, if you were so unfortunate as to have to write a function in assembler, you could declare it extern "C", too: ¤ Item M34, P14

// this function is in assembler — don't mangle its name
extern "C" void twiddleBits(unsigned char bits);

You can even declare C++ functions extern "C". This can be useful if you're writing a library in C++ that you'd like to provide to clients using other programming languages. By suppressing the name mangling of your C++ function names, your clients can use the natural and intuitive names you choose instead of the mangled names your compilers would otherwise generate: ¤ Item M34, P15

// the following C++ function is designed for use outside
// C++ and should not have its name mangled
extern "C" void simulate(int iterations);

Often you'll have a slew of functions whose names you don't want mangled, and it would be a pain to precede each with extern "C". Fortunately, you don't have to. extern "C" can also be made to apply to a whole set of functions. Just enclose them all in curly braces: ¤ Item M34, P16

extern "C" { // disable name mangling for
// all the following functions

void drawLine(int x1, int y1, int x2, int y2);
void twiddleBits(unsigned char bits);
void simulate(int iterations);
...
}

This use of extern "C" simplifies the maintenance of header files that must be used with both C++ and C. When compiling for C++, you'll want to include extern "C", but when compiling for C, you won't. By taking advantage of the fact that the preprocessor symbol __cplusplus is defined only for C++ compilations, you can structure your polyglot header files as follows: ¤ Item M34, P17

#ifdef __cplusplus

extern "C" {

#endif

void drawLine(int x1, int y1, int x2, int y2);
void twiddleBits(unsigned char bits);
void simulate(int iterations);
...

#ifdef __cplusplus

}

#endif

There is, by the way, no such thing as a "standard" name mangling algorithm. Different compilers are free to mangle names in different ways, and different compilers do. This is a good thing. If all compilers mangled names the same way, you might be lulled into thinking they all generated compatible code. The way things are now, if you try to mix object code from incompatible C++ compilers, there's a good chance you'll get an error during linking, because the mangled names won't match up. This implies you'll probably have other compatibility problems, too, and it's better to find out about such incompatibilities sooner than later, ¤ Item M34,

545
Bon en tout cas je pense que ce débat devrait donner l'envie à tout développeur C++ de donner une chance à python. En tout cas, ca m'a donné envie :bravo:

Jul

546
En fait, je conseille pas tant python qu'un langage vraiment haut niveau; parce que meme si tu l'utilises pas pour ton taff, ca t'aidera a mieux programmer. Pour l'objet, je pense que python, ruby, eiffel, smalltalk (squeak est une implementation open source; cette derniere est particulierement interessante cote vm, car ca a ete la qu'a ete implementee les techniques d'optimisation JIT, etc... pour la premiere fois a ma connaissance).

Pour python, en doc, il y a ca qui donne un bref apercu:

http://docs.python.org/tut/tut.html

Mais une fois la syntaxe captee, je trouve le lien suivant nettement meilleur (avec des concepts plus evolues; c'est oriente dev web, mais ca reste interessant pour tout le monde. Perso, je fais pas de dev web du tout)

http://diveintopython.org/toc/index.html

Je conseille aussi d'utiliser ipython comme interpreteur, car il fait la completion automatique + historique (l'interpreteur de base de python est basique).

Apres, pour la librairie standart, il y a la doc pour tout ce qui couvre le xml, les protocoles http/ftp, crypto, acces au filesystem, compression, trucs bas niveau style ficher mmap...

On peut aussi utiliser jython, qui implemente python en bytecode java et qui donne donc acces a tout le framework java, ou ironpython, qui fait pareil mais en CLR (le bytecode de .Net).

Si on est maso ou a fond dans les implementations de langage, il y a aussi pypy qui est python implemente en python, pour permettre des implementations flexibles de python. Entre autre, le projet est capable de traduire sa propre descrption en langages bas niveau, comme C, bytecode java/clr, lisp, LLVM, avec des options d'implementation comme GC vs reference couting, microthread, coroutines, etc...

http://codespeak.net/pypy/dist/pypy/doc/news.html
547
Bon, même si j'ai pas mal codé en java, je ne participerai pas au combat des langages plus ou moins de haut de niveau.

Là j'ai un stage à filer à un élève ingénieur de dernière année (ou master pro 2). Il s'agit de développement sur DSP SHARC Analog Devices pour une application musicale (voir les news sur le produit Ellipse Audio Torpedo sur AF). C'est du C fortement teinté d'assembleur, de belles contraintes temps-réel, avec l'interface de développement VisualDSP++.

Stage de février à juin 2007, rémunéré, et à Montpellier.

Les détails en MP pour les intéressés.

Le combat peut reprendre... :bravo:

Hors sujet : Gabou tout as le sujet de stage en MP

Affiliation : Dirigeant Fondateur d'Orosys - Two notes Audio Engineering

548

Citation :
Là j'ai un stage à filer à un élève ingénieur de dernière année



Je fais suivre l'information à mes collègues...héhé.

Pour python, je m'en sers comme environnement de simulation en ce moment pour de la programmation sur motes (qui se fait en nesC pour ceux qui connaissent).
L'interpréteur est très pratique pour cela, et même si une GUI existe pour cela, je suis plus à l'aise avec mes scripts.

Je ne connais pas les détails réels du langage, mais j'aime vraiment les langages de scripts en général.

http://soundcloud.com/bat-manson

549
Et le turbo-pascal ?ça existe encore ?
550
Bah tu peux télécharger le 5.5 gratuitement: http://bdn.borland.com/article/20803

Je crois que c'est devenu Delphi par la suite. Même language, nom différent.

Jul