Compilation and interpretation · Compilation et interprétation
| English | Français |
|---|---|
| compiler/kəmˈpaɪlə/ | compilateur |
| interpreter/ɪnˈtɜːprɪtə/ | interpréteur |
| lexical analysis/ˈleksɪkl əˈnæləsɪs/ | analyse lexicale |
| tokens/ˈtəʊkənz/ | jetons |
| syntax analysis/ˈsɪntæks əˈnæləsɪs/ | analyse syntaxique |
| abstract syntax tree/ˈæbstrækt ˈsɪntæks triː/ | arbre syntaxique abstrait |
| syntax error/ˈsɪntæks ˈerə/ | erreur de syntaxe |
| semantic analysis/səˈmæntɪk əˈnæləsɪs/ | analyse sémantique |
| code generation/kəʊd ˌdʒenəˈreɪʃn/ | génération de code |
| code optimisation/kəʊd ˌɒptɪmaɪˈzeɪʃn/ | optimisation de code |
The bug that cost a spacecraft, found by a comma
- NASA's Mariner 1 was destroyed 293 seconds after launch in 1962. The failure is often blamed on a single wrong character in the guidance software.
- The story is retold so often because it is the fear every programmer knows: a compiler happily translating a program that says something you did not mean.
- A compiler is not one process but five, and each one catches a different class of mistake. Knowing which stage catches what tells you where any given error comes from.
- This lesson is how an interpreter 解释器 runs a program without producing anything, and the five stages a compiler 编译器 goes through.
Le bug qui a coûté un vaisseau spatial, révélé par une virgule
- Mariner 1 de la NASA a été détruit 293 secondes après le lancement en 1962. L'échec est souvent attribué à un seul caractère erroné dans le logiciel de guidage.
- L'histoire est racontée si souvent car c'est la peur que tout programmeur connaît : un compilateur traduisant joyeusement un programme qui dit quelque chose que vous ne vouliez pas dire.
- Un compilateur n'est pas un seul processus mais cinq, et chacun attrape une classe différente d'erreurs. Savoir quelle étape attrape quoi vous dit d'où vient toute erreur donnée.
- Cette leçon porte sur la façon dont un interpreter 解释器 exécute un programme sans produire quoi que ce soit, et les cinq étapes qu'un compiler 编译器 traverse.
How an interpreter runs a program
- An interpreter translates and runs the source at the same time, one statement at a time.
- For each statement it reads the line, analyses it, checks the types, then executes the action immediately, and moves to the next.
- It produces no executable file: the translation exists only in memory and is thrown away. That is the syllabus's exact point, that it can execute a program without producing a translated version.
- It reports an error the moment it reaches the offending line and usually stops, which gives quick feedback while developing. Every run re-translates, so it is slower, and both the source and the interpreter must be present.
Translate once and keep it, or translate and run and forget
Comment un interpréteur exécute un programme
- Un interpréteur traduit et exécute la source au même moment, une instruction à la fois.
- Pour chaque instruction, il lit la ligne, l'analyse, vérifie les types, puis exécute l'action immédiatement, et passe à la suivante.
- Il ne produit aucun fichier exécutable : la traduction n'existe que en mémoire et est jetée. C'est exactement le point du programme scolaire, qu'il puisse exécuter un programme sans produire une version traduite.
- Il signale une erreur dès qu'il atteint la ligne fautrice et s'arrête généralement, ce qui offre un feedback rapide pendant le développement. Chaque exécution re-traduit, donc c'est plus lent, et la source ainsi que l'interpréteur doivent être présents.

Traduire une fois et le garder, ou traduire et exécuter et oublier
An interpreter: · Un interpréteur :
It works line by line, reporting errors as it reaches them; nothing is saved as an executable, and it is generally slower. · Il fonctionne ligne par ligne, signalant les erreurs au fur et à mesure qu'il les rencontre ; rien n'est sauvegardé sous forme exécutable, et il est généralement plus lent.
An interpreter can execute a program without producing a translated version of it. · Un interpréteur peut exécuter un programme sans produire une version traduite de celui-ci.
The translation exists only in memory, statement by statement, and is discarded. That is why the interpreter must be present every time the program runs. · La traduction existe uniquement en mémoire, énoncé par énoncé, et est ensuite jetée. C'est pourquoi l'interpréteur doit être présent à chaque exécution du programme.
Stage 1: lexical analysis
- Lexical analysis 词法分析 groups the individual characters of the source into tokens 词法单元: keywords, identifiers, operators and literals.
- Whitespace and comments are discarded, since they have no meaning to the compiler, and identifiers are entered into a symbol table.
- So
total ← count * 2becomes the token sequence identifier, assignment, identifier, operator, literal. The lexer does not know or care whether that makes sense.
Étape 1 : analyse lexicale
- L'analyse lexicale 词法分析 regroupe les caractères individuels de la source en tokens 词法单元 : mots clés, identifiants, opérateurs et littéraux.
- Les espaces blancs et les commentaires sont discardés, car ils n'ont aucun sens pour le compilateur, et les identifiants sont inscrits dans une table des symboles.
- Ainsi
total ← count * 2devient la séquence de tokens identifiant, affectation, identifiant, opérateur, littéral. Le lexique ne sait ni ne se soucie si cela a du sens.
Lexical analysis (the lexer) turns: · L'analyse lexicale (le lexique) transforme :
The lexer groups characters into tokens and discards whitespace/comments; parsing then builds the tree. · Le lexique regroupe les caractères en jetons et ignore les espaces blancs/commentaires ; l'analyse syntaxique construit ensuite l'arbre.
Lexical analysis groups the source characters into ____ and discards whitespace and comments. · L'analyse lexicale regroupe les caractères source en ____ et ignore les espaces blancs et les commentaires.
Keywords, identifiers, operators and literals. The lexer makes no judgement about whether the sequence is a valid program. · Mots clés, identifiants, opérateurs et littéraux. Le lexique ne juge pas si la séquence constitue un programme valide.
Stage 2: syntax analysis
- Syntax analysis 语法分析, or parsing, checks that the sequence of tokens fits the language's grammar, and builds an abstract syntax tree 抽象语法树 representing the structure.
- A missing bracket, a missing
ENDIFor a keyword in the wrong place is caught here: that is what a syntax error 语法错误 is, and it is why the compiler can report one without ever running the program.
The grammar the parser checks against
Étape 2 : analyse syntaxique
- L'analyse syntaxique 语法分析, ou parsing, vérifie que la séquence de tokens respecte la grammaire du langage, et construit un arbre de syntaxe abstraite 抽象语法树 représentant la structure.
- Une accolade manquante, un
ENDIFmanquant ou un mot clé au mauvais endroit est capturé ici : c'est ce qu'est une syntax error 语法错误, et c'est pourquoi le compilateur peut en signaler une sans jamais exécuter le programme.

La grammaire contre laquelle le parser vérifie
Stage 3: semantic analysis
- Semantic analysis 语义分析 checks that a syntactically valid program actually makes sense: every variable is declared before use, the types on each side of an assignment are compatible, a function is called with the right number of arguments.
total ← "seven" * 2is perfectly good syntax and complete nonsense. Only this stage catches it.- This is the distinction the exam tests: syntax is form, semantics is meaning.
Étape 3 : analyse sémantique
- L'analyse sémantique 语义分析 vérifie qu'un programme syntaxiquement valide a véritablement du sens : chaque variable est déclarée avant usage, les types de chaque côté d'une affectation sont compatibles, une fonction est appelée avec le bon nombre d'arguments.
total ← "seven" * 2est une excellente syntaxe et un nonsens complet. Seule cette étape la capture.- C'est la distinction que l'examen teste : la syntaxe est la forme, la sémantique est le sens.
Which of these is checked by semantic analysis rather than syntax analysis? · Lequel de ces éléments est vérifié par l'analyse sémantique plutôt que par l'analyse syntaxique ?
Brackets are grammar, so syntax; whitespace is the lexer; registers are code generation. Declarations and types are meaning. · Les crochets relèvent de la grammaire, donc de la syntaxe ; les espaces blancs concernent le lexique ; les registres relèvent de la génération de code. Les déclarations et les types relèvent de la signification.
Stages 4 and 5: code generation and optimisation
- Code generation 代码生成 walks the tree and emits the target machine code, choosing registers and laying out the data.
- Code optimisation 代码优化 improves that code without changing what it does: removing redundant work, computing constant expressions at compile time, and reordering instructions to suit the pipeline.
- The output is a stand-alone executable that runs without the compiler present.
Five stages, and each one catches something the last could not
Étapes 4 et 5 : génération de code et optimisation
- Génération de code 代码生成 parcourt l'arbre et émet le code machine cible, en choisissant les registres et en organisant les données.
- Optimisation de code 代码优化 améliore ce code sans en modifier le comportement : en éliminant les travaux redondants, en calculant les expressions constantes à la compilation, et en réordonnant les instructions pour s'adapter au pipeline.
- La sortie est un exécutable autonome qui fonctionne sans que le compilateur ne soit présent.

Cinq étapes, et chacune capture une erreur que la précédente n'aurait pas pu détecter
The phases of compilation · Les phases de compilation
Step through what a compiler does to your source. Each phase hands its output to the next — characters become tokens, tokens become a tree, the tree becomes optimised machine code. · Parcourez ce qu'un compilateur fait à votre source. Chaque phase transmet sa sortie à la suivante — les caractères deviennent des jetons, les jetons forment un arbre, l'arbre devient du code machine optimisé.
Match each compiler phase to what it does. · Reliez chaque phase du compilateur à sa fonction.
Each phase transforms the program a step further: tokens, then a tree, then checked, then optimised code. · Chaque phase transforme le programme étape par étape : jetons, puis arbre, puis vérifié, enfin code optimisé.
Put the compiler stages in order. · Placez les étapes du compilateur dans l'ordre correct.
Lexical → syntax → semantic → code generation → optimisation. · Lexicale → Syntaxique → Sémantique → Génération de code → Optimisation.
Code optimisation aims to: · L'optimisation de code vise à :
Optimisation improves the generated code (constant folding, removing redundancy, reordering for the pipeline). · L'optimisation améliore le code généré (réduction de constantes, suppression de la redondance, réordonnancement pour le pipeline).
Worked example: which stage catches which error
x ← 5 +: the tokens do not fit the grammar, an operator with no right operand, so syntax analysis.x ← y + 1whereywas never declared: the form is fine but the meaning is not, so semantic analysis.IF a > b THEN OUTPUT awith noENDIF: syntax analysis again.- A program that runs and prints the wrong average: no stage catches it. That is a logic error, and only testing finds it. Name the stage and why the earlier ones let it through.
Exemple résolu : quelle étape capture quelle erreur
x ← 5 +: les jetons ne correspondent pas à la grammaire, un opérateur sans opérande droit, donc analyse syntaxique.x ← y + 1oùyn'a jamais été déclaré : la forme est correcte mais le sens ne l'est pas, donc analyse sémantique.IF a > b THEN OUTPUT aavec absence deENDIF: analyse syntaxique encore une fois.- Un programme qui s'exécute et affiche la mauvaise moyenne : aucune étape ne la détecte. C'est une erreur logique, seule la vérification (testing) la trouve. Nommez l'étape et expliquez pourquoi les précédentes l'ont laissé passer.
Match each faulty line to the compiler stage that catches it. · Reliez chaque ligne erronée à la phase du compilateur qui la détecte.
Syntax is form, semantics is meaning, and a logic error is valid in both but wrong in intent. · La syntaxe concerne la forme, la sémantique la signification, et une erreur logique est valide dans les deux mais fausse dans son intention.
Worked example: compare the two translators
- Give two differences between how a compiler and an interpreter handle a program. [4]
- A compiler translates the whole program before it runs and produces an executable, which then runs without the compiler; an interpreter translates and executes one statement at a time and produces no executable, so the interpreter must be present every run.
- A compiler reports all the errors together after translation; an interpreter reports the first error when it reaches that line and then stops.
- Each mark is a pairing: say what one does and what the other does instead.
Exemple résolu : comparer les deux traducteurs
- Donnez deux différences entre la manière dont un compilateur et un interpréteur traitent un programme. [4]
- Un compilateur traduit le programme entier avant son exécution et produit un exécutable, qui s'exécute ensuite sans le compilateur ; un interpréteur traduit et exécute un statement à la fois et ne produit pas d'exécutable, donc l'interpréteur doit être présent à chaque exécution.
- Un compilateur signale tous les erreurs ensemble après la traduction ; un interpréteur signale la première erreur lorsqu'il atteint cette ligne puis s'arrête.
- Chaque point attribué correspond à une association : décrivez ce que fait l'un et ce que fait l'autre au lieu de cela.
Marks that slip away
- An interpreter produces no translated version. That is the phrase the syllabus uses and the mark it awards.
- The lexer produces tokens and discards whitespace and comments; it does not check whether the program is valid.
- Syntax is form, semantics is meaning. An undeclared variable is a semantic error, not a syntax error.
- Optimisation must not change what the program does, only how quickly or compactly it does it.
Pièges qui font perdre des points
- Un interpréteur ne produit aucune version traduite. C'est la formulation utilisée dans le syllabus et celle qui rapporte le point.
- Le lexiqueur produit des jetons et ignore les espaces blancs et les commentaires ; il ne vérifie pas si le programme est valide.
- La syntaxe 语法 est la forme, la sémantique 语义 est le sens. Une variable non déclarée est une erreur sémantique, pas une erreur syntaxique.
- L'optimisation ne doit pas changer ce que fait le programme, seulement la rapidité ou la compacité avec lesquelles il le fait.
You've got it
- an interpreter translates and executes one statement at a time, producing no executable, reporting the first error at its line, and re-translating on every run
- lexical analysis makes tokens and discards whitespace and comments; syntax analysis checks the grammar and builds an abstract syntax tree, catching syntax errors
- semantic analysis checks meaning: declarations, types, argument counts
- code generation emits machine code and optimisation improves it without changing behaviour, giving a stand-alone executable
Vous avez compris
- un interpréteur traduit et exécute un statement à la fois, ne produisant pas d'exécutable, signalant la première erreur à sa ligne, et re-traduisant à chaque exécution
- l'analyse lexicale génère des jetons et ignore les espaces blancs et les commentaires ; l'analyse syntaxique vérifie la grammaire et construit un arbre syntaxique abstrait, capturant les erreurs syntaxiques
- l'analyse sémantique vérifie le sens : les déclarations, les types, le nombre d'arguments
- la génération de code émet du code machine et l'optimisation l'améliore sans en modifier le comportement, donnant un exécutable autonome