Oui, des questions similaires ont été posées mais toujours dans le but de découvrir «laquelle est la meilleure».
Je pose la question parce que je suis devenu développeur principalement en JavaScript et que je n'ai pas vraiment d'expérience dans l'écriture dans des langages typés statiquement.
Malgré cela, je vois vraiment de la valeur dans l'apprentissage de C pour gérer des opérations exigeantes à des niveaux de code inférieurs (ce qui, je suppose, a beaucoup à voir avec statique vs dynamique au niveau du compilateur), mais ce que j'essaie de comprendre est de savoir s'il existe des contextes de projet spécifiques (peut-être certains types d'opérations dynamiques à forte intensité de données?) impliquant des choses autres que les performances où il est beaucoup plus logique d'utiliser Java ou C # par rapport à quelque chose comme Python.
la source
Réponses:
Oui définitivement.
La frappe dynamique présente des avantages certains dans les cas où vous souhaitez pouvoir tout traiter comme un seul type. La sérialisation / désérialisation est l'un des exemples classiques. C'est pourquoi tant de programmation Web se fait dans des langages de script à typage dynamique: ils sont bien adaptés à une tâche qui implique beaucoup de conversion de toutes sortes de données vers et depuis des chaînes.
Pour la programmation d'applications, en revanche, les langages statiques fonctionnent beaucoup mieux car essayer de tout traiter comme un seul type n'est pas souvent une exigence. Vous voulez souvent avoir des structures de données efficaces avec des données représentées comme elles-mêmes et ne pas être converties très fréquemment en d'autres types. Cela rend les fonctionnalités de la frappe dynamique un inconvénient plutôt qu'un avantage, c'est pourquoi les applications sont presque exclusivement écrites dans des langages typés statiquement.
la source
La façon dont je le vois est, si vous pouvez travailler naturellement dans une langue typée statiquement, alors la frappe statique est la voie à suivre. En général, le but d'un système de type est de vous empêcher d'effectuer des opérations avec une sémantique non définie - comme
(string) "hello" + (bool) true
. Avoir le niveau de sécurité supplémentaire vous empêchant d'effectuer ces opérations peut être un bon moyen d'éviter les bogues dans votre code, même sans tests unitaires approfondis. Autrement dit, la sécurité de type fournit un autre niveau de confiance dans l'exactitude sémantique de votre code.Mais les systèmes de type sont très difficiles à obtenir correctement. Je ne crois pas qu'il existe un système de type parfait dans la nature au moment de la rédaction de cet article. (Par «système de type parfait», j'entends un système de type strict, qui ne nécessite pas d'annotations de code détaillé, qui ne génère aucune erreur de type faux positif et dont les erreurs de type sont faciles à comprendre pour le programmeur.) De plus, il peut difficile de comprendre les très bons systèmes de types qui existent. Lorsque j'apprenais Haskell, je ne peux pas vous dire le nombre d'erreurs de type obscur que j'ai eues en essayant d'écrire ce qui me semblait (comme) du code correct. Habituellement, le code n'était pas réellement correct (ce qui est un point en faveur du système de type), mais cela a pris beaucoup de tempsde travail pour comprendre les messages d'erreur du compilateur, afin que je puisse corriger les problèmes sous-jacents. Dans les langues OO, vous pouvez éventuellement vous surprenez à penser « cet argument devrait être contravariante avec le type d'entrée, pas covariant! », Ou (plus probablement) de revenir à typecasts pour échapper aux limites du système de type. Les systèmes de saisie peuvent devenir beaucoup plus délicats que vous ne le pensez.
Pour ce que ça vaut, je comprends que la difficulté de trouver de bons systèmes de type fait partie de ce qui a motivé Gilad Bracha à inclure le support du système de type enfichable dans Newspeak.
la source
Ce sont des outils différents, mais ce n'est pas par la performance. C'est une question de complexité .
Les langages dynamiques visent généralement une flexibilité maximale, ce qui entraîne un manque de validation et une sorte de garantie. Ensuite, il est très puissant dans les programmes à petite échelle, mais il devient presque impossible de maintenir des programmes à grande échelle (complexité).
Les langages statiques visent généralement une validation maximale. Leur premier objectif est généralement de détecter les erreurs (ou les bugs) le plus tôt possible. De nombreuses garanties sont faites pour la validation. Il est ensuite plus difficile à apprendre et à démarrer, mais à mesure que les programmes augmentent, ils offrent une meilleure validation des programmes à un coût bien moindre (efforts de codage).
Par conséquent, les langages dynamiques conviennent généralement aux petits programmes (je veux dire très petits) tels que les pages Web dynamiques, le navigateur Web DSL (pas pour les applications de navigateur!) Ou les scripts shell. Les langages statiques conviennent mieux aux programmations système ou à tout autre élément.
Les descriptions ci-dessus concernent des langages très purement dynamiques ou statiques. La plupart des langues réelles se situent entre elles et présentent diverses caractéristiques.
Voir ici pour plus de détails: https://softwareengineering.stackexchange.com/a/105417/17428
la source
Je programme actuellement dans des langages de type statique (C # et F #), mais j'apprécie la programmation dans des langages dynamiques (Smalltalk, Ruby). Il y a beaucoup d'avantages et d'inconvénients que les gens associent à un type par rapport à un autre et qui concernent davantage la langue que lorsque vous appliquez des types. Par exemple, les langages dynamiques ont généralement une syntaxe plus propre et plus concise, mais F # et OCaml avec leur système d'inférence de type ont une syntaxe aussi propre que n'importe quel langage dynamique. Et avec la frappe statique, vous avez de véritables refactorings automatiques et la saisie semi-automatique, mais Smalltalk, avec tout son code source dans une base de données et chaque méthode compilée séparément, a été la première langue à avoir vraiment de sérieux refactorings automatisés, et cela a très bien fonctionné. En fin de compte, les langages dynamiques et statiques modernes d'aujourd'hui sont sûrs pour les types, qui est l'aspect le plus important de votre système de type
la source
C'est 2015 maintenant, qui ajoute quelques extraits intéressants à la conversation:
Ainsi, les gars du backend sont fatigués de la veste droite inutile de la frappe stricte, tandis que les gars du frontend sont fatigués du chaos de la frappe dynamique.
Assez ironique: je me demande s'ils vont se rencontrer au milieu, ou se précipiter les uns les autres avec le boom sonore d'un délai qui passe ...? ;)
la source