Se connecter
Se connecter

ou
Créer un compte

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

Sujet Le pub des programmeurs

  • 1 925 réponses
  • 117 participants
  • 122 561 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
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