IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langages de programmation Discussion :

[Débat] Que pensez-vous des langages à typage dynamique?


Sujet :

Langages de programmation

  1. #1
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut [Débat] Que pensez-vous des langages à typage dynamique?
    Bonjour
    Je me pose des questions sur les langages à typage dynamique, c'est à dire qui permettent ce genre de chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    a := 123
    a := "Bonjour"
    Les premiers que j'ai rencontrés, c'étaient des langages plutôt pour le web, genre PHP ou JavaScript, et qui pouvaient être destinés à des gens n'appartenant pas à la caste des "vrais" programmeurs. J'avais l'impression que c'était juste un truc pour éviter d'avoir des tas d'erreurs d'exécution inutiles, mais je gardais comme opinion qu'une programmation propre et saine nécessitait un typage fort.
    Très récemment, j'ai découvert le langage python, et bien qu'il soit (puisse être) destiné aux applications web, il ne m'apparaît pas (pas autant que PHP en tout cas) destiné à être un langage "grand public". Et python est un langage à typage dynamique. Du coup, interrogation et doute : Y-a-t-il un avantage conceptuel au typage dynamique, qui m'aurait échappé ? J'aimerais avoir un peu votre avis...
    Merci d'avance !

    PS : si on pouvait éviter les avis personnels sur les langages pour s'en tenir à la question du typage...

  2. #2
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Une idée qui me vient : est-ce que ça aurait un rapport avec le fait que tous ces langages sont à la base destinés à être interprétés ?

  3. #3
    Membre éclairé
    Avatar de richard
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2002
    Messages : 474
    Points : 772
    Points
    772
    Par défaut
    il y a quelques avantages au typage dynamique :

    • Pas besoin de transtypage pour contourner les types (comme en C ou en Pascal), des types simples qui peuvent être plus génériques ( ex: listes ou dictionnaires en Python)

      Rapidité de programmation

      Et surtout souplesse qui permet une évolution du programme aisée (pas besoin de recoder une partie importante du programme quand un type de donnée change, you know what I mean )

    Il faut bien faire la différence entre le typage dynamique qui ne présente que peu de problèmes - notamment en Python puisque tout est objet en Python y compris les types de données (et oui !) - et la déclaration automatique comme dans certains langages ( VB me semble-t-il mais peut-être me tromp-je...). Ca c'est très mauvais ! (à mon avis). Quand un programme déclare de lui-même à l'exécution un type de donnée que le programmeur a "oublié" de déclarer au moment du codage alors là bonjour la maintenance ... Gros Bugs à l'horizon !

    Pour Python, y'en avoir aucun problème. Python y'en a être excellent langage, demande donc à Google
    "Software is getting slower more rapidly than hardware becomes faster." Niklaus Wirth
    https://pharo.org/web
    https://faust.grame.fr/

  4. #4
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Souplesse, rapidité de programmation, certes, mais est-ce que ce n'est pas une source d'erreur, quand tu codes, de ne pas savoir quel est le type de ta variable (ex. tu as oublié, ou elle a été modifiée derrière ton dos) ?
    Si tu la modifies par erreur avec un truc complètement idiot, tu ne t'en rends même pas compte ?

  5. #5
    HRS
    HRS est déconnecté
    Membre confirmé
    Avatar de HRS
    Inscrit en
    Mars 2002
    Messages
    677
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 677
    Points : 638
    Points
    638
    Par défaut
    dans un langage comme TCL, le typage semble dynamique. En fait, toutes
    les données sont des chaînes de caractères. on peut avoir :

    set titi 123
    set titi "bonjour"

    on peut faire des calculs sur titi, dès lors où le contenu de la chaîne
    est numérique au moment ou l'instruction est exécutée. Il y a en
    fait une conversion interne, transparente au programmeur

    bien sûr au détriment de la performance; mais est-ce important
    si cette "lenteur" est non perceptible par l'utilisateur

  6. #6
    Membre éclairé
    Avatar de richard
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2002
    Messages : 474
    Points : 772
    Points
    772
    Par défaut
    tout système a à la fois des avantages et des inconvénients mais il semble juste de dire que les langages à typage fort (exemple Pascal - ISO - et Ada) sont plus pénibles à utiliser que le C ou le C++ qui sont plus permissifs. Si les pointeurs sont utilisés dans les langages compilés c'est souvent pour s'affranchir de la contraintes des types - du moins parfois.

    Quant à la question que tu posais il faudrait trouver un exemple précis parce que là dans le vague et le général : "tout est dans tout et réciproquement" comme disait Pierre Dac...

    Si tu fais attention à tes variables, à priori je ne vois pas où est le problème. Si une fonction modifie une de tes variables, censée être un nombre, en chaîne (string) par ex. ; à mon avis tu t'en apercevras rapidement, ou alors c'est que ça devient grave, grave.

    Si tu déclares tu verras bien si ton calcul sur cette variable est cohérent ou pas, si tu as changé le type en cours de route. De plus, il te suffit d'une notation préfixée du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Int_a= 125
    Str_nom= "toto"
    pour t'y retrouver si tu n'es pas sûr de toi. C'est une discipline à se donner. Beaucoup de langages utilisant des GUI (C++, Pascal Objet Delphi etc.) utilisent une sorte de transtypage pour affecter le type de donnée entré par l'utilisateur (par défaut c'est un string).

    Le typage statique de Java lui donne plus de rapidité - pas énormément non plus mais un peu quand même - mais moins de souplesse que Python, le tout est de savoir ce que tu veux. Il n'existe pas de langage parfait (ça se saurait) mais des choix qui font qu'on peut préférer un langage plutôt qu'un autre, l'idéal étant d'en maîtriser plusieurs si on en a le temps et les possibilités. Refuser à priori un langage parce qu'il utilise le typage dynamique est une attitude qui n'a pas beaucoup de sens. Il faut utiliser le langage et voir s'il correspond aux besoins et aux attentes ou pas.

    Python semble avoir fait largement ses preuves, typage dynamique ou non. Il n'est pas adapté pour tous les projets, mais aucun langage ne l'est.
    "Software is getting slower more rapidly than hardware becomes faster." Niklaus Wirth
    https://pharo.org/web
    https://faust.grame.fr/

  7. #7
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    J'entends bien tout ce que tu me dis, mais il n'empêche : pour tout ce qui est "discipline de programmation", on a beau en avoir, lorsqu'on développe des composants qui doivent être réutilisables par une aute équipe, ou même vendus comme produit en tant que tel, on doit considérer je pense les autres programmeurs comme un client ou un utilisateur, susceptible de ne pas respecter les normes de programmation. Dans ce cas, préfixer un nom de variable ne suffit pas, et ça ne me paraît pas très sain de multiplier les tests de types à chaque fois qu'une variable est susceptible d'avoir été modifiée. Pour moi la solution se situerait plutôt dans une utilisation raisonnée de la protection et de la visibilité des objets. Je ne m'y connais pas encore suffisamment en Python pour être très sûr de moi là-dedans, donc ça m'inquiète un peu, mais j'ai l'impression que la vérité est quelque part par là...
    Mais ne vous méprenez pas sur mes intentions : mon but n'a jamais été de descendre le typage dynamique, j'en fait grand usage... Et effectivement, plus j'utilise Python et plus je comprends l'utilité d'avoir des variables un peu "polymorphes"...
    Bref ça s'éclaircit petit à petit, merci de votre participation !

  8. #8
    Membre éclairé
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Points : 803
    Points
    803
    Par défaut
    Le typage dynamique n'est pas une grande source d'erreur à condition d'avoir des tests automatisés à jour et qui soient exécutés souvent. De plus, souvent les possibilités que ça ouvre en valent souvent la peine. Il y a bien des choses qui sont impossibles (ou du moins, très difficile) dans des langages à typage statiques qui sont triviales dans un langage dynamique.

  9. #9
    Membre éclairé
    Avatar de richard
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2002
    Messages : 474
    Points : 772
    Points
    772
    Par défaut
    Je suis entièrement d'accord avec le message précédent et j'ajoute que le fait d'avoir des tests automatisés à jour decrait être une saine habitude pour tous les projets (y compris les langages à typage statique).

    Le seul vrai inconvénient du typage dynamique - à condition qu'il ne soit pas confondu avec la déclaration automatique de variables (je me répète) - c'est un certain ralentissement de l'interpréteur. Mais sur les architectures actuelles, c'est preque imperceptibles pour les application "triviales". Evidemment si c'est du temps réel, là ...
    "Software is getting slower more rapidly than hardware becomes faster." Niklaus Wirth
    https://pharo.org/web
    https://faust.grame.fr/

  10. #10
    mat.M
    Invité(e)
    Par défaut
    Bonjour ,
    je pense que ce méchanisme est foncièrement et basiquement mauvais.

    Avantage : grande souplesse pour programmer.
    Inconvénients : comme il a été déclaré précedemment , risque très élevé de confusion pour l'utilisation et l'affectation des variables.
    Sans compter une pénalisation des performances en exécution .

    Je vais expliquer pourquoi :
    il faut essayer de comprendre ce qui se passe au niveau du code machine ou assembleur.
    Avec ce genre de facilité , on déclare
    des entiers set a=128
    des réels set a=12111.005558
    des chaînes de caractêres set a="toto"
    Et même des instances de classes.
    A chaque fois en interne , il faut convertir le type de données .
    Donc quelque part dans le programme il y a une procédure en code machine qui est dédiée à cela et qui affecte une valeur à une variable après avoir transformé cette valeur au format adéquat.

    Or lorsqu'on fait cela dans une boucle avec nombre d'itérations élevé, c'est à chaque fois la même procédure de conversion ou transtypage qui est appelée ce qui peut demander du temps selon le type de données.
    D'où diminution des performances du programme ;
    Je ne veux pas relancer un éniéme débat sur VB mais c'est du vécu sur un projet professionnel en VB avec utilisation de variant .

    Mais parfois on est obligé à avoir recours à ce type de méchanisme ; notamment avec des curseurs sur une table de base de donées ( comme les "recordset" avec Microsoft) .
    Par exemple Microsoft a crée le type VARIANT en C++ /COM ou variant en VB.

    et la déclaration automatique comme dans certains langages ( VB me semble-t-il mais peut-être me tromp-je...). Ca c'est très mauvais ! (à mon avis).
    Oui tout à fait d'accord , cf au-dessus

  11. #11
    Membre actif
    Avatar de doof
    Inscrit en
    Août 2003
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 160
    Points : 294
    Points
    294
    Par défaut
    Je suis pas sur que le typage dynamique soit la vrai source de problemes.

    Les risques de confusion interviennent si un language est faiblement typé, dans lequel cas, il ferat un transtypage automatiquement => sources de problemes.

    Dans le cas de python (je debute, donc je peux me tromper), apparement, bien que le typage soit dynamique, il reste néamoins fortement typé, contrairement a VB. Le typage automatique se fait a la declaration, s'il doit y avoir un transtypage apres, il doit se faire manuellement, ca me parait etre un bon compromis, il allie le meilleur des chaques méthodes.

    J'ai trouvé cette explication dans "dive into python" qui est librement téléchargeable :

    En Java, C++ et autres langage à typage statique, vous devez spécifier les types de données de la valeur de retour
    dune fonction ainsi que de chaque paramètre. En Python, vous ne spécifiez jamais de manière explicite le type de
    quoi que ce soit. En se basant sur la valeur que vous lui assignez, Python gère les types de données en interne.
    Addendum. Un lecteur erudit propose lexplication suivante pour comparer Python et les autres langages de
    programmation :

    langage à typage statique
    Un langage dans lequel les types sont fixés à la compilation. La plupart des langages à typage statique
    obtiennent cela en exigeant la déclaration de toutes les variables et de leur type avant leur utilisation. Java et C
    sont des langages à typage statique.
    langage à typage dynamique
    Un langage dans lequel les types sont découverts à lexécution, linverse du typage statique. VBScript et
    Python sont des langages à typage dynamique, ils déterminent le type dune variable la première fois que
    vous lui assignez une valeur.
    langage fortement typé
    Un langage dans lequel les types sont toujours appliqués. Java et Python sont fortement typés. Un entier ne
    peut être traité comme une chaîne sans conversion explicite (nous verrons plus loin dans ce chapitre comment
    le faire).
    langage faiblement typé
    Un langage dans lequel les types peuvent être ignorés, linverse de fortement typé. VBScript est faiblement
    typé. En VBScript, vous pouvez concaténer la chaîne '12' et lentier 3 pour obtenir la chaîne '123', et
    traiter le résultat comme lentier 123, le tout sans faire de conversion explicite.

    Python est donc à la fois à typage dynamique (il nutilise pas de déclaration de type explicite) et fortement typé (une
    fois quune variable a un type, cela a une importance).
    Donc un language a typage dynamique n'empeche pas d'etre fortement typé, et dans ce cas, je vois mal d'où pourrait venir la confusion.

    L'execution serat peut-etre plus lente et c'est peut etre pour ca que les languages de scripts en général (où la rapidité n'est pas la priorité) ont un typage dynamique.

  12. #12
    Membre éclairé
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Points : 803
    Points
    803
    Par défaut
    Citation Envoyé par doof
    L'execution serat peut-etre plus lente et c'est peut etre pour ca que les languages de scripts en général (où la rapidité n'est pas la priorité) ont un typage dynamique.
    Pas vraiment. Regarde certaines implémentation de Common Lisp (notamment SBCL et CMUCL) qui sont plus rapides dans certains tests que le C. Un typage dynamique n'empêche pas du tout une rapidité d'exécution.

  13. #13
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    J'espère ne pas dire une énormité, mais l'avantage du typage dynamique, c'est qu'on peut programmer une unique fonction qui prend un paramètre qui peut être de tout type, ce qui se rapprocherait du template du C++. Moi qui suit plus un programmeur en Delphi, dès que je veux créer une fonction qui utilise par exemple des tableaux d'entiers, de doubles ..., je suis obligé recréer plusieurs fois la même fonction en changeant simplement la déclarationdu type. Ca fait une surcharge de code assez inutile je trouve.

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    Points : 288
    Points
    288
    Par défaut
    Citation Envoyé par Guigui_
    J'espère ne pas dire une énormité, mais l'avantage du typage dynamique, c'est qu'on peut programmer une unique fonction qui prend un paramètre qui peut être de tout type, ce qui se rapprocherait du template du C++. Moi qui suit plus un programmeur en Delphi, dès que je veux créer une fonction qui utilise par exemple des tableaux d'entiers, de doubles ..., je suis obligé recréer plusieurs fois la même fonction en changeant simplement la déclarationdu type. Ca fait une surcharge de code assez inutile je trouve.
    Et dieu (Bjarne Stroustrup ) inventa le template<> comme tu le dis

  15. #15
    Membre à l'essai
    Inscrit en
    Juin 2002
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 25
    Points : 23
    Points
    23
    Par défaut
    un autre avantage du typage dynamique:
    - on peut créer des tableaux, listes, etc. de ce style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    &#91;&#91;"toto1" , 1&#93;,&#91;"toto2",2&#93;,..&#93;
    -> donc des strings et des chiffres dans le même tableau.
    En C++ on est obligé d'utilser des "void*" et de type-caster vers le bon type -> ce qui peut être source de problèmes.
    En Java on est obliger d'utiliser des tableaux d"Object" pour ce genre de choses.
    Sinon pour en revenir aux inconvénients de mat.M:
    Inconvénients : comme il a été déclaré précedemment , risque très élevé de confusion pour l'utilisation et l'affectation des variables.
    Sans compter une pénalisation des performances en exécution .
    - l'affectation des variables se fait éssentielement dans les langages impératifs (OO (c++, java, etc.), et procédural (c, etc.)). Dans les langages fonctionnels par exemple les affectations sont quasiment inéxistentes, donc le problème des affectations ne s'y pose presque pas.
    - en ce qui concerne les performances je serais pas si sûr -> http://shootout.alioth.debian.org/craps.php
    scheme et common lisp (tout 2 avec typage dynamique) sont dans le top des langages les lpus performants.
    - puis finalement il existe des techniques de programmation pour éviter le genre de problème créer par le typage dynamique -> tests unitaires, mock objects, etc. dans lequel on testerait le type des variables.

Discussions similaires

  1. Que pensez-vous des langages interpretés pour le dev de jeux?
    Par geektoo dans le forum Développement 2D, 3D et Jeux
    Réponses: 5
    Dernier message: 02/02/2015, 12h00
  2. Que pensez vous des nouveaux langages de programmation Vala et Genie
    Par gege2061 dans le forum Langages de programmation
    Réponses: 10
    Dernier message: 15/12/2008, 11h09
  3. [Débat] Que pensez-vous du langage Anubis ?
    Par MDZ dans le forum Langages fonctionnels
    Réponses: 232
    Dernier message: 19/09/2007, 21h33
  4. Que pensez-vous des générateurs de doc PHP ?
    Par Nonothehobbit dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 64
    Dernier message: 10/07/2007, 10h17
  5. [Choix] Que pensez vous des CMS de type Mambo ?
    Par Nikeleos dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 02/09/2005, 12h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo