Quelqu'un peut-il s'il vous plaît me donner une bonne compréhension de ce qui fait la différence entre l'exécution et la compilation?
Réponses
Trop de publicités?La différence entre les temps de compilation et de l'exécution est un exemple de ce que pointu dirigé théoriciens appellent la phase de distinction. Il est l'un des plus difficiles de concepts à apprendre, surtout pour les gens sans beaucoup de fond dans les langages de programmation. À l'approche de ce problème, je trouve utile de demander
- Ce invariants le programme fait-il satisfaire?
- Ce qui peut aller mal dans cette phase?
- Si la phase aboutit, ce sont les postconditions (que savons-nous)?
- Quelles sont les entrées et les sorties, le cas échéant?
Moment de la compilation
- Le programme n'a pas besoin de satisfaire tous les invariants. En fait, il n'a pas besoin d'être bien formée programme. Vous pourrait nourrir ce code HTML pour le compilateur et le regarder barf...
- Ce qui peut aller mal au moment de la compilation:
- Les erreurs de syntaxe
- Le typage des erreurs
- (Rarement) compilateur se bloque
- Si le compilateur réussit, que savons-nous?
- Le programme a été bien formé---un véritable programme dans quelque langue que ce soit.
- Il est possible de commencer l'exécution du programme. (Le programme peut échouer immédiatement, mais au moins nous pouvons essayer.)
- Quelles sont les entrées et les sorties?
- L'entrée était le programme compilé, plus les fichiers d'en-tête, des interfaces, des bibliothèques ou d'autres vaudou qu'il fallait l' importer dans le but d'obtenir compilé.
- Sortie est, espérons-le code assembleur ou amovibles de code objet ou même un programme exécutable. Ou si quelque chose va mal, la sortie est un tas de messages d'erreur.
Moment de l'exécution
- Nous ne savons rien sur les invariants---ils sont ce que le programmeur. Au moment de l'exécution les invariants sont rarement appliquées par le compilateur seul; il a besoin de l'aide du programmeur.
-
Ce qui peut aller mal sont des erreurs d'exécution:
- La Division par zéro
- Deferencing un pointeur null
- À cours de mémoire
Il peut aussi y avoir des erreurs détectées par le programme lui-même:
- Essayez d'ouvrir un fichier qui n'est pas là
- En essayant de trouver une page web et découvrir qu'un présumé de l'URL n'est pas bien formé
- Si au moment de l'exécution réussit, le programme se termine (ou continue) sans s'écraser.
- Les entrées et les sorties sont entièrement à la programmeur. Fichiers, windows sur l'écran, les paquets réseau, les travaux envoyés à l'imprimante, vous le nom. Si le programme se lance missiles, c'est une sortie, et qu'il n'arrive qu'au moment de l'exécution :-)
Je pense à cela en termes d'erreurs, et quand ils peuvent être attrapés.
Compiler le temps:
string my_value = Console.ReadLine();
int i = my_value;
Un int ne peut pas être assigné une valeur de chaîne, ainsi le compilateur peut savoir avec certitude que ce code a un problème, c.-à-d. Qu'il peut être attrapé au moment de la compilation
Temps d'exécution:
string my_value = Console.ReadLine();
int i = int.Parse(my_value);
Ici, le résultat dépend de la valeur qui a été donnée par l'utilisateur, certaines valeurs peuvent être analysées par un int, d'autres ne le peuvent pas, c'est-à-dire qu'elles ne peuvent être détectées qu'au moment de l'exécution.
(edit: ce qui suit s'applique à C# et similaires, fortement typé langages de programmation. Je ne sais pas si cela vous aide).
Par exemple, l'erreur suivante sera détectée par le compilateur (au moment de la compilation) avant d'exécuter un programme et le résultat sera une erreur de compilation:
int i = "string"; --> error at compile-time
D'autre part, un message d'erreur semblable au suivant peut pas être détectée par le compilateur. Vous recevrez un message d'erreur/exception au moment de l'exécution (lorsque le programme est exécuté).
Hashtable ht = new Hashtable();
ht.Add("key", "string");
// the compiler does not know what is stored in the hashtable
// under the key "key"
int i = (int)ht["key"]; // --> exception at run-time
La traduction du code source dans des trucs-passe-sur-le-[écran|disque|réseau] peut se produire dans (environ) de deux façons; appeler la compilation et l'interprétation.
Dans un compilé de programme (exemples sont en c et fortran):
- Le code source est introduit dans un autre programme (généralement appelé un compilateur--allez comprendre), qui produit un programme exécutable (ou une erreur).
- L'exécutable est lancé (en double-cliquant dessus, ou en tapant son nom sur la ligne de commande)
Les choses qui se produisent dans la première étape sont dit d'arriver à la "compilation", des choses qui arrivent dans la deuxième étape sont dit d'arriver au "temps d'exécution".
Dans un interprétée programme (exemple MicroSoft de base (sur le dos) et python (je pense)):
- Le code source est introduit dans un autre programme (généralement appelé un interprète), qui "court" directement. Ici, l'interprète sert comme une couche intermédiaire entre votre programme et le système d'exploitation (ou le matériel dans de très simple, ordinateurs).
Dans ce cas, la différence entre les temps de compilation et de l'exécution est plutôt difficile à cerner, et beaucoup moins pertinents pour le programmeur ou l'utilisateur.
Java est une sorte d'hybride, où le code est compilé en bytecode, qui ensuite s'exécute sur une machine virtuelle qui est habituellement un interprète pour le "bytecode".
Il y a aussi un cas intermédiaire dans lequel le programme est compilé en bytecode et exécuter immédiatement (comme dans awk ou perl).