• [^] # Re: Le langage du futur ?

    Posté par . En réponse au journal Le langage du futur ?. Évalué à 2.

    Ne le prend surtout pas mal, mais plus je te lis, plus je trouve que ton expérience en la matière est très limitée.

    SU-PER. Tu prends exemple sur le langage C++ qui comme tout le monde le sait n'est pas un langage 100% objet et qui permet de faire tout et n'importe quoi (grâce -- ou à cause -- des pointeurs). Tu prends un environnement d'exécution qui intègre des notions objets comme .NET et alors là tu peux te toucher pour espérer accéder à une fonction private depuis un objet externe en C#, VB.NET ou Java.

    C'était un EXEMPLE ! L'exemple bête de ce qu'il ne faut pas faire justement, mais qui met bien en évidence le fait que ta « protection » n'en est pas une. Je ne pensais vraiment pas être obligé de te l'expliquer.

    Ensuite et surtout: Encore une fois, il s'agit de la force du typage de ton langage ! Cela n'a rien à voir avec le fait qu'il soit orienté objet ou pas.

    Tiens, de la même façon, et puisque l'on parle du C++, tu as l'air de penser que l'une des grandes forces de « l'orienté objet » réside dans la répartition public/private. Soit. En C++, il existe une troisième catégorie: protected. Révolution ou hérésie ? Cela te poserait-il un problème si les différentes catégories de données membres se multipliaient ?

    Tu remarqueras aussi qu'une autre notion de la programmation objet, l'héritage (et tout ce qui touche la réutilisation) est possible quelque soit le langage sur la plate-forme .NET. Tout ça parcque les langages ont une seule contrainte : implémenter certaines notions objet.

    Ok, vu tes lectures, je commence à comprendre. Il n'y a pas que du mauvais chez Microsoft, mais si c'est là ta référence de base pour assimiler les autres langages, tu risques d'avoir une vision quelque peu déformée du fonctionnement d'un ordinateur.

    Evidemment, si tu programme en natif, tout code sera au final traduit en code machine et vu que la machine autorise à peu près tout et n'importe quoi (à l'intérieur d'un même programme j'entend, l'OS est là pour limiter les débordement éventuels). Mais l'informatique a évoluer. Et certain ont su tirer partie justement de la sémantique de ces nouveaux langages dits "orientés objets" pour améliorer la sécurité ou tout simplement l'interopérabilité et l'intégration en implémentant une machine virtuelle qui utilise ces informations.

    1) Je te file une VCS2600 avec une cartouche vierge de 4Ko et je te demande de réécrire Space Invader et de le faire tenir dans le médium fourni. Si tu ne peut pas le faire alors que tes prédécesseurs l'ont fait vingt ans avant toi et sans langage objet, c'est que ce n'est pas une évolution.

    2) Si tu utilises une JVM comme garde-fou parce que tu estimes que ton programme ne pourra fonctionner de façon sûre que dans ce genre d'environnement, c'est toi qu'il faut remettre en cause. Pas ta machine. Comment feras-tu le jour où tu devras à ton tour écrire une machine virtuelle ?

    3) Parlons-en de la portabilité: Un programme écrit dans un langage de haut-niveau fonctionnera sur toutes les machines ... sur lesquelles la librairie standard et la machine virtuelle du langage auront été portées ! Ce qui limite déjà les différents modèles. Ensuite, il fonctionneront exactement de la même façon: A quoi cela sert-il d'avoir des machines différentes alors ? Une machine peut très bien être en avance sur ses concurrentes parce qu'elle apporte une killer-feature, comme on dit. Le programmeur Java/.Net est-il condamné à ne jamais en profiter ? Enfin, et là c'est le concept même de .Net que je remet en cause: A quoi diable cela sert-il de créer une machine virtuelle qui ne tourne que sur un seul système d'exploitation (Windows) et 99,99% du temps sur un PC ? Autant revenir directement à l'assembleur s'il y a si peu de variété.

    Juste pour le fun, j'aimerai savoir avec quelle simplicité tu vas réussir à instancier un pseudo-objet en C de GTK en Java, sans bien sûr refaire une surcouche qui te demanderas des heures et la nécessaire compréhension du mécanisme pseudo-objet de GTK...

    Pourquoi « pseudo » ?
    - Sous GTK+ en C, c'est:
    window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    - En Java, ce sera
    window1 = new gtk_window (GTK_WINDOW_TOPLEVEL);
    L'un sera un handler, l'autre une référence, ce qui pour un langage comme le Java revient exactement au même compte-tenu du fait que l'adresse mémoire effective est gérée par la seule JVM, au dessous encore du niveau du bytecode.

    Pour ce qui est des optimisations je ne suis pas du tout d'accord avec toi. Pour moi ce n'est pas au programmeur de connaître les spécificités de la machine pour laquelle il code, sauf peut-être si celui-ci code en assembleur. Le programmeur doit pouvoir utiliser le langage pour exprimer ses idées et algorithme, c'est au compilateur d'optimiser pour une machine spécifique.

    Non, non, non et non. D'abord, c'est à se demander si tu as effectivement jamais écrit une ligne d'assembleur. Que le programmeur choisisse le langage le mieux adapté à son projet est une évidence (et c'est vrai dans les deux sens: Je programme un microcontrôleur en assembleur et une librairie graphique en C++), tout comme un compilateur se doit de générer le code le plus efficace possible. PAR CONTRE: connaître le fonctionnement d'un ordinateur, c'est précisément le métier du programmeur ! Tu ne peux pas faire de code propre si tu n'as aucune idée de la manière dont ta machine va exécuter tes ordres, de même que ton compilateur ne pourra jamais sérieusement optimiser un code plombé de naissance.

    Et c'est là qu'un langage objet s'avère plus utile que le langage C par exemple : le langage purement objet introduit des informations supplémentaires au compilateur qui peut effectuer plus de vérifications, d 'optimisation.

    Cela n'a aucun sens.
    En quoi le fait que ton langage soit « objet » apporte des informations supplémentaires au compilateur ? Au contraire, la plupart des langages objet, C++ en tête d'ailleurs, ont la fâcheuse réputation de consommer plus de mémoire pour un même résultat.


    Pour ce qui est des optimisations par le programmeur, celles-ci ne doivent s'effectuer qu'au niveau de l'algorithme en diminuant la complexité de celui-ci si nécessaire. Bref, modifier son idée. Mais en aucun cas il ne doit bidouiller et utiliser des "raccourcis" pour que celà soit profitable à l'utilisateur. Tout d'abord c'est une perte de temps vu le gain final, et ensuite la plupart des machines actuelles ont suffisament de puissance pour faire tourner la plupart des algorithmes utilisés par le commun des programmeurs.

    o/* PAF !
    Encore une idée reçue qui a la dent dure et c'est probablement ce qui nous oppose le plus. La puissance d'une machine doit profiter à son utilisateur et pas servir la paresse du programmeur (paresse qui n'est, chez ce programmeur, une qualité que lorsqu'elle le pousse à utiliser sa machine pour accélérer son travail, mais pas au dépit de l'utilisateur). D'abord, tu oublies que contrairement aux machines familliales des années 80, les ordinateurs actuels sont multitâches, et qu'il suffit de faire tourner quatre ou cinq programmes écrits par des gens qui ont la même mentalité que toi pour mettre une machine en carafe.

    Lorsqu'un codeur écrit avec les pieds un programme utilisant un langage de trop haut niveau (spécialement lorsqu'il est interprété, ou sous forme de bytecode), 80% de la puissance de la machine est consommée dans les conversions successives entre ces couches, dans un sens puis dans l'autre, et cette puissance ne profite:
    - ni au programmeur, qui ne se soucie plus de son programme une fois livré,
    - ni à l'utilisateur qui passe ses journées entières à attendre son logiciel.

    D'autre part, optimiser un programme ne se limite pas à « simplifier l'algorithme utilisé », mais aussi à parler le langage de ta machine. Tu oublies qu'un compilateur est avant tout un traducteur. C'est comme si tu me disais qu'il est inutile d'apprendre une langue étrangère parce que les traducteurs logiciels le font pour nous. As-tu déjà jaugé la qualité des traductions de Babelfish ? Il m'est arrivé de multiplier la taille d'une ligne de C par 5 pour qu'elle soit au final compilée de la meilleure manière possible.

    C'est bien la mentalité Microsoft, ça. On sort un produit tordu à la base, et on applique des patches successifs plutôt que de revoir le concept.

    Enfin, le « gain final » dont tu parles est à mesurer avec la plus grande circonspection. Il suffit que tu intègres le code concerné au sein d'une boucle pour que le gain en question ne soit plus une durée fixe mais un pourcentage du temps consommé. Ainsi, si tu écris ton programme en assembleur, et que tu l'optimises pour passer de 10 cycles machines par boucle à 5 cycles (soit 2ns de gain sur une machine moyenne), tu doubles la vitesse de ton programme. Un travail réalisé initialement en deux mois le sera désormais en un seul.

    Après il y a deux niveaux de programmation : il y a la programmation système ou un langage bas-niveau comme le C est utilisé, par soucis d'optimisation. Mais c'est limité aux programmeurs expérimentés qui maîtrise les pointeurs à merveille (le pointeur c'est comme un scalpel, dans des mains expertes il fait des merveilles, mais donner les au programmeur de base...)

    Personnellement, je n'ai jamais eu de problème à manipuler un pointeur. Peut-être parce qu'à la base je savais ce qu'est une adresse mémoire. Tout le problème est là: On n'écrit pas un programme (du moins pas professionnellement) pour adapter une équation tout comme on utiliserait Mathlab pour résoudre un problème de maths, de la même façon que, si puissant qu'il soit, mathlab ne te sera d'aucune utilité si à la base tu es nul en maths ...

    Et puis surtout, la disponibilité des données est un problème qui se retrouve sur tous les langages:
    - En C/C++ le programmeur se tape des segfaults;
    - En Java, le programmeur se tape des NullPointerException.
    « Ah bon ? Mais Monsieur, je croyais qu'y'avait pas d'pointeurs en Java ... »

    C'est quand même inouï. L'informatique est quand même le seul métier où non seulement « le néophite complet se sent en mesure de vous apprendre votre métier dans le quart d'heure qui suit le montage de sa bécane », mais c'est également le seul où on l'on trouve des gens qui aspirent à devenir professionnels sans vouloir apprendre le métier. Un programmeur qui ne sait pas comment fonctionne un microprocesseur - et qui en plus le revendique - est pour moi un paradoxe.

    Si on veut utiliser toute la sémantique qu'introduit les notions objets et qu'on veut notamment appuyer les notions l'interopérabilité ou de sécurité, on prendra un vrai langage objet, et si possible une machine (virtuelle) qui exploite justement ces notions...

    Là encore, et pour la dernière fois, machine virtuelle et orienté objet sont deux choses distinctes, même si on les trouve souvent livrés ensemble. D'ailleurs le concept de machine virtuelle n'est pas nouveau, il est utilisé depuis les années 70 mais pas en microinformatique. Plutôt sur gros systèmes, tels que ceux que l'on trouve dans les aéroports.

    Ton post me laisse perplexe, pour le moins. J'ai l'impression que tu confonds plusieurs notions, notament typage, sécurité, et approche objet, de la même façon que Jayce the Crazychild confondait mode texte et langage interprété (là, 'faut quand même le faire, soi dit en passant) ou, plus sérieusement, comme beaucoup de monde assimilait programmation 32 bits et mode protégé lors des débuts de Win32.