Tapé vs sans type de langue
Je suis en train d'apprendre C et de l'assemblée de la langue. J'ai remarqué que l'assemblée est un type de langage par rapport à la C qui a besoin d'une déclaration de type de données avant que les données puissent être traitées. Mais aussi j'ai appris que même un code écrit dans C est d'abord compilé dans un code écrit en assembleur, puis assemblés en code objet. Ce qui signifie que la déclaration de type de données que nous utilisons dans C ou de tout langage de haut niveau est là que pour la facilité de C compilateur. Ils n'ont pas d'incidence particulière sur le code objet. Est-ce exact?
Ce que j'ai recueillies, c'est que le type dit la déclaration de compilateur que toutes les opérations peuvent être effectuées sur les données, la taille des données (nécessaire pour stocker les données dans le segment de données), la taille de max et min des nombres décimaux qui peuvent être stockés. Suis-je le droit de le dire?
Sont d'autres avantages de la déclaration de type de?
- rapide réponse pratique: utilisation sans type prog lang pour quick stuff, utilisez tapé progr lang pour les applications complexes, même si cela semble plus difficile
Vous devez vous connecter pour publier un commentaire.
En C, nous avons un simple système de type, mais il n'est pas particulièrement sophistiqué, peut être (et c'est souvent le cas dans la pratique) contournée avec complètement incontrôlée des moulages, etc. (Pour ces raisons, C est souvent appelé "faiblement typé", qui est mal défini et généralement utilisé pour dénigrer un langage, mais au moins, dit que les types ne sont pas que important.) La taille, la disposition et alignement des types n'est pas fixe, mais il sera généralement être cohérente avec le même compilateur (version) sur la même plate-forme. Un
int
peut être 14 bits de large, etc., ces choses ne sont pas garantis (sauf que la C normes de certains de commande entre la base intégrales types, par exempleshort
ne doit pas être plus grand queint
).Le programmeur n'a pas à connaître les détails, mais le compilateur ne et en fait qui doit. Par exemple, le code exact généré pour
foo.y
oùstruct Foo { int x; short y; };
etstruct Foo foo;
dépend par exemple sur la taille exacte deint
etshort
et sur le rembourrage destruct Foo
, comme il compile à "prendre l'adresse defoo
, ajouter le décalage dey
dansstruct Foo
, et de l'utiliser". Même lesstruct Foo foo;
nécessite la connaissance exacte destruct Foo
(et, de manière récursive, les types, il est composé d') - le code généré doit savoir exactementsizeof(struct Foo)
pour réserver le bon nombre d'octets sur la pile? De même, les déclarations de type sont nécessaires pour savoir qui opcodes à utiliser pour les mathématiques (iadd
oufadd
ou plus? Doit l'un des opérandes, et de quelle taille?), comparisions, la taille de pas de quand on fait de l'arithmétique des pointeurs (p + n
ajoute réellementn * sizeof(*p)
), etc. Cela empêche également l'accès inexistant membres (et, par extension, la transmission de valeurs de fonctions qui seraient ensuite exécuter ce problème - c'est à dire d'incompatibilité de type), mais qui ressemble plus à une pratique d'effets secondaires, le compilateur considère comme une erreur car ne sais pas ce code d'émettre, non pas parce qu'il croit que les programmeurs sont comme des enfants qui doit être surveillé et gardé dans l'ordre.En langage d'assemblage (habituellement pas plus tard qu'hier j'ai lu sur un projet de Recherche Microsoft qui développe un typée, verifyable langage d'assemblage pour un OS qui est sûr à l'encontre de certains bugs de la construction), vous n'avez pas vraiment des types. Vous avez octets. Vous prenez N octets à partir d'un certain endroit, de faire quelques choses pour eux, et de les stocker à un certain endroit. Ouais, les registres sont fixes pour certains la taille de mot et certains peuvent être destinés à des types particuliers de valeurs (par exemple dédié à virgule flottante registres avec 80 bits ou plus), mais, fondamentalement, vous pouvez stocker tout ce que vous aimez n'importe où. Personne ne vous empêche de stockage de 8 octets, quelque part, plus tard lecture seulement le dernier de 4 octets et en les ajoutant à votre compteur de boucle pour former une adresse pour stocker la valeur de retour à.
Dans d'autres langues, le système de type est beaucoup plus fort, tout en permettant une vaste gamme d'extensions qui permettent de programmation plus haut niveau, tels que l'abstraction les types exacts (et par conséquent, leur mise en page et de la frappe) et il suffit de prendre n'importe quel type capable de réaliser un certain contrat. Il permet la signature type comme
[a] -> a
, qui est une fonction prenant une liste contenant tout type de valeur (tant que c'est homogène, par exemple, d'une liste d'entiers, une liste de chaînes de caractères, une liste de listes de caractères, etc.) et renvoie l'un de ses éléments, sans "l'effacement" (par exemple, un casting pourvoid *
) le type. (En fonction de la mise en œuvre, il peut effectivement générer plusieurs mises en œuvre, chacun à un type unique avec une mise en page, pour la performance, mais qui n'a pas de fuite à travers le programmeur.)Il y a beaucoup qui peut être dit à propos de types et de leur valeur pour la programmation. Et ce que vous voyez dans C est même pas la pointe de l'iceberg. Plutôt, c'est un sale boule de neige que quelqu'un dumping sur le bout de la pointe de l'iceberg. 🙂 Le premier couple de pages dans la suite de la gamme classic expliquer quelques-uns des principaux mérites de systèmes de type:
http://www.lucacardelli.name/Papers/TypeSystems.pdf
Permettez-moi seulement d'ajouter deux choses.
Tout d'abord, il y a une différence entre un langage typé, et exigeant (explicite) les déclarations de type. Certaines langues modernes, en particulier à partir de la fonctionnelle de camp, ont sophistiqué des systèmes de type qui pourtant ne vous demande pas d'écrire un seul type, la plupart du temps. Tous les types sont inférées par le compilateur.
Deuxième, un système de type essentiellement, c'est une logique. Une logique qui exprime certaines propriétés d'un programme, qui est ensuite vérifiée par le compilateur. En principe, il n'y a pas de limite à la puissance de cette logique peut être faite. C est un très ennuyeux exemple. Sur l'autre extrémité du spectre se trouvent les langues où vous pouvez, par exemple, exprimer le type de listes triées, et le type d'une fonction de tri, de sorte que la fonction uniquement de type vérifie si c'est réellement une bonne mise en œuvre d'un algorithme de tri. Évidemment, il est très utile si le compilateur peut effectivement vérifier l'exactitude de votre programme comme celui-ci. Cependant, il existe un compromis entre l'expressivité d'un type de système et la facilité d'utilisation, de sorte qu'en pratique, la plupart des principaux langages de finir sur le côté simpliste. Mais les domaines spéciaux parfois bénéficier de plus sophistiqué des systèmes de type énormément.
Voici un récent article dans CACM discuter (entre autres choses) les avantages du système de type trouvé dans le langage fonctionnel OCaml:
http://cacm.acm.org/magazines/2011/11/138203-ocaml-for-the-masses/
Oui, vous vous êtes trompé. La saisie est juste une pratique de l'abstraction. Ce qui importe est la façon dont vous utilisez le raw bits. Le typage permet de vous obliger à utiliser les bits de la manière prévue.
Mise à jour
Dans un sens, il permet de s'assurer de l'exactitude de votre programme en éliminant certaines erreurs courantes.
Disons que vous avez deux variables,
char var1 = 'a'
etint var2 = 10;
. Si vous avez accidentellement essayé d'ajoutervar1 + var2
, typé langue peut générer une erreur. Si ce n'était pas tapé, il pourrait heureux de vous donner le résultat de107
et de continuer. Il peut être difficile de savoir où107
vient, jusqu'à ce que vous vous rendez compte que la représentation ASCII dea
est de 97.Donc sur un point, oui, il s'assure de l'exactitude de votre programme. Mais il y a évidemment de nombreuses autres erreurs (erreurs logiques et autres) qui ne peuvent être évités ou identifiés en tapant seul.
OU......
Plus sophistiqué sans type de langue peut vous donner le résultat
qui ne peut pas être une erreur, selon la définition de l'opérateur"+".
'a' + 7
.