Commit 36ec2130 authored by Eduardo de Santana Medeiros Alexandre's avatar Eduardo de Santana Medeiros Alexandre
Browse files

traducao

parent e4025034
......@@ -414,14 +414,9 @@ entradas e saídas de seu processamento. Estas fases e seus respectivos
softwares envolvidos são descritas nas seções seguintes.
////
Podemos observa na <<fig_processo_traducao>> o processo de *((tradução))* e *((ligação))* do código
fonte, escrito em linguagens de programação, em código binário executável.
todos os passos necessários para que um
algoritmo expresso em uma linguagem de programação possa ser carregado em
memória para ser executado por um computador. Cada fase possui um conjunto de
entradas e saídas de seu processamento. Estas fases e seus respectivos
softwares envolvidos são descritas nas seções seguintes.
Podemos observa na <<fig_processo_traducao>> o processo de *((tradução))* e *((ligação))* de códigos
fonte, escrito em linguagens de programação, em um código binário executável. Nesta seção vamos
abordar apenas o processo de tradução (montagem ou compilação), o processo de ligação será visto depois.
////
......@@ -485,6 +480,105 @@ digraph automata_0 {
}
----
==== Processo de Montagem
(((Montador)))
O processo de traduzir um programa em linguagem de montagem para programa em
linguagem de máquina é chamado de *((processo de montagem))*. Este é um processo
simples, uma vez que existe um mapeamento de um para um dos comandos em
linguagem de montagem para seus correspondentes em linguagem de máquina.
No processo de montagem, a instrução abaixo poderia ser traduzida no código
binário presente na <<fig_exemplo_instrucao>>.
STORE [0xF3], regC
////
Isto
é o contrário da compilação, onde um comando em linguagem de alto nível
pode ser traduzido em vários comandos em linguagem de máquina.
////
===== Características dos softwares montadores
// TODO Repensar. Muitos termos técnicos. Detalhes que são mencionados e não
// são explicados. Talvez simplesmente indicar uma fonte onde
// o aluno possa encontrar estas informações, caso deseje.
Embora a montagem seja um processo simples, é tedioso e passível de erros
quando feito manualmente. Montadores comerciais têm ao menos as seguintes
características:
* Permitem ao programador especificar posição de valores de dados e programas
durante a execução;
* Permitem que o programador de início realize valores de dados na memória
antes da execução do programa;
* Implementam mnemônicos em linguagem de montagem para todas as instruções
da máquina e modos de endereçamento, e traduzem comandos em linguagem de
montagem válidos, nos seus equivalentes em linguagem de máquina;
* Permitem o uso de rótulos simbólicos para representar endereços e
constantes;
* Incluem um mecanismo que permite que variáveis sejam definidas em um
programa em linguagem de montagem e usadas em outros programas separadamente;
* Possibilitam a expansão de macros, ou seja, rotinas (semelhantes às funções
em linguagem de alto nível) que podem ser definidas uma vez e então
instanciadas quantas vezes necessário.
===== Por que usar uma Linguagem de Montagem?
// TODO Repensar onde colocar esta seção, me parece não essencial.
// Ela atrapalha o racionício que está sendo construído na seção.
Programar em uma linguagem de montagem não é fácil. Além da dificuldade, o
desenvolvimento de um programa na linguagem de montagem consome mais tempo do
que seu desenvolvimento em uma linguagem de alto nível. A depuração e
manutenção dos programas em linguagem de montagem são mais complicados.
Nessas condições, por que alguém escolheria programar em uma linguagem de
montagem?
Existem duas razões que justificam esta opção: performance e acesso aos recursos
da máquina. Um expert na linguagem de montagem pode produzir um código menor
e muito mais eficiente do que o gerado por um programador usando linguagem de
alto nível.
Em segundo lugar, certos procedimentos precisam ter acesso total ao hardware.
Por exemplo, se a máquina alvo tiver um bit para expressar o overflow de
operações aritméticas, um programa em linguagem de montagem pode testar
diretamente este bit, coisa que um programa em Java não pode fazer. Além
disso, um programa em linguagem de montagem pode executar qualquer uma das
instruções do conjunto de instruções da máquina alvo.
===== Montadores de dois passos
// TODO Repensar onde colocar esta seção, me parece não essencial.
// Ela atrapalha o racionício que está sendo construído na seção.
A maioria dos montadores leem textos do programa em linguagem de montagem duas
vezes, e são chamados de ``montadores de dois passos''. O primeiro passo
serve para determinar o endereço de todos os itens de dados e instruções de
máquina, e selecionar quais instruções devem ser geradas para cada
instrução em linguagem de montagem (mais ainda não gerá-las).
Os endereços dos itens de dados e instruções são determinados por meio do
uso de um contador de programa para a montagem, chamado contador de
localização. O contador de localização gerencia o endereço da instrução
executada e dos itens de dados durante a montagem, que geralmente é
inicializada com `0` (zero). No início do primeiro passo, é incrementado de
acordo com o tamanho de cada instrução.
Durante este passo, o montador também efetua quaisquer operações
aritméticas em tempo de montagem, e insere as definições de todos os
rótulos de funções e variáveis e as constantes, em uma tabela chamada
Tabela de Símbolos.
A razão principal para exigir uma segunda passagem é permitir que símbolos
sejam usados no programa antes de serem definidos. Após a primeira passagem, o
montador terá identificado todos os símbolos e os colocado na Tabela de
Símbolos, já durante a segunda passagem, gerará código de máquina,
inserindo os identificadores dos símbolos que agora são conhecidos.
==== Processo de Compilação
......@@ -500,14 +594,14 @@ muito mais complexo.
Considere o comando simples abaixo:
A = B + 4;
a = b + 4;
O compilador tem que resolver um número grande de tarefas na conversão deste
comando em um ou mais comandos em linguagem de montagem:
. Reduzir o texto do programa para símbolos básicos da linguagem, como
identificadores tais como A e B, demarcações como o valor constante 4 e
delimitadores do programa tais como = e +. Esta parte da compilação é
identificadores tais como `a` e `b`, demarcações como o valor constante 4 e
delimitadores do programa tais como `=` e `+`. Esta parte da compilação é
chamada de ((análise léxica)).
. Decodificar os símbolos para reconhecer a estrutura do programa. No comando
......@@ -556,85 +650,6 @@ rápido (tenha tempo de execução menor). A saída do otimizador de código é
um novo ((código intermediário)).
==== Processo de Montagem
(((Montador)))
O processo de traduzir um programa em linguagem de montagem para programa em
linguagem de máquina é chamado de processo de montagem. Este processo é
muito simples, uma vez que existe um mapeamento um para um de comandos em
linguagem de montagem para seus correspondentes em linguagem de máquina. Isto
é o contrário da compilação, onde um comando em linguagem de alto nível
pode ser traduzido em vários comandos em linguagem de máquina.
===== Por que usar uma Linguagem de Montagem?
Programar em uma linguagem de montagem não é fácil. Além da dificuldade, o
desenvolvimento de um programa na linguagem de montagem consome mais tempo do
que seu desenvolvimento em uma linguagem de alto nível. A depuração e
manutenção dos programas em linguagem de montagem são mais complicados.
Nessas condições, por que alguém escolheria programar em uma linguagem de
montagem?
Existem duas razões que justificam esta opção: performance e acesso aos recursos
da máquina. Um expert na linguagem de montagem pode produzir um código menor
e muito mais eficiente do que o gerado por um programador usando linguagem de
alto nível.
Em segundo lugar, certos procedimentos precisam ter acesso total ao hardware.
Por exemplo, se a máquina alvo tiver um bit para expressar o overflow de
operações aritméticas, um programa em linguagem de montagem pode testar
diretamente este bit, coisa que um programa em Java não pode fazer. Além
disso, um programa em linguagem de montagem pode executar qualquer uma das
instruções do conjunto de instruções da máquina alvo.
===== Tarefas do montador
Embora a montagem seja um processo simples, é tedioso e passível de erros
quando feito manualmente. Montadores comerciais têm ao menos as seguintes
características:
* Permitem ao programador especificar posição de valores de dados e programas
durante a execução;
* Permitem que o programador de início realize valores de dados na memória
antes da execução do programa;
* Implementam mnemônicos em linguagem de montagem para todas as instruções
da máquina e modos de endereçamento, e traduzem comandos em linguagem de
montagem válidos, nos seus equivalentes em linguagem de máquina;
* Permitem o uso de rótulos simbólicos para representar endereços e
constantes;
* Incluem um mecanismo que permite que variáveis sejam definidas em um
programa em linguagem de montagem e usadas em outros programas separadamente;
* Possibilitam a expansão de macros, ou seja, rotinas (semelhantes às funções
em linguagem de alto nível) que podem ser definidas uma vez e então
instanciadas quantas vezes necessário.
===== Montadores de dois passos
A maioria dos montadores leem textos do programa em linguagem de montagem duas
vezes, e são chamados de “montadores de dois passos”. O primeiro passo
serve para determinar o endereço de todos os itens de dados e instruções de
máquina, e selecionar quais instruções devem ser geradas para cada
instrução em linguagem de montagem (mais ainda não gerá-las).
Os endereços dos itens de dados e instruções são determinados por meio do
uso de um contador de programa para a montagem, chamado contador de
localização. O contador de localização gerencia o endereço da instrução
executada e dos itens de dados durante a montagem, que geralmente é
inicializada com `0` (zero). No início do primeiro passo, é incrementado de
acordo com o tamanho de cada instrução.
Durante este passo, o montador também efetua quaisquer operações
aritméticas em tempo de montagem, e insere as definições de todos os
rótulos de funções e variáveis e as constantes, em uma tabela chamada
Tabela de Símbolos.
A razão principal para exigir uma segunda passagem é permitir que símbolos
sejam usados no programa antes de serem definidos. Após a primeira passagem, o
montador terá identificado todos os símbolos e os colocado na Tabela de
Símbolos, já durante a segunda passagem, gerará código de máquina,
inserindo os identificadores dos símbolos que agora são conhecidos.
==== Ligação e Carregamento
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment