Se lancer la programmation multi-plateforme ?

Répondre
Partager Rechercher
Coucou le labo !

Durant mes trois années d'étude en école d'ingénieur (en sciences physiques), j'ai eu l'occasion d'apprendre les bases du C, je me suis amusé à faire pleins de petits programmes sympas en Objectif-C pour MacOs, et j'ai bouffé plein de Matlab.

Au boulot (stage), Matlab est super pratique dans la mesure où je peux répondre à un besoin spécifique très rapidement (généralement sur mes poses déjeuner puisque c'est surtout des collègues qui me demandent des petits trucs pour leur simplifier la vie). Cela va de la manipulation/analyse d'images, automatisation de calculs un peu longs et compliqués etc.

Problème :
Matlab ça coûte la peau des fesses (pour l'ordinateur qui reçoit Matlab), et il faut installer les librairies sur l'ordinateur qui reçoit l'exécutable (normal vu que Matlab c'est un langage interprété, et pas besoin de licence pour ces ordinateurs). De plus, même si des efforts sont fait de ce coté, "ce n'est pas très multi-plateforme", et pas très adapté niveau gestion mémoire/vitesse de calculs.

Objectif-C et Cocoa, je peux laisser tomber (dommage, c'est quand même super pratique et super bien foutu, et j'en fais autant sous XCode que sous Matlab, presque aussi vite) car ce n'est pas multi-plateforme, et qu'aucune entreprise que j'ai rencontré jusqu'ici utilisait des ordinateurs Apple.

Alors le C c'est une bonne solution, surtout avec des bibliothèques de gestion d'image (ImageMagick), de calculs (Lapack), analyse/traitement du signal/image, mais il n'y a pas de possibilité de faire un programme avec de simples fenêtres.

Je suis allé voir du coté de wxWidgets et de Qt. A priori, les réponses à mon besoin se trouve là, mais j'ai plusieurs questions :
- Avantages/inconvénients des deux frameworks/bibliothèques ?
- Apparement, le C ils ne connaissent pas (?). Sachant que je ne suis pas contre d'apprendre un nouveau langage, vous en avez un à me conseiller (avec bonne gestion mémoire/rapidité de calculs). Le C++ j'imagine ?

Je rentre en thèse bientôt, et je ne suis pas sur de pouvoir bénéficier d'une licence Matlab. Je serai sûrement amené à faire certaines simulations numériques (FDTD par exemple, mais sûrement d'autres) et quitte à coder en C/C++ avec une librairie graphique (sous Linux, je précise), je me dirai qu'il pourrait être intéressant (pour mon CV et pour moi) d'apprendre à le faire en étant multi-plateforme. En effet, je ne crois pas qu'on utilise Linux en entreprise

L'idéal serait de se rapprocher de Cocoa pour construire l'interface, mais c'est sûrement trop demander.

Merci
wxWidgets est moins maintenu que Qt il me semble depuis quelques temps déjà, et surtout, Qt ce n'est pas QUE une lib de widgets, c'est aussi un framework plutot complet (réseau, bdd, opengl, xml, extension du c++ (signal/slot, introspection, système de meta-objet, pointeurs intelligents, conteneurs etc), un peu à la Boost.

J'ai pas encorebeaucoup de recul dessus, je commence à l'utiliser professionnellement depuis quelques mois, mais franchement ça roxxe bien du poney, j'adore carrément la façon dont c'est architecturé.*

Bon à la base c'est du c++, mais je sais qu'il y a des bindings pour utiliser python (voir pyQt). Donc les perfs sont là, mais pour l'aspect calcul scientifique par rapport à matlab... pour pas réinventer la roue faudra chercher des library (genre faire une fft, utiliser des algos classiques de traitement image etc..). Là ça dépend du champs de tes applications.

* par contre je ne sais pas si ça sera très accessible à un débutant en c++ et encore pire en POO (je sais pas si c'est ton cas), qui risque fort de faire des trucs sans les comprendre.

edit2: en général il n'y pas de soucis à utiliser une lib c dans un programme c++
GNU Octave, le Matlab opensource (sinon R pour ce qui ets plus axé stats).

Si tu veux faire du multiplateforme sans te faire trop chier, vaut mieux voir coté java / python etc... Le C/C++ t'as toujours des spécificités selon l'OS ou le compilo

Par contre pour le traitement de l'image, le c/c++ c'ets quand même plus sympa, en java ca suce un peu, même si souvent t'as les bindings C++ vers java / pyhton etc.. (ca nécessite une lib par os, mais c'est pas la mort)

Sinon on utilise linux en entreprise, mais une entreprise qui demande a un ingé en physique de faire une UI.... euuuh wtf


Ceci dit je ne pense pas qu'une entreprise utilisera Matlab pour faire du realtime (ou bien tout codé en C derriere bien sur). T'as une différence de perfs assez flagrante entre le matlab et le C++ (meme si ton code c++ fait 10 fois plus de lignes que le matlab).

De toute sur un CV ou t'as 15 langages de programation, tu de dis que yen a pas plus de 3-4 qui sont vraiment maitrisés, donc faire un truc pour faire beau sur un CV c'est pas toujours la bonne solution, et ca peut se retourner contre toi si on te pose une question un peu pointue !
Utilise du Python c'est très élaboré pour le calcul scientifique et c'est multiplatforme, sinon Linux c'est l'OS le plus utilisé en entreprise ( sur les serveurs en tout cas )
Citation :
* par contre je ne sais pas si ça sera très accessible à un débutant en c++ et encore pire en POO (je sais pas si c'est ton cas), qui risque fort de faire des trucs sans les comprendre.
Ben, Objectif-C/Cocoa c'est du POO. Avec des liens vers les objets pour coder le moins possible.

Citation :
Donc les perfs sont là, mais pour l'aspect calcul scientifique par rapport à matlab... pour pas réinventer la roue faudra chercher des library (genre faire une fft, utiliser des algos classiques de traitement image etc..). Là ça dépend du champs de tes applications.
Je n'avais pas l'intention de réinventer la roue. Entre les librairies données par les constructeurs (caméras, oscilloscope, etc) Lapack, et ImageMagick, y'a de quoi faire sans réinventer la roue.

Citation :
Sinon il y a aussi GTK+.
Tiens ? il me semblait qu'il fallait installer les librairies ? Y'a longtemps j'avais installé GTK+ sur Windows pour Gimp je crois.

Citation :
GNU Octave
J'y ai pensé, bien évidemment, mais il y a toujours le problème mémoire/rapidité/installation de l'interpréteur sur la machine.

Citation :
i tu veux faire du multiplateforme sans te faire trop chier, vaut mieux voir coté java / python etc... Le C/C++ t'as toujours des spécificités selon l'OS ou le compilo
Apparemment, Java n'est pas vraiment la meilleure idée à cause d'une machine virtuelle lourde comme un taureau. Python me semblait effectivement adapté pour moi, mais je ne vois pas comment afficher les résultats.

En fait, pour Python comme pour le C, il manque un moyen de mettre à disposition des boutons/labels de sélection, et un retour direct et graphique sur les résultats.
Un exemple en pièce jointe d'un "exécutable" Matlab que j'ai fait il y a un an. C'est user-friendly, il suffit d'appuyer sur les boutons 1 à 1, et le résultat s'affiche et est exporté au format excel.

Je pourrai parfaitement faire la même chose en ligne de commande C (ou Python, si je l'apprend) et donc qui serait multi-plateforme, mais il n'y a pas de retour direct sur les résultats pour relancer un calcul avec d'autres paramètres, et il faut gérer l'erreur si le dossier tapé par l'utilisateur n'existe pas.

En résumé, il faudrait une "couche graphique utilisateur" multi-plateforme pour des fonctions derrière codées en C (ou Python). J'espère que je me fais comprendre.

Au passage, j'entend souvent dire que Python, c'est super cool pour le calculs scientifiques, y'a-t-il des arguments objectifs ?
Miniatures attachées
Cliquez sur l'image pour la voir en taille réelle

Nom : 45_cosde.png
Taille : 823x558
Poids : 21,3 Ko
ID : 120900  
Citation :
Publié par Adau
Au passage, j'entend souvent dire que Python, c'est super cool pour le calculs scientifiques, y'a-t-il des arguments objectifs ?
C'est utilisé par la Nasa & Google pour le calcul scientifique donc j'imagine que oui
Sinon pour le GUI tu peux utiliser WxPython ou GTK+, qui sont tous les deux multi-platformes!

http://python.org/about/success/#scientific
http://www.python.org/about/success/usa/
Citation :
Publié par Eno
Sinon pour le GUI tu peux utiliser WxPython ou GTK+, qui sont tous les deux multi-platformes!
Tu confirmes que GTK+ ne nécessite pas d'installation sur une machine pour y lancer un exécutable ? Il me semble que si, et qu'il faut d'ailleurs configurer son apparence. Enfin j'espère ne pas dire de bêtises.
Sinon, WxWidgets semble effectivement peu maintenu par rapport à Qt et GTK+, et Qt semble être une librairie monstrueuse.

J'aimerai me pencher sur GTK+ si l'exécutable créé derrière est totalement autonome.

Sinon, au passage, en non multi-plateforme (Linux uniquement) avec du Python, vous conseillez quoi comme librairie graphique ?
Edit // question bête:
http://fr.wikipedia.org/wiki/Python_...ces_graphiques

Edit 2 //
Ce bouquin là a l'air très apprécié et traite des interfaces graphiques :
http://www.eyrolles.com/Informatique...-9782212127089
Je pense que c'est un bon début avant de se pencher sur l'aspect multi-plateforme.
Ha non ben pour le GUI en dehors des trucs MFC de Microsoft là tu aura toujours besoins de librairies, mais bon tu peu faire ça en embeded dans ton programme j'imagine, j'ai jamais fait de GUI pour Windows
Quelle genre de lib graphique tu veux?
C'est ça, j'aimerai bien que ça soit dans l'exécutable.
Pour la lib graphique, un truc qui peut faire comme la pièce jointe, multi-plateformes, disons boutons + affichage d'images/graphes.

Sinon, vous pouvez aussi dire que je rêve de pouvoir faire du multi-plateforme sans me prendre la tête. Je comprendrai.
Je pensais que c'était bien plus facile que ça.
Tu peux aussi apprendre Fortran. Ca t'aidera pas des masses pour tes besoins d'interface graphique, mais vu ce que tu decris ca serait une addition interessante a ton CV.

Pour ce qui est de devoir installer des libs sur la plateforme cible, tu peux toujours link en static (c'est a dire inclure la librairie dans l'executable). Ca te fait un programme qui est gros comme un cheval mort, mais il contient tout ce qu'il doit contenir dedans. Faut ajouter le flag -static dans gcc et (suivant l'architecture) lister les fichiers libtruc.a a la place de faire -ltruc.
Citation :
Publié par Adau
C'est ça, j'aimerai bien que ça soit dans l'exécutable.
Pour la lib graphique, un truc qui peut faire comme la pièce jointe, multi-plateformes, disons boutons + affichage d'images/graphes.

Sinon, vous pouvez aussi dire que je rêve de pouvoir faire du multi-plateforme sans me prendre la tête. Je comprendrai.
Je pensais que c'était bien plus facile que ça.
A moins de compiler en linkage statique, les GUI, pour etre portable, ca doit utiliser une lib.
(tu peux aussi faire de la compilation conditionelle avec le preprocessor en utilisant les macros genre #if defined(WIN32), mais bon...)
Citation :
Publié par Adau
C'est ça, j'aimerai bien que ça soit dans l'exécutable.
Pour la lib graphique, un truc qui peut faire comme la pièce jointe, multi-plateformes, disons boutons + affichage d'images/graphes.

Sinon, vous pouvez aussi dire que je rêve de pouvoir faire du multi-plateforme sans me prendre la tête. Je comprendrai.
Je pensais que c'était bien plus facile que ça.
Pour les graphes, même si ca ne répond pas a tes questions, Graphviz est hautement roxxatif, mais je n'ai jamais tenté de faire tourner ça sous windows (en gros, ca transforme un fichier texte décrivant un graphe en une joulie image).

Pour faire des interfaces graphiques portables, Qt est très pratique, suffit de compiler sur l'OS cible. D'autre part, C++ te permet de réutiliser les librairies C et a des performances décentes. Si tu veut te lancer dans le C++, je t'assure qu'il y a de quoi faire avec Qt, mais je manque d'expérience sur d'autres librairies, je n'ai pas eu de problème pour prendre en main cette lib, mais j'avais déjà l'habitude de Java, ce qui doit aider !
Citation :
Publié par Adau
Au passage, j'entend souvent dire que Python, c'est super cool pour le calculs scientifiques, y'a-t-il des arguments objectifs ?
en vrac:
- c'est libre
- y'a bcp de grosses libs libres bien foutues (numpy, matplotlib dans les très connues)
- ca s'interface bien avec le c/c++/fortran (pas mal de code scientifique dans ces langages et ça peut servir pour les perfs)
- à la base il y a quand même un interpréteur avec une console (à la matlab etc) donc c'est assez sympa pour mettre au point un algo (plutot que de recompiler en boucle).
- la syntaxe est assez sympa (comparée à du c/c++), et ca reste quand même un langage bien structuré POO

Y'a surement d'autres bonnes raisons mais c'est deja pas mal

Pour ce qui est de linker statiquement (si c++ avec qt ou wxwidgets) normalement pas de problème, même si je ne vois pas trop l'interêt. Attention si tu veux distribuer tes applis selon les licenses tu ne peux pas faire n'importe quoi. En python je ne sais pas.

pour Graphviz: ça marche sous windows (jamais utilisé directement mais j'utilise doxygen avec graphviz), par contre ca sert à tracer des graphes au sens mathématique (arbres etc) il me semble? Je pense que l'op parlait de graphiques type tracé de courbes.

J'ai l'impression qu'au final c'est python le plus adapté à tes besoins.
Pour Python, y a les deux librairies Numpy et SciPy qui sont très connues (et qui fournissent de nombreuses fonctions mathématiques et scientifiques). Pour les sorties graphiques tu peux déjà faire beaucoup de choses avec matplotlib.
Enfin pour les interfaces y a PyQT, ou si c'est trop complexe, un des wrapper dessus.

Et pour le cross plateforme y a pas trop de soucis, ces librairies sont disponibles sur les 3 plateformes principales (Windows, MacOS et linux)

Et en plus le Python ça roxe !
Citation :
Publié par SekYo
Pour Python, y a les deux librairies Numpy et SciPy qui sont très connues (et qui fournissent de nombreuses fonctions mathématiques et scientifiques). Pour les sorties graphiques tu peux déjà faire beaucoup de choses avec matplotlib.
Enfin pour les interfaces y a PyQT, ou si c'est trop complexe, un des wrapper dessus.

Et pour le cross plateforme y a pas trop de soucis, ces librairies sont disponibles sur les 3 plateformes principales (Windows, MacOS et linux)

Et en plus le Python ça roxe !
Ton dernier message a fini par mon convaincre.
Pour contre, j'ai un petit problème avec Python, lorsque j'ai lu sa page Wikipédia.

Je comprend rien à cette histoire de typage dynamique. En fait si, j'ai compris ce que c'est et à quoi ça sert, mais en plus de consommer plus de mémoire et de processeur, j'imagine qu'il faut faire super gaffe à chaque ligne de code que l'on tape.
C'est d'autant plus vrai qu'il n'y a aucun message d'erreur à la compilation.

Je trouve pas ça très propre (en tant que scientifique programmeur débutant) par rapport au C, qui demande d'être rigoureux.

J'ai l'impression que le Python, c'est vraiment n'importe quoi niveau typage, casting et compagnie. Je me trompe ?

Au passage, il semblerait que le Python soit pas le plus rapide en calculs scientifiques et simulations. C'est vrai ? Dans la pratique j'imagine que ça ne se joue à rien comparé au C.

Merci beaucoup pour vos messages.

Pour ma culture personnel, comment un programmeur expérimenté s'y prend pour faire une application multi-plateforme (n'ayant pas pour autre cahier des charges que le multi-plateforme) ?

Edit:
J'ai trouvé ce TP de la fac de Strasbourg :
http://dpt-info.u-strasbg.fr/~grosje.../tp_python.pdf

Ca a l'air bien.
Les deux liens présents dans l'introduction on l'air d'être bien touffus aussi
soit tu utilises un langage+lib multi-plateforme , soit tu concois ton code de tel facon qu'il soit portable

exemple en c, tu peux "détecter" sous quel os tu travailles, tu balises avec des ifdef etc..,
evidemment, ca demande de faire 2x le boulot, du coup la plupart se tapent du java, du python, dispo sous unix( donc gnu linux, bsd, macosx,..) , sous windows voir sur les pda et assimilés.

tu peux essayer le .net pour le calcul scientifique, mono "a été mis en place"(comprendre pour pouvoir utiliser le.net sous gnu linux) pour ca sous gnu linux

python a été utilisé pour eve si je ne me trompe, et il n'y a pas que google et la nasa qui l'utilise, le cnrs par exemple (c'est déja beaucoup moins loin de chez nous ^^)

Citation :
J'ai l'impression que le Python, c'est vraiment n'importe quoi niveau typage, casting et compagnie. Je me trompe ?
l'intérêt est de pouvoir "développer plus vite",
l'argument pour la transition vers python,c'est surtout dû au libre, t'as pas à te tracasser à acheter une license
Déjà tous les langages compilés à la volée / interprétés par exemple sont en général multi-plateforme ( c'est un de leur gros avantage )
Sinon il n'y a pas de compilation c'est comme du Perl, tu execute ton code source avec l'interpréteur :
python test.py ( par contre sur Windows tu peux transformer ton .py en .exe mais je n'ai jamais testé )
Il va te dire directement si il y a un problème dans ton code, tu ne peux pas lancer le programme si il y a un problème de variable, de déclaration ect .... Crois c'est beaucoup mieux comme ça que d'utiliser GCC pour recompiler son code à chaque fois.

Au niveau performance le Python est très bon sauf dans un domaine le multi-thread, le gros problème du Python est l'interpréteur Cpython ( qui est celui de base mais il y en a beaucoup d'autres ) qui ne permet pas de faire du vrai multi-thread a cause du GIL :
http://en.wikipedia.org/wiki/Global_Interpreter_Lock Dans la pratique il y a des threads sauf qu'il y a un lock sur chaque thread ce qui veut dire que le processeur ne fait des calculs que sur un thread en même temps.

Pour finir je dirais que c'est très plaisant de coder en Python et très facile à maintenir du fait de la lisibilité du code. Par exemple l'indentation est obligatoire. Sincèrement de mon point de vue c'est un langage beaucoup mieux que le C/C++ pour ce que tu veux faire ( calcul scientifique / multi-plateforme )
Au dessus oui EvE utilise Python pour son core sur le server, ils n'utilisent d'ailleurs pas Cpython mais Stackless Python ( pour palier au GIL )
Citation :
Publié par Adau
[typage dynamique]
Attention, même si c'est dynamique, ça reste un langage typé. C'est à dire que non, tu ne peux pas faire tout et n'importe quoi avec tes variables. A la première définition de ta variable, celle ci va être typée. Tu peux d'ailleurs connaitre le type de n'importe quel objet avec la fonction type(ma_variable). Essaye ensuite de diviser une string par un entier par exemple, il va pas aimer et va te sortir une jolie exception.
Il y a quelques cas de casting automatique, comme en C, mais tu peux aussi caster explicitement le type avec int(), float() etc...

De toutes manières c'est plutôt une bonne habitude de dev que de faire attention à ce que l'on tape et à pas complètement se reposer sur le compilateur pour repérer ses bourdes


Citation :
Au passage, il semblerait que le Python soit pas le plus rapide en calculs scientifiques et simulations. C'est vrai ? Dans la pratique j'imagine que ça ne se joue à rien comparé au C.
De nombreuses librairies C bénéficient de bindings Python. Du coup quand vraiment t'as besoin d'aller vite et que c'est vraiment le langage qui est le facteur limitant, tu passes par les bindings et là le surcoût par rapport à du C pur est vraiment minime. C'est une pratique tellement courante que la librairie standard de Python elle même propose parfois 2 versions du même module, une en Python pure, une utilisant des bindings vers une version C. Comme pour StringIO et cStringIO (lesdites versions "C" sont donc préfixées en général par c justement )

De toutes manières les algo pour des calculs vraiment complexes sont en général tellement complexes qu'ils ont rarement été portés sur de nombreux langages et que tu t'amuses pas à les réécrire toi même. Du coup tu choisis parfois le langage en fonction des implémentations ou des bindings disponibles.


Citation :
Pour ma culture personnel, comment un programmeur expérimenté s'y prend pour faire une application multi-plateforme (n'ayant pas pour autre cahier des charges que le multi-plateforme) ?
Pour tous les langages interprétés (Python, Ruby, JAVA), il faut en général vérifier que l'interpréteur est disponible sur les différentes plates formes (Python étant dispo sur pleins de plate forme ) et surtout après vérifier que les librairies que tu vas éventuellement utiliser (numpy, scipy dans ton cas par exemple) sont installables/compilables sur ta plateforme.

Après y a quelques subtilité dans le codage en lui même. Par exemple quand tu vas coder des chemins de fichiers, comme Windows et Linux n'ont pas le même séparateur de chemin ( \ et / ), au lieu de bêtement concaténer le nom des différents dossiers (type dossier + "/" + sous_dossier + "/" nom_fichier) tu vas utiliser une fonction qui gère ça pour toi (comme os.path.join(dossier, sous_dossier, nom_fichier) qui sous Windows va te renvoyer dossier\sous_dossier\nom_fichier et sous linux dossier/sous_dossier/nom_fichier).


Edit : Pour être complet, le principal défaut de Python reste le packaging. Créer un .exe installable en 2 clicks, qui t'installes ton appli correctement avec toutes les bonnes versions des librairies dont tu as besoin est parfois pénible.
J'ai pensé "Python" à la moitié du premier post, donc je ne peux que confirmer ce que d'autres ont déjà dit.

Que ça soit en thèse ou ailleurs, la plate-forme utilisée dépend fortement de l'équipe d'accueil. Il y a les habitudes de l'équipe, les échanges et l'entraide avec les collègues, et c'est évidemment accentué dans le cas où il y a une librairie spécialisée dans le domaine.

Par exemple je fais de la recherche en robotique et on fait tout en C++ car les travaux sont capitalisés dans une bibliothèque open source sous cette plate-forme. Rien n'empêche de tout faire en Python, qui est aussi très adapté aux sciences, mais les conditions locales font que ça serait réinventer la roue.

Pour Python : dans une optique de recherche le but est de se prendre la tête le moins possible avec la mise en application des travaux. Pour ça Python permet de développer très vite des idées et de les tester, sortir des (beaux) graphes et se concentrer sur la partie physique/math/algo.
Aller farfouiller dans les adresses mémoire des éléments d'un tableau à 3 dimensions qui représente un tenseur de force... c'est plus trop de la recherche en physique.

J'avais participé à une évaluation, dans une boîte de R&D, pour diminuer les coûts des licences Matlab et c'est Python qui avait été retenu comme la meilleure alternative, que ça soit au niveau de la prise en main que de la façon de bosser. Comme sous Matlab on a souvent une console ouverte à côté d'un éditeur de scripts, ce qui permet à la fois d'exécuter le script dans son ensemble mais aussi de tester des petits trucs à la volée. Pour les trucs un peu expérimentaux et qui n'ont pas besoin d'être codés comme un produit à part entière, c'est tout simplement idéal. La console que j'aime bien c'est IPython.

L'aspect vitesse de calcul, les machines actuelles marchent quand même pas trop mal donc avant de penser à la plate-forme qui fait aller plus vite, attends de voir si tu en as besoin.

Enfin pour l'aspect interface utilisateur, je passe par des fichiers texte de config Effectivement un thésard en physique qui fait des UI c'est curieux.

Bref, te prends pas trop le chou là-dessus et attends de voir comment bosse l'équipe d'accueil.
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés