Compilation and interpretation · Compilação e interpretação
| English | Português |
|---|---|
| compiler/kəmˈpaɪlə/ | compilador |
| interpreter/ɪnˈtɜːprɪtə/ | intérprete |
| lexical analysis/ˈleksɪkl əˈnæləsɪs/ | análise léxica |
| tokens/ˈtəʊkənz/ | tokens |
| syntax analysis/ˈsɪntæks əˈnæləsɪs/ | análise sintática |
| abstract syntax tree/ˈæbstrækt ˈsɪntæks triː/ | árvore sintática abstrata |
| syntax error/ˈsɪntæks ˈerə/ | erro de sintaxe |
| semantic analysis/səˈmæntɪk əˈnæləsɪs/ | análise semântica |
| code generation/kəʊd ˌdʒenəˈreɪʃn/ | geração de código |
| code optimisation/kəʊd ˌɒptɪmaɪˈzeɪʃn/ | otimização de código |
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.
O bug que custou uma espaçonave, encontrado por uma vírgula
- A Mariner 1 da NASA foi destruída 293 segundos após o lançamento em 1962. A falha é frequentemente atribuída a um único caractere errado no software de orientação.
- A história é contada tantas vezes porque é o medo que todo programador conhece: um compilador traduzindo felizmente um programa que diz algo que você não quis dizer.
- Um compilador não é um único processo, mas cinco, e cada um captura uma classe diferente de erro. Saber qual etapa captura o quê diz de onde vem qualquer erro dado.
- Esta aula é como um interpretador 解释器 executa um programa sem produzir nada, e as cinco etapas pelas quais um compilador 编译器 passa.
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
Como um interpretador executa um programa
- Um interpretador traduz e executa a fonte ao mesmo tempo, uma declaração por vez.
- Para cada declaração, lê a linha, analisa-a, verifica os tipos, então executa a ação imediatamente, e passa para a próxima.
- Não produz nenhum arquivo executável: a tradução existe apenas na memória e é descartada. Este é o ponto exato do currículo, de que pode executar um programa sem produzir uma versão traduzida.
- Relata um erro no momento em que alcança a linha ofensora e geralmente para, o que fornece feedback rápido durante o desenvolvimento. Toda execução re-traduz, então é mais lento, e tanto a fonte quanto o interpretador devem estar presentes.

Traduza uma vez e mantenha, ou traduza e execute e esqueça
An interpreter: · Um interpretador:
It works line by line, reporting errors as it reaches them; nothing is saved as an executable, and it is generally slower. · Funciona linha por linha, reportando erros à medida que os encontra; nada é salvo como executável e, geralmente, é mais lento.
An interpreter can execute a program without producing a translated version of it. · Um interpretador pode executar um programa sem produzir uma versão traduzida dele.
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. · A tradução existe apenas na memória, frase por frase, e é descartada. É por isso que o interpretador precisa estar presente toda vez que o programa roda.
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.
Etapa 1: análise léxica
- Análise léxica 词法分析 agrupa os caracteres individuais da fonte em tokens 词法单元: palavras-chave, identificadores, operadores e literais.
- Espaços em branco e comentários são descartados, já que não têm significado para o compilador, e identificadores são inseridos em uma tabela de símbolos.
- Então
total ← count * 2torna-se a sequência de tokens identificador, atribuição, identificador, operador, literal. O lexer não sabe nem se importa se isso faz sentido.
Lexical analysis (the lexer) turns: · Análise léxica (o lexer) transforma:
The lexer groups characters into tokens and discards whitespace/comments; parsing then builds the tree. · O lexer agrupa caracteres em tokens e descarta espaços em branco/comentários; a análise sintática então constrói a árvore.
Lexical analysis groups the source characters into ____ and discards whitespace and comments. · A análise léxica agrupa os caracteres fonte em ____ e descarta espaços em branco e comentários.
Keywords, identifiers, operators and literals. The lexer makes no judgement about whether the sequence is a valid program. · Palavras-chave, identificadores, operadores e literais. O lexer não julga se a sequência é um programa válido.
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
Etapa 2: análise sintática
- Análise sintática 语法分析, ou parsing, verifica se a sequência de tokens se encaixa na gramática da linguagem e constrói uma árvore de sintaxe abstrata 抽象语法树 representando a estrutura.
- Uma chave de fecho em falta, um
ENDIFem falta ou uma palavra-chave no lugar errado é detetado aqui: é isso que um syntax error 语法错误 é, e é por isso que o compilador pode reportar um sem jamais executar o programa.

A gramática que o parser verifica
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.
Etapa 3: análise semântica
- Análise semântica 语义分析 verifica se um programa sintaticamente válido realmente faz sentido: toda variável é declarada antes do uso, os tipos em ambos os lados de uma atribuição são compatíveis, uma função é chamada com o número correto de argumentos.
total ← "seven" * 2é sintaxe perfeita e nonsense completo. Apenas esta etapa a captura.- Esta é a distinção que o exame testa: sintaxe é forma, semântica é significado.
Which of these is checked by semantic analysis rather than syntax analysis? · Qual destes é verificado pela análise semântica em vez da análise sintática?
Brackets are grammar, so syntax; whitespace is the lexer; registers are code generation. Declarations and types are meaning. · Colchetes são gramática, logo sintaxe; espaços em branco são do lexer; registradores são geração de código. Declarações e tipos são significado.
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
Etapas 4 e 5: geração de código e otimização
- Geração de código 代码生成 percorre a árvore e emite o código da máquina alvo, escolhe registradores e organiza os dados.
- Otimização de código 代码优化 melhora esse código sem alterar seu comportamento: remove trabalho redundante, calcula expressões constantes em tempo de compilação e reorganiza instruções para se adequar ao pipeline.
- A saída é um executável autônomo que roda sem a presença do compilador.

Cinco etapas, e cada uma captura algo que a anterior não poderia
The phases of compilation · As fases da compilação
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. · Passo a passo do que um compilador faz com seu código-fonte. Cada fase entrega sua saída para a próxima — caracteres tornam-se tokens, tokens tornam-se uma árvore, a árvore torna-se código máquina otimizado.
Match each compiler phase to what it does. · Associe cada fase do compilador ao que ela faz.
Each phase transforms the program a step further: tokens, then a tree, then checked, then optimised code. · Cada fase transforma o programa um passo adiante: tokens, depois uma árvore, depois verificado, depois código otimizado.
Put the compiler stages in order. · Coloque as etapas do compilador em ordem.
Lexical → syntax → semantic → code generation → optimisation. · Léxico → Sintático → Semântico → Geração de código → Otimização.
Code optimisation aims to: · A otimização de código visa:
Optimisation improves the generated code (constant folding, removing redundancy, reordering for the pipeline). · A otimização melhora o código gerado (dobramento de constantes, remoção de redundância, reordenação para o 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.
Exemplo resolvido: qual etapa captura qual erro
x ← 5 +: os tokens não se encaixam na gramática, um operador sem operando direito, portanto análise sintática.x ← y + 1ondeynunca foi declarado: a forma está correta, mas o significado não, então análise semântica.IF a > b THEN OUTPUT acom nenhumENDIF: análise sintática novamente.- Um programa que roda e imprime a média errada: nenhuma etapa o captura. Isso é um erro lógico, e apenas testes o encontram. Nomeie a etapa e explique por que as anteriores deixaram passar.
Match each faulty line to the compiler stage that catches it. · Associe cada linha com erro à etapa do compilador que a detecta.
Syntax is form, semantics is meaning, and a logic error is valid in both but wrong in intent. · Sintaxe é forma, semântica é significado, e um erro lógico é válido em ambos mas errado na intenção.
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.
Exemplo resolvido: compare os dois tradutores
- Dê duas diferenças entre como um compilador e um interpretador lidam com um programa. [4]
- Um compilador traduz o programa inteiro antes de executá-lo e produz um executável, que depois roda sem o compilador; um interpretador traduz e executa uma instrução por vez e não produz executável, exigindo que o interpretador esteja presente em toda execução.
- Um compilador relata todos os erros juntos após a tradução; um interpretador relata o primeiro erro quando atinge essa linha e então para.
- Cada ponto é um par: diga o que um faz e o que o outro faz em vez disso.
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.
Marcas que escapam
- Um interpretador não produz versão traduzida. Essa é a expressão usada pelo currículo e pela pontuação atribuída.
- O lexer produz tokens e descarta espaços em branco e comentários; ele não verifica se o programa é válido.
- Sintaxe é forma, semântica é significado. Uma variável não declarada é um erro semântico, não sintático.
- A otimização não pode alterar o que o programa faz, apenas quão rápido ou compactamente ele o faz.
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
Entendeu?
- um interpretador traduz e executa uma instrução por vez, produzindo nenhum executável, reportando o primeiro erro em sua linha, e retraduzindo em cada execução
- Análise léxica cria tokens e descarta espaços em branco e comentários; análise sintática verifica a gramática e constrói uma árvore de sintaxe abstrata, capturando erros sintáticos
- Análise semântica verifica o significado: declarações, tipos, contagem de argumentos
- Geração de código emite código de máquina e otimização melhora-o sem alterar o comportamento, resultando em um executável autônomo