tout est dans le tout

samok
Modifié (8 Jul) dans Informatique théorique
Dans les ressources qui discourent sur le langage python, il y a souvent ce bout de phrase : "... car en python, tout est objet ...".

J'ai des notions de programmation orientée objet, et,  je me suis remis des largesses induites par la philosophie de ce langage.

Selon moi, cette phrase repose sur un malentendu entre ce qu'est une classe et ce qu'est un objet instancié de la classe.

J'aimerais bien avoir votre avis accompagné d'explication.


Réponses

  • PetitLutinMalicieux
    Modifié (8 Jul)
    Bonjour
    Je suis d'accord avec toi.
    • "En java, tout est objet". Jusqu'au jour où on tombe sur un type natif.
    • "Sous Unix, tout est fichier". Ben voyons. Alors d'où viennent les différences entre lire un fichier local et lire un fichier distant ?
    Ces phrases sont des déclarations d'intentions. Il ne faut pas trop creuser.

  • Merci pour ta réponse PetitLutinMalicieux.
  • Salut,
    Dans certains langages, c'est faux, mais en Python, il se trouve juste qu'une classe est également un objet. Par exemple, en testant type(int), on obtient la classe type. De même, en testant type(type), on obtient la classe type. Et si on définit une fonction f, type(f) devrait nous donner la classe function (j'ai pas d'interpréteur sous la main pour tester).
    En fait, il y a également une classe object et Python fait sa tambouille interne pour que tout fonctionne avec certainement un petit peu de circularité pour que toutes les classes soient des class et que tous les objets soient des object. Je n'ai jamais regardé en détail la hiérarchie de classe de Python, mais je pense qu'elle est assez similaire à celle de Ruby.
  • samok
    Modifié (11 Jul)
    Merci pour votre réponse Karnaj,

    ce serait donc vrai mais vous ne savez pas comment c'est possible réalisé.

  • En soi, c'est assez simple à faire, c'est tout simplement codé en dur. D'ailleurs, il s'agit de détail d'implémentation, et CPython ne l'implémente pas forcément de la même manière que d'autres implémentations. Mais globalement, les choses qu'il faudra spécifier à la main, c'est la méthode qui donne la classe et la superclasse pour object et type. En fait, si on décide d'écrire un compilateur ou un interpréteur pour Python, ce cas sera écrit dans le langage utilisé (c'est le cas de base qui permet de difre ce qu'est une classe et un objet, ce que renvoient les méthodes pour obtenir la classe et la superclasse de ces objets, etc.). Ce bout de code sera alors quasiment suffisant pour permettre d'écrire le reste de l'implémentation dans le langage « interne », en l'occurrence Python (en tout cas en ce qui concerne les « choix syntaxiques » du langage », mais pas pour ce qui est gestion de la mémoire, des appels de fonctions, etc.).
  • Lirone93
    Modifié (12 Jul)
    En javascript on est aussi dans cette esprit.
    Par exemple, pour donner l'idée : on pourrait prendre une classe javascript et la manipuler comme si c'était un objet, disons, en lui rajoutant une fonction, par exemple.
    Et d'ailleurs, le javascript n'est pas un langage purement orienté objet mais aussi, un langage orienté prototype. 
    « je sais que la question de départ est bizarre de la part d'un professeur certifié ».
  • Si on regarde la définition d'Alan Kay, Javascript se rapproche plus d'un langage orienté objet que C++ ou Java. J'aime beaucoup les langages comme Smalltalk ou Ruby (qui s'inspire d'ailleurs de Smalltalk) sur ce point. Malheureusement, on ne trouve pas beaucoup de cours qui insistent bien sur la philosophie de l'orienté objet telle qu'imaginée au départ.
  • Lirone93
    Modifié (12 Jul)
    Ce n'est pas de l'ordre de l'opinion, javascript est un langage orienté objet et orienté prototype.
    Et selon moi, on doit à l'aspect prototype, cette flexibilité qui fait sa particularité.
    Si on bien sûr que javascript est orienté objet, à part entière et de manière aussi complète que des langages purement orientés objet comme java ou autre.
    Mais quiconque est rentré dans le cœur de javascript, sait que ce langage ne se peut se réduire à cela. C'est tellement différent du paradigme « objet » duquel tout développeur, ayant un peu pratiqué, est revenu. 
    D'ailleurs, à l'époque, j'avais essayé de comprendre le principe de la programmation orienté prototype mais j'avoue que je n'avais pas compris grand chose.

    « je sais que la question de départ est bizarre de la part d'un professeur certifié ».
  • Il y a des gens qui séparent les langages class-based orienté objet et ceux protoype-based orienté objet, mais classent les deux dans les langages orienté objet. Après, peut-être qu'il faudrait plutôt dire « langage qui permet de faire de l'orienté objet », mais c'est un peu long... Et en plus, la plupart des langages permettent à peu près de faire cela en étant un peu masochiste. Donc on a plutôt envie de dire des langages conçus pour un paradigme particulier sont des langages de ce paradigme.
    Un des gros problèmes selon moi est qu'on retrouve très rarement de « vraies » définitions de ce qu'est l'orienté objet. Généralement on retrouve des choses comme « elle consiste à faire interagir des objets pour faciliter l'écriture et la maintenance de programmes ». On peut décider que ce n'est pas si important que ça d'avoir une vraie définition claire, sauf pour les gens qui travaillent sur les théories de ces concepts (très utile par exemple pour les personnes qui travaillent sur des transformations ou des traductions automatiques de programmes) ou qui créent des langages. Par contre, c'est important de pouvoir donner les principes qui vont avec l'orienté objet et les différents choix de conception que peuvent faire un langage pour aider au respect de ces principes (par exemple, même si ce n'est pas forcément relié à l'orienté objet, le choix d'avoir des fermetures ou des fonctions de première classe).
  • Lirone93
    Modifié (12 Jul)
    Karnaj a dit :
    Donc on a plutôt envie de dire des langages conçus pour un paradigme particulier sont des langages de ce paradigme.

    Çe devrait être une lapalissade. 
    Mais vous semblez dire que l'intérêt du javascript c'est qu'il permet de faire de l'objet. Ce n'est pas une finalité en soi, juste une fonction utile du langage parmi d'autres que permet le langage.C'est mon impression, en tout cas. 
    « je sais que la question de départ est bizarre de la part d'un professeur certifié ».
  • Une lapalissade pour les personnes prévenues, mais pas pour tout le monde malheureusement. 
    Je ne dis pas du tout que l'intérêt de Javascript est qu'il permet de faire de l'objet. C'est effectivement juste une fonctionnalité, parfois utile, et dont on peut tout à fait se passer, j'ai la même impression et elle est partagée par toutes les autres personnes du domaine que je côtoie. En soi, si on devait y voir un intérêt, ce serait plus sa flexibilité (et c'est quelqu'un qui trouve que c'est un langage très mal conçu qui le dit). Et en pratique, l'intérêt d'un langage tient aussi dans l'écosystème qui vient avec et qui permet de développer plus ou moins facilement. C'est ce qui fait par exemple que le C est encore largement utilisé dans certaines industries. 
  • Lirone93
    Modifié (12 Jul)
    Javascript est un langage difficile à maîtriser parfaitement, mais de là à dire que c'est un langage mal conçu... 
    Cette opinion me semble surtout historique et contextuelle sur la manière dont il a été appris par la plupart des gens (sur le tard, et dans le rush) mais n'est pas très fondée.
    Ces développeurs l'ont utilisé et l'utilisent encore comme un langage objet en imitant ce qu'on fait avec d'autres langages comme JAVA qui ont connu en même temps à peu près (Javascript et sorti après JAVA...) une grande popularité, pas forcément vraiment techniquement justifiée.
    Alors que ce n'est certainement pas par là qu'il aurait faut commencer, mais par les bases et le prototypage donc, je pense. 

    Et surtout JAVA et les autres langages qui ont le vent en poupe ne se sont pas tirés une balle dans le pied comme Javascript qui avait voulu surfer sur la vague de JAVA (hum... jolie erreur marketing pour javascript ) et qui finalement a été pris en grippe par tout le monde pour sa trop grande permissivité considérée et relayé ensuite par les « on dit » comme un défaut conceptuel par des informaticiens surtout des débutants qui ne savaient pas l'utiliser correctement. 

    En effet, à cause des besoins de développeurs supérieur à la demande sur le marché du travail, il a fallu aller chercher des thésards en literrature (j'exagère un peu...), et d'autre part, le métier de développeur ( « internet ») était en grande partie un nouveau métier,  tout cela, je parle à l'époque, dans les années 1997/2000.

    Donc si on arrive ainsi à se mettre toutes ses œillères, oui, le non typage des variables, par exemple, donne l'impression d'un langage bâclé (peu stable et sujet aux bugs) par rapport à JAVA mais à mon avis, pour voir tout ce qu'on peut faire avec et sa syntaxe peu verbale, ce n'est pas justifié... il aurait surtout fallu qu'on forme les développeurs avant de les embaucher., mais bon. 

    Cependant aujourd'hui le Javascript a connu un vrai succès ses derniers temps quand il est passé en utilisation côté serveur pour des tâches nécessitant de  « vrais codeurs  » car sensibles.
    Preuve que ce langage n'est finalement pas si mauvais...

    PS : c'est peut-être un débat dépassé aujourd'hui avec l'IA.
    « je sais que la question de départ est bizarre de la part d'un professeur certifié ».
  • Je ne suis pas convaincu. Après, le langage a été conçu en quelques jours, sous pression d'attente de résultats, pour une tâche précise qu'il remplit plutôt bien ; ça explique des choses. 
    Sinon il n'y a pas forcément de lien entre ce qu'on peut faire avec le langage et le fait de savoir s'il est bien conçu ou pas, et Javascript est faiblement et dynamiquement typé. Un outil bien conçu devrait permettre de faire relativement facilement les bonnes choses, et dans une certaine mesure, de faire difficilement les mauvaises choses, en plus d'éviter les situations ambigües, où le résultat obtenu n'est pas « raisonnable ». C'est par exemple pour ça que plus on avance, plus des choses comme les annotations de types, et encore plus fort, le typage fort, gagnent en popularité. On voit ça également avec tous les outils sémantiques pour écrire du code concurrent de manière plus sûre.
    Pour le coup, je ne suis pas fan de Java non plus même si le langage a su plutôt bien évoluer. D'ailleurs Javascript a également su évoluer même s'il traîne encore une grande partie de son histoire.
  • Lirone93
    Modifié (13 Jul)
    Non javascript est très utilisé aujourd'hui encore et côté SERVEUR et pour des choses très complexes, comme je l'ai écrit dans mon message précédent édité. Mais pas par les mêmes développeurs, ni pour la même chose...
    Voir par exemple ici : NPM
    « je sais que la question de départ est bizarre de la part d'un professeur certifié ».
  • Je suis globalement d'accord et je ne vois pas en quoi ça contredit mon message. Javascript est encore largement utilisé et il a de beaux jours devant lui, mais ça n'empêche pas que la tendance actuelle soit de rajouter des garanties aux langages/se tourner vers des langages avec de meilleures garanties. Qu'un langage soit beaucoup utilisé ne veut pas dire qu'il est bien conçu, mais plutôt qu'il est pratique pour ce qu'on lui demande de faire et qu'il répond à une grande demande. Par ailleurs, il suffit de voir comment le langage a tenté d'évoluer pour rajouter des fonctionnalités qui aident à mieux développer (modules, mots-clés let et const, "use strict", etc.). Son évolution s'est d'ailleurs très bien passée, et je reconnais bien que le langage répond aux attentes, et je suis très content de ce qu'il me permet de faire, même sur des gros projets non personnels.
    Ça fait déjà plusieurs années que Javascript est utilisé côté serveur, je n'aurais pas dit « ces derniers temps ». De même, je ne dirais pas que Java a le vent en poupe, le langage est plutôt sur la pente descendante, même s'il reste lui aussi beaucoup utilisé (et puis faut bien maintenir tous les projets écrits en Java).
    Sinon, je me souviens d'une thèse intéressante qui traitait de la sémantique de Javascript et qui proposait des outils d'interprétation abstraite et d'analyse statique pour le langage.
  • Lirone93
    Modifié (14 Jul)

    Karnaj
     a dit :
    ça n'empêche pas que la tendance actuelle soit de rajouter des garanties aux langages/se tourner vers des langages avec de meilleures garanties
    Oui mais il y a aussi beaucoup de nouveaux utilisateurs de javascript c'est à dire de développeurs utilisant de plus en plus  l'environnement et bibliothèques javascript lors de leur développement en d'autres langages.
    C'est une niche ? Je pense qu'il y a plus de potentiel peut-être que tu ne le penses.
    Qu'un langage soit beaucoup utilisé ne veut pas dire qu'il est bien conçu, mais plutôt qu'il est pratique pour ce qu'on lui demande de faire  
    Et donc qu'il est bien conçu ;). Je vois un langage surtout comme une  « proposition » ou  « une création », dont on ne connaît donc pas toujours l'aventure et le futur à l'avance.
    Alors que tu le vois plus dans une perspective pragmatique en prenant en compte un ensemble large de paramètres. Nous ne parlons en fait pas de la même chose, je pense. 
    « je sais que la question de départ est bizarre de la part d'un professeur certifié ».
  • Vous vous êtes compris Lirone93 et Karnaj ? 
    (Je me sens exclu !)
  • Lirone93
    Modifié (14 Jul)
    Pas sûr, mais je ne veux exclure personne ;)
    « je sais que la question de départ est bizarre de la part d'un professeur certifié ».
  • On est à peu près d'accord. On pinaille juste sur quelques détails histoire d'avoir une discussion. ;)
    Mais c'est vrai qu'on s'éloigne du sujet d'origine. Je crois qu'on y a répondu, mais il y a peut-être d'autres points à aborder ?
  • résumons par : les objets, c'est classe

    :smile:
  • Lirone93
    Modifié (15 Jul)
    Perso, j'ai surtout mieux compris ce qu'on entendait par le  « orienté prototype » (du langage javascript) . C'est tout. 
    « je sais que la question de départ est bizarre de la part d'un professeur certifié ».
Connectez-vous ou Inscrivez-vous pour répondre.