464 votes

Runtime vs Compiler le temps

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?

564voto

Norman Ramsey Points 115730

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

  1. Ce invariants le programme fait-il satisfaire?
  2. Ce qui peut aller mal dans cette phase?
  3. Si la phase aboutit, ce sont les postconditions (que savons-nous)?
  4. Quelles sont les entrées et les sorties, le cas échéant?

Moment de la compilation

  1. 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...
  2. Ce qui peut aller mal au moment de la compilation:
    • Les erreurs de syntaxe
    • Le typage des erreurs
    • (Rarement) compilateur se bloque
  3. 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.)
  4. 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

  1. 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.
  2. 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é
  3. Si au moment de l'exécution réussit, le programme se termine (ou continue) sans s'écraser.
  4. 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 :-)

237voto

pufferfish Points 3512

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.

104voto

Yuval Adam Points 59423

Compile-time: la période pendant laquelle vous, le développeur, compilez votre code.

Run-time: période pendant laquelle un utilisateur exécute votre logiciel.

Avez-vous besoin d'une définition plus claire?

25voto

M4N Points 48758

(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

23voto

dmckee Points 50318

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):

  1. 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).
  2. 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)):

  1. 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).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X