Compilação E Tradução - Organização De Computadores
Dissertações: Compilação E Tradução - Organização De Computadores. Pesquise 862.000+ trabalhos acadêmicosPor: • 21/1/2015 • 1.331 Palavras (6 Páginas) • 923 Visualizações
Explique em detalhes as diferenças entre compilação e tradução sob a ótica da organização de processadores.
Para executar uma tarefa qualquer, um computador precisa receber instruções precisas sobre o que fazer. Uma seqüência adequada de instruções de computador, para a realização de uma determinada tarefa, se constitui num PROGRAMA de computador. Uma linguagem de programação é um conjunto de ferramentas, regras de sintaxe e símbolos ou códigos que nos permitem escrever programas de computador, destinados a instruir o computador para a realização de suas tarefas. A primeira e mais primitiva linguagem de computador é a própria linguagem de máquina, aquela que o computador entende diretamente e pode ser diretamente executada pelos circuitos do processador (pelo hardware). No início da era da computação, os programas eram escritos em linguagem de máquina, isto é, as instruções eram escritas diretamente na linguagem do computador (formada apenas com 1′s e 0′s). Um programa em linguagem de máquina é uma longa série de 0′s e 1′s, ordenados de forma que alguns representam códigos de instruções e outros representam os dados que serão processados (ou indicam onde esses dados estão armazenados). Em um programa escrito em linguagem de máquina, cada instrução escrita pelo programador será individualmente executada, isto é, a cada instrução do programa corresponderá uma ação do computador. A relação é portanto 1 para 1 – uma instrução do programa corresponde a uma operação do computador.
TRADUÇÃO
Um programa escrito por um programador (chamado código fonte) em uma linguagem de alto nível é um conjunto de instruções que é clara para programadores, mas não para computadores. Ou seja, os computadores entendem única e exclusivamente suas linguagens nativas, as linguagens de máquina. Programas em linguagem de alto nível, a exemplo dos programas escritos em linguagem de Montagem, também precisam ser traduzidos para linguagem de máquina para poderem ser submetidos ao computador e processados. O processo de tradução do programa escrito em uma linguagem simbólica pelo programador, chamado código fonte (source code) para a linguagem de máquina do computador chamada código objeto (object code), é chamado compilação e é realizado por um programa chamado Compilador (Compiler). Tradução sucessiva de uma linguagem para outra intermediária mais simples, da linguagem fonte até à linguagem objeto.
Cada tradução pode dividir-se nas seguintes fases:
Análise Léxica (scanner)
Ele separa a sequência de caracteres que representa o programa fonte em entidades ou tokens, símbolos básicos da linguagem. Durante a análise léxica, os tokens são classificados como palavras reservadas, identificadores, símbolos especiais, constantes de tipos básicos (inteiro real, literal, etc.), entre outras categorias. Basicamente é reconhecer as sequências de símbolos que representam uma unidade. Ex.: o nome de uma variável, uma constante, uma palavra chave de uma instrução (while). Um token consiste de um par ordenado (valor, classe). A classe indica a natureza da informação contida em valor. Outras funções atribuídas ao analisador léxico são: ignorar espaços em branco e comentários, e detectar erros léxicos.
Análise Sintática (parser)
Ele agrupa os tokens fornecidos pelo analisador léxico em estruturas sintáticas, construindo a árvore sintática correspondente. Para isso, utiliza uma série de regras de sintaxe, que constituem a gramática da linguagem fonte. É a gramática da linguagem que define a estrutura sintática do programa fonte. O analisador sintático tem também por tarefa o reconhecimento de erros sintáticos, que são construções do programa fonte que não estão de acordo com as regras de formação de estruturas sintáticas como especificado pela gramática. Identifica a estrutura gramatical do programa e reconhece o papel de cada componente. É normalmente construída uma árvore sintática do programa e uma tabela de símbolos, que identifica variáveis.
Analisador Semântico
O compilador executa ainda a análise semântica. O analisador semântico utiliza a árvore sintática determinada pelo analisador sintático para: identificar operadores e operandos das expressões, reconhecer erros semânticos, fazer verificações de compatibilidade de tipo, analisar o escopo das variáveis, fazer verificações de correspondência entre parâmetros atuais e formais. Fundamentalmente, a análise semântica trata os aspectos sensíveis ao contexto da sintaxe das linguagens de programação. Por exemplo, não é possível representar em uma gramática livre de contexto uma regra como “Todo identificador deve ser declarado antes de ser usado.“, e a verificação de que essa regra foi aplicada cabe à análise semântica.
Otimização de Código
O processo de otimização de código consiste em melhorar o código intermediário de tal forma que o programa objeto resultante seja mais rápido em tempo de execução. Por exemplo, um algoritmo para geração do código intermediário gera uma instrução para cada operador na árvore sintática, mesmo que exista uma maneira mais otimizada de realizar o mesmo comando.
Geração de Código
A fase final do compilador é a geração do código para o programa objeto, consistindo normalmente de código em linguagem assembly ou de código em linguagem de máquina. Aqui é o processo de construir instruções da linguagem máquina (em assembly, normalmente) que simulam as instruções reconhecidas pelo analisador sintáctico. A geração de código pode englobar: análise semântica, geração de código intermédio, otimizadores e geração de código final.
MONTAGEM
O processo de montagem traduz um programa escrito em linguagem Assembly em um programa equivalente em linguagem de máquina, possível de ser executado pelo computador. A seguir, é apresentado o fluxo que representa o processo de montagem.
No processo de montagem, o código fonte (programa em linguagem simbólica escrito pelo programador) é examinado, instrução por instrução e é feita a tradução, gerando o código que será executado (código objeto). Os passos executados pelo programa Montador são:
1. Verificar a correção do código de instrução (se o mnemônico corresponde a uma instrução válida para o computador, se os campos definidos na estrutura da linguagem e a sintaxe estão corretos) e substituir os mnemônicos pelos códigos numéricos binários equivalentes. Qualquer erro no código acarreta a interrupção do processo e a emissão de mensagem de erro.
2. Resolver as referências de memória: os nomes simbólicos adotados pelo programador são convertidos para endereços reais de memória (valores numéricos binários de endereços).
3. Reservar espaço em memória para o armazenamento das instruções e dados.
4. Converter valores de constantes em binário.
COMPILAÇÃO
Compilação é o processo de tradução de um programa escrito em linguagem de alto nível para código em linguagem de máquina. Compilação é um processo análogo ao da montagem (verificação / análise do código fonte, resolução das referências de memória, reserva de espaço em memória e conversão para código de máquina binário). O que diferencia a compilação do processo de montagem é sua maior complexidade. No processo de montagem, há uma relação de 1:1, ou seja, cada instrução do código fonte resulta em uma instrução de máquina, enquanto na compilação a relação é múltipla, cada instrução do código fonte gerando várias instruções de máquina.
Durante a compilação, o código fonte é analisado (análise léxica, sintática e semântica), é gerado um código intermediário e são construídas tabelas de símbolos, alocam-se as áreas de memória para variáveis e atribui-se os registradores a serem utilizados, e é finalmente gerado o código objeto em linguagem binária de máquina. Em alguns compiladores, é gerado um código intermediário em Assembly (que pode ser visualizado pelo programador) e que em seguida passa pelo montador para gerar finalmente o código objeto em linguagem de máquina.
O código objeto pode ser absoluto (os endereços constantes são endereços reais de memória) ou relocável (os endereços são relativos, tendo como referência o início do programa, e os endereços reais de memória são definidos apenas em tempo de execução).
Tipos de Compiladores:
• Single-Pass: compilação numa única leitura do programa fonte
• Multi-Pass: compilação através de várias leituras do programa fonte
• Load-And-Go: compilação e a execução do programa fonte
• Debugging: compilação permitindo a depuração do programa fonte
• Optimizing: compilação e a otimização do programa alvo
Vantagens:
• O código compilado é mais rápido de ser acessado;
• Impossibilita ou pelo menos dificulta ser quebrado e visualizado o código-fonte original;
• Permite otimização do código por parte do compilador;
• Compila o código somente se estiver sem algum erro.
Desvantagens:
• Para ser utilizado o código precisa passar por muitos níveis de compilação;
• Assim como vantagem a possibilidade de não poder visualizar o código-fonte, pode ser uma desvantagem;
• Processo de correção ou alteração do código requer que ele seja novamente recompilado.
Bibliografia:
MONTEIRO, Mario A. Introdução à Organização de Computadores. 5ª edição. São Paulo, 2012.
http://www-asc.di.fct.unl.pt/~jcc/asc1-05-06/Teoricas/a2/node3.html
http://www.diegomacedo.com.br/conversoes-de-linguagens-traducao-montagem-compilacao-ligacao-e-interpretacao/
...