Quelle est la différence entre typé statiquement et dynamiquement typé langues?
J'entends beaucoup que de nouveaux langages de programmation sont typées dynamiquement mais qu'est-ce que ça signifie quand on dit qu'un langage dynamiquement typé vs statiquement typés?
- Bonne question, mais votre réponse n'est pas la bonne réponse.
- pouvez-vous pls se référer à quelque chose qui est correcte, alors ?
- Je pense que les tests unitaires de l'aide maintenant à ce problème et typées dynamiquement des langues comme le JavaScript peut être codé avec une assurance qu'il tiendra jusqu', rendant éligibles pour le développement de logiciels d'entreprise, ne pensez-vous pas?
- Au mieux, ces tests unitaires se détériorer avec le temps et se éteint par les co-travailleurs qui essaient d'augmenter la sécurité de l'emploi, au pire, ils n'obtiennent jamais écrit à la première place. C'est comme suggérant à un pro mécanicien à utiliser du ruban adhésif sur son client voitures. Oui junior, à l'aide de ruban adhésif sur cette transmission de l'emploi est une bonne idée... pour vous.
- Je sais que cette question est de 10 ans, mais de ce que j'ai lu dans les commentaires, vous devriez probablement passer à accepter la réponse de "Christopher Tokar".
Vous devez vous connecter pour publier un commentaire.
Les langages statiquement typés
Un langage statiquement typé si le type d'une variable est connue au moment de la compilation. Pour certaines langues, cela signifie que vous en tant que programmeur doit spécifier quel type de chaque variable (par exemple: Java, C, C++); d'autres langues offrent une certaine forme de l'inférence de type, la capacité du système de type de déduire le type d'une variable (par exemple: OCaml, Haskell, Scala, Kotlin)
Le principal avantage ici est que tous les types de vérification peut être effectuée par le compilateur, et donc beaucoup de trivial bugs sont pris à un stade très précoce.
Exemples: C, C++, Java, Rouille, Allez, Scala
Typées dynamiquement langues
Un langage dynamiquement typé si le type est associée à des valeurs d'exécution, et n'a pas de nom de variables/champs/etc. Cela signifie que vous en tant que programmeur peut écrire un peu plus vite parce que vous n'avez pas à spécifier les types de tous les temps (à moins d'utiliser un statiquement typé langue avec l'inférence de type).
Exemples: Perl, Ruby, Python, PHP, JavaScript
La plupart des langages de script ont cette fonctionnalité, il n'y a pas de compilateur ne statique de la vérification de type, de toute façon, mais vous risquez de vous retrouver à la recherche d'un bug qui est due à l'interprète de mal interpréter le type d'une variable. Heureusement, les scripts ont tendance à être petit, de sorte que les bugs n'ont pas beaucoup d'endroits pour se cacher.
Plus typées dynamiquement des langues ne permettent de fournir des informations de type, mais ne l'exige pas. Une langue qui est actuellement en cours de développement, Coquin, prend une approche hybride permettant le typage dynamique à l'intérieur des fonctions mais l'application de typage statique pour la signature de la fonction.
var
, C++ aauto
et de toutes les langues est descendu de la ML de la famille (de la fin des années 1970, par exemple, Standard ML, OCaml, Haskell, F#) avez plein de Hindley-Milner, l'inférence de type, de sorte que vous n'avez pas d'annoter aucun types. Si vos déclarations sont totalement entachée d'erreur de droit.Statiquement typé langages de programmation n'vérification de type (c'est à dire le processus de vérification et de faire respecter les contraintes de types) à au moment de la compilation par opposition à au moment de l'exécution.
Typées dynamiquement les langages de programmation ne la vérification de type à au moment de l'exécution par opposition à au moment de la compilation.
Voici un exemple de contraste de façon Python (typées dynamiquement) et Go (statiquement typé) résoudre une erreur de type:
Python effectue la vérification de type à l'exécution, et par conséquent:
Fonctionne parfaitement bien, et produit le résultat attendu
Hi
. L'erreur est seulement si la ligne problématique est touché:Produit
puisque la ligne a été exécuté.
Aller sur l'autre main ne la vérification de type au moment de la compilation:
Le ci-dessus ne compile pas, avec l'erreur suivante:
runhaskell
, par exemple.Simplement mis de cette façon: dans un statiquement typé langue variables de types sont statique, sens une fois que vous définissez une variable d'un type, vous ne pouvez pas le changer. C'est parce que la saisie est associé à la variable plutôt que de la valeur qu'elle renvoie.
Par exemple en Java:
Où, d'autre part: dans un typées dynamiquement langue variables de types sont dynamique, du sens une fois que vous définissez une variable d'un type, vous POUVEZ le modifier. C'est parce que la saisie est associée à la valeur qu'elle suppose plutôt que la variable elle-même.
Par exemple en Python:
Donc, il est préférable de penser en termes de variables typées dynamiquement langues comme juste pointeurs génériques à des valeurs typées.
Pour résumer, type décrit (ou devraient avoir décrit) les variables dans la langue plutôt que de la langue elle-même. Il aurait pu être mieux utilisé comme un langage statiquement typé variables contre un langage dynamiquement typé variables à mon humble avis.
Les langages statiquement typés sont généralement les langages compilés, donc, les compilateurs vérifier les types (parfait de sens? que les types ne sont pas autorisés à être changé plus tard au moment de l'exécution).
Typées dynamiquement langues, sont généralement interprétées, ce type de vérification (le cas échéant) se produit au moment de l'exécution, lorsqu'ils sont utilisés. Bien sûr, cela apporte de la performance de coût, et est l'une des raisons de langages dynamiques (par exemple, python, ruby, php) ne s'adaptent pas aussi bon que le tapé ceux (java, c#, etc.). À partir d'un autre point de vue, les langages statiquement typés ont plus d'un coût de démarrage: fait de vous l'habitude d'écrire plus de code, plus de code. Mais qui paie plus tard au large.
La bonne chose est les deux côtés sont d'emprunt caractéristiques de l'autre côté. Tapé langues sont en train d'intégrer plus de fonctions dynamiques, par exemple, les génériques et les bibliothèques dynamiques en c#, et de la dynamique des langues, y compris plus de la vérification de type, par exemple, les annotations de type python, ou HACK variante de PHP, qui ne sont généralement pas de base de la langue et utilisable sur demande.
Quand il s'agit de sélection de la technologie, ni le côté a une supériorité intrinsèque sur l'autre. C'est juste une question de préférence si vous voulez plus de contrôle pour commencer ou de la flexibilité. il suffit de choisir le bon outil pour le travail, et assurez-vous de vérifier ce qui est disponible dans les termes de la face avant d'envisager un transfert.
strongly typed
passtatically typed
.People often use the term strongly-typed language to refer to a language that is both statically typed and strongly-typed
et de la pensée qu'ils entendaient par là que Python était statiquement typé. Mais cela n'a aucun sens, et je vois comment ils dire que Python eststrongly typed
🙂http://en.wikipedia.org/wiki/Type_system
myObject[remoteDataName]
. Ensuite, il n'y a aucun moyen de savoir quelle propriété il va choisir ou même si c'est une propriété valide à tous.La terminologie "dynamiquement typé" est malheureusement trompeuse. Toutes les langues sont statiquement typé, types et propriétés des expressions (pas de valeurs, comme certains le pensent). Cependant, certaines langues ont un seul type. Ceux-ci sont appelés uni-langages à typage. Un exemple d'une telle langue est le type lambda calcul.
Dans le lambda calcul non typé, tous les termes sont des lambda-termes, et la seule opération qui peut être effectuée sur un terme est en l'appliquant à un autre terme. Par conséquent, toutes les opérations de toujours se traduire soit par une récursivité infinie ou un lambda terme, mais jamais de signaler une erreur.
Cependant, nous étions à augmenter le lambda calcul non typé primitif, des nombres et des opérations arithmétiques, puis nous avons pu effectuer absurde des opérations, par exemple l'ajout de deux lambda termes:
(λx.x) + (λy.y)
. On pourrait dire que la seule sane chose à faire est de signaler une erreur lorsque cela se produit, mais pour être en mesure de le faire, chaque valeur doit être marqué avec un indicateur qui indique si le terme est un lambda terme ou un nombre. L'opérateur d'addition va alors vérifier qu'en effet, les deux arguments sont étiquetés comme des numéros, et si ils ne le sont pas, un signal d'erreur. Notez que ces balises sont pas types, parce que les types sont des propriétés de programmes, pas de valeurs produites par ces programmes.Uni-typée langue qui fait cela est appelé dynamiquement typé.
Des langages tels que JavaScript, Python et Ruby sont tous uni-typé. Encore une fois, la
typeof
opérateur en JavaScript et letype
fonction en Python ont des noms trompeurs; ils renvoient les mots-clés associés avec le opérandes, pas leurs types. De même,dynamic_cast
en C++ etinstanceof
en Java ne pas faire de ce type de contrôles.Les langages statiquement typés type-vérifier au moment de la compilation et le type ne peut PAS le changer. (Ne vous inquiétez pas mignon avec la conversion de type de commentaires, une nouvelle variable de référence est créé).
Typées dynamiquement les langues de type vérifier au moment de l'exécution et le type d'une variable PEUT être modifiée au moment de l'exécution.
Compilé vs Interprété
"Lorsque le code source est traduit par"
Tapant
"Quand les types sont vérifiés"
5 + '3'
est un exemple d'un type d'erreur dans fortement typé langues comme l'Aller et Python, parce qu'ils ne permettent pas "de contrainte de type" -> la capacité pour une valeur de changement de type, dans certains contextes, tels que la fusion des deux types. Faiblement typé de langages tels que JavaScript, ne va pas faire une erreur de type (résultats en'53'
).Les définitions de "Static & Compilé" et "Dynamique & Interprété" sont assez similaires...mais n'oubliez pas qu'il est "quand les types sont vérifiés" vs "lorsque le code source est traduit".
, Vous aurez le même type d'erreurs, indépendamment de savoir si le langage est compilé ou interprété! Vous avez besoin de séparer ces termes sur le plan conceptuel.
Exemple Python
Dynamique, Interprété
Parce que Python est à la fois interprété et dynamiquement typé, il ne traduit et vérifie le code d'exécution sur. Le
else
bloc n'est jamais exécuté, de sorte5 + '3'
est n'a même jamais regardé!Et si c'était statiquement typés?
Un type d'erreur pourrait être levée avant le code est à même de les exécuter. Il remplit toujours la vérification de type avant l'exécution, même si elle est interprétée.
Que s'il a été compilé?
La
else
bloc seraient traduits/a regardé avant de les exécuter en temps, mais parce que c'est dynamiquement typé, il ne renvoie pas d'erreur! Dynamiquement typé langues ne pas vérifier les types jusqu'à l'exécution, et que la ligne ne s'exécute jamais.Aller Exemple
Statique, Compilé
Les types sont vérifiés avant la course (statique) et le type d'erreur est immédiatement attiré! Les types seraient toujours être vérifiée avant l'exécution si elle a été interprétée, d'avoir le même résultat. Si c'était dynamique, il ne serait pas de jeter des erreurs, même si le code s'être regardé lors de la compilation.
Performance
Un langage compilé aura de meilleures performances au moment de l'exécution si c'est statiquement typé (vs dynamiquement); connaissance des types permet à la machine d'optimisation de code.
Les langages statiquement typés ont de meilleures performances lors de l'exécution en temps intrinsèque en raison de ne pas avoir besoin de types de contrôles dynamiquement lors de l'exécution (il vérifie avant l'exécution).
De même, les langages compilés sont plus rapide à l'exécution que le code a déjà été traduit au lieu d'avoir à "interpréter"/traduire à la volée.
Noter que compilés et les langages statiquement typés aura un délai avant l'exécution de la traduction et de la vérification de type, respectivement.
Plus De Différences
Le typage statique captures erreurs dès le début, au lieu de les trouver en cours d'exécution (particulièrement utile pour les programmes plus longs). C'est plus "strict" en ce qu'elle ne permet pas pour les erreurs de type de n'importe où dans votre programme et empêche souvent les variables de changement de type, ce qui protège contre les erreurs non intentionnelles.
Typage dynamique est plus souple, que certains apprécient. Il permet en général pour les variables de changer de type, ce qui peut entraîner des erreurs inattendues.
Doux et des définitions simples, mais le montage du besoin:
Les langages statiquement typés lie le type à une variable pour l'ensemble de son champ d'application (Seg: SCALA)
Dynamiquement typé langues lier le type de la valeur réelle référencé par une variable.
Les langages statiquement typés: chaque variable et chaque expression est déjà connu au moment de la compilation.
(
int a;
un peut prendre uniquement les valeurs de type entier au moment de l'exécution)Exemples: C, C++, Java
Typées dynamiquement langues: les variables peuvent recevoir des valeurs différentes au moment de l'exécution et leur type est défini au moment de l'exécution.
(
var a;
un peut prendre n'importe quel type de valeurs à l'exécution)Exemples: Ruby, Python.
Les langages statiquement typés comme C++, Java et typées Dynamiquement des langages comme Python ne diffèrent que dans les conditions de l'exécution du type de la variable.
Statiquement typé langues ont statique type de données de la variable, ici le type de données est contrôlée lors de la compilation si le débogage est beaucoup plus simple...alors que typées Dynamiquement langues ne font pas la même, le type de données est cochée dont l'exécution du programme et, partant, le débogage est un peu difficile.
En outre, ils ont une très petite différence et peut être mise en relation avec fortement typé et faiblement typé langues. Un langage fortement typé ne vous autorise pas à utiliser un type comme un autre, par exemple. Le C et le C++ ...alors que faiblement typé langages permettent par exemple.python
typées dynamiquement langue permet rapidement de prototype de l'algorithme de concepts sans les frais de songer à ce types de variables doivent être utilisés (ce qui est une nécessité dans statiquement typé language).
Le Typage Statique:
Les langages tels que Java et Scala sont statiques tapé.
Les variables doivent être définies et initialisé avant qu'elles soient utilisées dans un code.
pour ex. int x; x = 10;
Système.out.println(x);
Typage Dynamique:
Perl est une dynamique tapé langue.
Variables n'ont pas besoin d'être initialisé avant qu'ils soient utilisés dans le code.
y=10; utilisation de cette variable dans la dernière partie de code