Q: J'ai souvent entendu l'affirmation selon laquelle les langages à typage dynamique sont plus productifs que les langages à typage statique. Quelles sont les raisons de cette réclamation? "
Cela a des raisons historiques. Si vous remontez quelques décennies en arrière, les langages dynamiques étaient indiscutablement beaucoup plus productifs que les langages statiques (tout en étant beaucoup plus lents). Perl est clairement beaucoup plus productif que C si vous connaissez les deux et si la tâche à accomplir le permet. Mais au fil du temps, les langues se sont beaucoup empruntées et de nouvelles langues réduisent les écarts (en productivité et en performance).
Voici quelques points à considérer:
Ramassage des ordures : le ramassage des ordures augmente considérablement la productivité. Je crois que Java était le premier langage statique grand public avec GC. Auparavant, statique signifiait essentiellement la gestion manuelle de la mémoire. (Remarque: ici et dans la suite, je ne considère que les langues ordinaires. Il existe de nombreuses langues expérimentales et de niche qui fourniront des contre-exemples à chaque argument que je ferai.)
Sécurité de la mémoire : il s’agit d’une amélioration de la productivité qui vous évite de vous tirer une balle dans le pied. Avant les langages statiques "gérés" tels que Java, statique désignait généralement un accès direct à la mémoire. Le débogage fait également partie de la productivité, et un accès à la mémoire non sécurisé peut conduire à des bogues vraiment obscurs.
Systèmes de type encombrants. Avant l'introduction de types paramétrés (tels que les modèles ou les génériques) dans les langages statiques, les limitations des systèmes de types statiques étaient souvent un fardeau. Par exemple, en Java, vous deviez explicitement downcast chaque fois que vous sélectionniez un élément d'une collection. Donc, vous avez la surcharge syntaxique d'un casting et aucune sécurité de type. Compte tenu de l'omniprésence des collections dans la programmation, il s'agissait d'un inconvénient majeur.
Le fait de devoir déclarer le type de tout implique beaucoup de typage redondant, mais avec l'inférence de type moderne, cela peut être considérablement réduit.
Grande bibliothèque standard. Python a été annoncé comme "piles incluses" en raison de la grande bibliothèque standard. Ceci en comparaison avec C qui a une bibliothèque standard très minimaliste. Mais avec des plates-formes telles que Java et .net, une vaste bibliothèque standard devient standard et de nouveaux langages tels que Scala et F # en héritent "gratuitement".
Structures de données de première classe. Les langages dynamiques comme Perl et Python ont des structures de données de première classe intégrées, telles que des listes et des cartes, avec des raccourcis syntaxiques pratiques pour les opérations courantes. Comparé à cela, C n’a pas de collections intégrées à l’exception des tableaux de taille fixe.
Les fermetures et la syntaxe lambda - les langages dynamiques l'ont généralement depuis le début, mais les langages statiques l'ont adopté, plus récemment Java.
REPL la possibilité de tester rapidement les extraits de code de manière interactive est un avantage énorme. Toutefois, bien que les outils de l'EDI, comme la fenêtre "immédiate" de Visual Studio, les langages statiques puissent émuler cela dans une certaine mesure.
Outils avancés - en plus des points ci-dessus, où les langages statiques se rapprochent de la commodité des langages dynamiques, les éditeurs modernes tirent parti de l'analyse statique de manière à ce que les langages dynamiques peinent à correspondre. Par exemple, les éditeurs peuvent fournir des refactorisations automatiques sécurisées, ce qui est strictement impossible dans un langage dynamique.
En bout de ligne: historiquement, c'était vrai, mais aujourd'hui, la réponse est moins claire.
Q: Alors, qu'y a-t-il à dire pour la productivité avec le typage dynamique qui constitue réellement un avantage du modèle type lui-même?
Il est un peu difficile de séparer le modèle de frappe dynamique des langages dynamiques, mais à titre d'exemple, C # a adopté des fonctionnalités plus dynamiques au fil du temps, même s'il s'agit d'un langage statique. C'est vraiment une preuve d'avantage du modèle de type dynamique. Exemples:
Reflection La
réflexion est fondamentalement une fonction de frappe dynamique. Vous inspectez les types d'objet au moment de l'exécution, au moment de la compilation. Lors de son introduction, il était plutôt mal vu, mais en C #, l’utilisation de la réflexion devient de plus en plus omniprésente, par exemple ASP.Net MVC utilise beaucoup la réflexion.
Attributs Les
attributs sont un exemple de saisie dynamique. Vous pouvez ajouter des attributs arbitraires à une classe lors de la compilation, puis inspecter au moment de l'exécution (par réflexion) et manipuler des objets en fonction. Quelque chose comme MEP est fondamentalement un framework d'extension basé sur un modèle de type dynamique.
Linq to SQL, EF mv.
Les différents transformateurs Linq inspectent les requêtes en tant qu’objets d’exécution et génèrent SQL à la volée. Cela ne devient pas plus dynamique que d'inspecter le code au moment de l'exécution. CodeDom est le revers de la médaille, où le code peut être généré à l'exécution
Roslyn
Roslyn implémente fondamentalement eval
, ce qui était autrefois considéré comme la caractéristique déterminante d'un langage réellement dynamique.
Dynamique
Le dynamic
type-est la fonctionnalité la plus explicitement dynamique de C # et a pour objectif de rendre l'interaction avec des objets externes et des langages plus simples et plus productifs. Mais il est également utilisé dans Asp.net MVC pour plus de commodité.
L'avantage de toutes les caractéristiques ci-dessus montre que le modèle dynamique présente des avantages certains, même dans un langage statique avec des types paramétrés, des types structurels et des inférences de types.