Se connecter
Se connecter

ou
Créer un compte

ou
Agrandir
Les Mains dans le Cambouis
Bidouille & Développement Informatique

Le pub des programmeurs

  • 1 927 réponses
  • 117 participants
  • 123 796 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
521

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.
522

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.
523

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
524

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).
525

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