Statique/Dynamique vs Forts/Faibles
Je vois ces termes véhiculés à travers la place dans la programmation et j'ai une vague idée de ce qu'ils signifient. Une recherche m'indique que de telles choses ont été posées à tous les coins de débordement de pile en fait. Pour autant que je suis au courant Statique/Dynamique tapant dans des langues est subtilement différent de force et de Faiblesse de frappe mais ce que la différence m'échappe. Différentes sources semblent utiliser des significations différentes ou même utiliser les termes de façon interchangeable. Je ne peux pas trouver quelque part qui parle à la fois et en fait des sorts de la différence. Ce serait sympa si quelqu'un pourrait s'il vous plaît préciser clairement là pour moi et le reste du monde.
Vous devez vous connecter pour publier un commentaire.
Statique/Dynamique de frappe est d'environ quand type d'information est acquis (Soit au moment de la compilation ou à l'exécution)
De force et de Faiblesse de frappe est d'environ comment strictement types sont distingués (par exemple, si la langue essaie de faire une conversion implicite de chaînes de nombres).
Voir le page wiki pour de plus amples informations.
"12" + "34"
serait égal à"46"
, mais"12" + "34Q"
serait égal à"1234Q"
[heureusement, on pourrait écrire"12" & "34"
si l'on voulait concaténation]. Curieusement, les variables de la tenue des nombres stockés en tant que double-précision des flotteurs et des mathématiques sur ces variables utilisées les valeurs à virgule flottante sans chaîne munging, mais il n'y avait aucun moyen de demander si une variable est une chaîne ou un nombre.int
etc mots-clés pour les déclarations de variables, ou quand ils ont unvar
ou mot clé similaire?Vous avez découvert un point faible dans la terminologie que les amateurs utilisent pour parler des langages de programmation.
Ne pas utiliser les termes "forte" et "faible", en tapant, parce qu'ils n'ont pas universellement d'accord sur la signification technique. En revanche, le typage statique signifie que les programmes sont vérifiées avant d'être exécuté, et un programme peut être rejeté avant qu'il ne commence. Typage dynamique signifie que les types de valeurs sont vérifiées pendant exécution, et un mal tapé l'opération pourrait provoquer le programme pour arrêter ou sinon signal une erreur au moment de l'exécution. Une des principales raisons pour le typage statique est la règle de programmes qui pourraient avoir de tels "dynamique des erreurs de type".
Typage fort signifie généralement qu'il y a aucun échappatoire dans le système de type, tandis que typage faible signifie que le type de système peut être subverti (invalidant des garanties). Les termes sont souvent utilisés de manière incorrecte à la moyenne de la statique et de la dynamique de la frappe.
Pour voir la différence, pensez à C: le langage est de type vérifiée au moment de la compilation (typage statique), mais il y a beaucoup de lacunes; vous pouvez très bien la fonte d'une valeur d'un type vers un autre type de la même taille---en particulier, vous pouvez convertir les types pointeur librement. Pascal est un langage qui a été destiné à être fortement typé, mais célèbre eu un imprévu échappatoire: une variante du dossier avec pas de tag.
Implémentations de langages fortement typés souvent acquérir des lacunes au fil du temps, habituellement de sorte qu'une partie du système d'exécution peut être mis en œuvre dans le langage de haut niveau. Par exemple, Objective Caml possède une fonction appelée
Obj.magic
qui a l'effet de retour de son argument, mais au moment de la compilation il convertit tout type de valeur à un tout autre type. Mon exemple préféré est Modula-3, dont les concepteurs ont appelé leur type coulée de construireLOOPHOLE
.Cela dit, vous ne pouvez pas compter sur deux personnes en utilisant les mots "forts" et "faibles" exactement de la même manière. Afin de les éviter.
Simplement mis de cette façon: dans un statiquement typé langue le type est 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:
Alors que dans une typées dynamiquement langue le type est dynamique, du sens une fois que vous définissez une variable d'un type, vous POUVEZ le modifier. C'est parce que le typage est associée à la valeur plutôt que de la variable.
Par exemple en Python:
D'autre part, la de force et de faiblesse de frappe dans une langue est liée à des conversions de types implicites (en partie pris en de @de Dario réponse):
Par exemple en Python:
alors qu'en PHP:
Le typage statique permet de vérifier le type de l'exactitude au moment de la compilation. Les langages statiquement typés sont généralement compilés, et typées dynamiquement langues sont interprétées. Par conséquent, dynamicly langages à typage pouvez vérifier en tapant au moment de l'exécution.
Typage faible signifie que le type d'un objet peut changer selon le contexte. Par exemple, dans un langage faiblement typé de la chaîne "123" peut être considéré comme le numéro 123 si vous ajoutez un autre numéro. Exemples de langages à typage faible sont bash, awk et PHP.
Un autre type de langage faiblement typé est C, où les données à une adresse de mémoire peut être considérée comme un type différent par la coulée.
Dans un langage fortement typé le type d'un objet ne change pas - int est toujours un int et d'essayer de l'utiliser comme une chaîne de caractères, une erreur sera générée. Java et Python sont fortement typés.
La différence entre la dynamique et le typage statique est lorsque les règles sont respectées. Dans un langage statiquement typé le type de toutes les variables et les paramètres doivent être déclarés dans la source et est appliquée au moment de la compilation. Dans un typées dynamiquement langue les types sont vérifiées uniquement lorsqu'ils sont utilisés lors de l'exécution. Si Java est statiquement typé et Python est typées dynamiquement.
Cependant les limites peuvent être un peu floue par moments. Par exemple, même si Java est statiquement typé, chaque fois que vous utilisez une réflexion ou d'un plâtre (par exemple lors de l'utilisation de conteneurs d'Objets), ils vous reporter à plus tard la vérification de type à l'exécution.
De même la plupart des langages fortement typés sera toujours automatiquement la conversion entre les nombres entiers et décimaux (et, dans certaines langues, abitrary précision BigInts).
f
prend en argumentx
(fun f(x)
) [** donc pas de types sont déclarés**] et le corps de la fonction estx+1
. Sans types déclaré compilateur va comprendre quex
doit être un int.- fun f x = x + 1;
val f = fn : int -> int
5 + 'c' // OK
Aujourd'hui faire des recherches sur ce sujet, je suis tombé sur cet excellent article http://blogs.perl.org/users/ovid/2010/08/what-to-know-before-debating-type-systems.html Il a dissipé beaucoup de choses pour moi et j'ai pensé qu'Il peut en ajouter quelques-uns des grands des réponses ci-dessus.
Forts et Faibles de frappe:
Statique et Dynamique des Types de
Explicite/Implicite Types:
De Scott Langage de Programmation Pragmatique, 3e édition, page 291, nous avons
Donc, en termes simples, statique/dynamique de frappe se réfère à la fois lors de la vérification de type se produit: le temps de compilation pour le typage statique, et le temps d'exécution pour les langages dynamiques. De même, de force et de faiblesse de frappe désigne le degré d'agressivité d'une langue est dans l'application de son type de système.
J'ai essayé de traduire Scott description dans un joli schéma, que j'ai posté ci-dessous.
Je pense que les autres collègues ont fait un bon travail de l'esp. expliquer la différence entre statique et dynamique de la frappe. Mais aussi loin que les forts et les faibles de frappe, il faut dire qu'il y a
les différentes compréhensions/points de vue.
Ici deux exemples:
Certains disent que Haskell est fortement typé, parce que vous n'êtes pas autorisé à faire tout les conversions de type.
Autres (par exemple, de Dario vue) dire un langage qui permet de convertir implicitement de la chaîne de nombre sur le but est faiblement typé, mais même d'autres appellent cela juste duck-typing.
Les deux états en évidence les extrémités opposées d'un système de type, mais des aspects complètement différents. Donc, je rejoins M. Ramsey est d'avis de ne pas utiliser les termes "forte" et "faible" pour distinguer le type de systèmes.
Statiquement v/s typées dynamiquement langues
Fortement v/s faiblement typé langues
Bonnes nouvelles lectures
Les langages statiquement typés généralement vous obliger à déclarer les types de variables, qui est ensuite vérifié au moment de la compilation afin de réduire les erreurs. Le mot "statique" dans "statiquement typé" se réfère à "l'analyse de code statique", qui est le processus d'examen le code avant de l'exécuter. Bien qu'il soit possible pour un langage statiquement typé pour déduire le type de la variable à partir de la droite d'une expression ou d'paramètres réels, dans la pratique, la plupart des langages statiquement typés exiger types de variables à être explicitement déclaré.
Typées dynamiquement langues ne nécessitent généralement pas de déclarations de variables d'avoir des types, et ils en déduisent les types de variables en fonction du type calculé comme un résultat de l'évaluation de la droite de chaque instruction d'affectation ou les paramètres d'un appel de fonction. Puisque la variable peut être donné plusieurs postes au cours de sa vie, son type peut changer au fil du temps et c'est pourquoi il est appelé "typées dynamiquement". Aussi, l'environnement d'exécution doit suivre le type de courant pour chaque variable, le type est lié à la valeur plutôt qu'avec la déclaration de la variable. Cela peut être considéré comme un moteur d'exécution d'informations de type (RTTI) du système.
Éléments de statiquement et dynamiquement typé langues peuvent être combinés. Par exemple, C# supporte à la fois statique et dynamique, les variables de type objet et les langages orientés généralement en faveur des bas-coulée de la hiérarchie des types. Les langages statiquement typés généralement de fournir les différentes façons de contourner la vérification de type, par exemple à l'aide de la coulée, la réflexion et la dynamique de l'invocation.
Forte vs Faible Typage se réfère à un continuum de combien la langue s'efforce de prévenir les bogues dus à l'utilisation d'une variable comme si elle était un type est en fait un autre type. Par exemple, les deux C et Java sont des langages à typage statique, mais Java utilise beaucoup plus le type de la vérification que le C. Le C suivant le code est heureux de compiler et d'exécuter, et de mettre une valeur aléatoire dans la variable b au moment de l'exécution, probablement la cause d'un bug:
L'équivalent de code Java produira une erreur de compilation, ce qui est généralement préférable: