quinta-feira, 2 de abril de 2009

Fases da Compilação




As fases de um compilador podem ser classificadas em dois grupos: análise e síntese.
Na fase de análise, encontram-se as fases de análise léxica, análise sintática e análise semântica. Já na fase de síntese encontram-se as fases de geração de código intermediário, otimização e geração de código. Adicionalmente as estas fases, existem ainda duas fases adicionais que interagem com todas as fases do compilador: o gerenciamento de tabelas e o tratamento de erros.

FASE DE ANALISE

  • Análise léxica - A fase de análise léxica (varredora) tem por objetivo ler o programa fonte e transformar seqüências de caracteres em uma representação interna, denominada itens léxicos. A saída é um fluxo do símbolo. As expressões regulares são usadas para definir o símbolo reconhecido por um varredor (ou pelo analisador lexical). Por exemplo, suponha a expressão abaixo, descrita em Pascal:
    Exp := (A + B) * 1.5;
    Os itens léxicos contidos nesta expressão, são:
    Exp, :=, (, A, +, B, ), *, 1.5 e ;.
    Os itens léxicos a serem reconhecidos pelo analisador léxico são determinados pela gramática da linguagem-fonte. Deste modo, caso um item léxico não seja definido por esta gramática, um erro léxico é gerado. Por exemplo, suponhamos que uma linguagem só suporte valores inteiros. Então o valor 1.5 iria ocasionar um erro, o qual deverá ser tratado.
  • Análise Sintática - responsabiliza-se por traduzir os Tokens, e descobrir a relação de uns com os outros. Se você escreve writeln, um espaço, e um identificador, seu programa passará pela análise léxica (writeln e identificador existem), mas não passará pela análise sintática, que informa a necessidade de um abre-parênteses logo após esta procedure.
  • A análise semântica - analisa a árvore sintática para a informação context-sensitive, gerada pelo analisador sintático em busca de inconsistências semânticas. Uma das tarefas mais importantes é a verificação de tipos, ou análise de contexto. É nesta fase que são detectadas, por exemplo, os conflitos entre tipos, a ausência de declarações de variáveis, funções e procedimentos.

FASE DE SINTESE

  • A fase de geração de código intermediário - permite a geração de instruções para uma máquina abstrata, normalmente em código de três endereços, mais adequadas a fase de otimização. Esta forma intermediária não é executada diretamente pela máquina alvo.
  • A fase de otimização - analisa o código no formato intermediário e tenta melhorá-lo de tal forma que venha a resultar um código de máquina mais rápido em tempo de execução, usando as réguas que denotam a semântica da linguagem-fonte. Uma das tarefas executadas pelo otimizador é a detecção e a eliminação de movimento de dados redundantes e a repetição de operações dentro de um mesmo bloco de programa.
  • A fase de geração de código - tem como objetivo analisar o código já otimizado é a gerar o um código objeto definitivo para uma máquina alvo. Normalmente este código objeto é um código de máquina relocável ou um código de montagem. Nesta etapa as localizações de memória são selecionadas para cada uma das variáveis usadas pelo programa. Então, as instruções intermediárias são, cada uma, traduzidas numa seqüência de instruções de máquina que realizam a mesma tarefa.

Fonte: http://www.geocities.com/SiliconValley/Bay/1058/compiler.html

segunda-feira, 23 de março de 2009

Vantagens e desvantagens da Interpetração

Vantagens:

  • Correções e alterações são mais rápidas de serem realizadas;
  • Código não precisa ser compilado para ser executado;
  • Consomem menos memória.
Desvantagens:

  • Execução é mais lenta do programa;
  • Necessita sempre ser lido o código original para ser executado;

Fonte: http://www.oficinadanet.com.br/artigo/1527/diferencas_entre_compiladores_e_interpretadores acessado em 23/03/09, às 20:00

Vantagens e desvantagens da Compilação

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.

Fonte: http://www.oficinadanet.com.br/artigo/1527/diferencas_entre_compiladores_e_interpretadores acessado em 23/03/09, às 20:00

quarta-feira, 18 de março de 2009

E, o que é Código de Máquina ?

Todo computador possui um conjunto de instruções que seu processador é capaz de executar. Essas instruções, chamadas de código de máquina, são representadas por sequências de bits, normalmente limitadas pelo número de bits do registrador principal da CPU.
As instruções correspondem a seqüencias muito simples de operações, como transferir um dado em memória para a CPU ou somar dois valores e são normalmente interpretadas por micro-código.
Um programa em código de máquina consiste de uma sequência de números que significam uma sequência de instruções a serem executadas. É normal a representação da linguagem de máquina por meio de números (opcodes) constantes e variáveis em sistema binário ou sistema hexadecimal. Alguns computadores também têm seu opcodes representados no sistema octal.
Microprocessadores tem normalmente seus códigos de operação como múltiplos de 2, 8 e 16, pois usam arquiteturas com registradores de 8,16,32,64 ou 128 bits em 2006. Porém, existem máquinas com registradores de tamanho diferente.
Os programas de computador raramente são criados em linguagem de máquina, mas devem ser traduzidos (por compiladores) para serem executados diretamente pelo computador. Existe a opção, em voga atualmente, de não executá-los diretamente, mas sim por meio de um interpretador, esse sim rodando diretamente em código de máquina e previamente compilado.


Fonte: http://pt.wikipedia.org/wiki/Código_de_máquina

terça-feira, 10 de março de 2009

Primeiras definições

Interpretação e compilação

Uma linguagem de programação pode ser convertida, ou traduzida, em código de máquina por compilação ou interpretação, que juntas podem ser chamadas de tradução.

Compilação - Se o método utilizado traduz todo o texto do programa (também chamado de código), para só depois executar (ou rodar, como se diz no jargão da computação) o programa, então diz-se que o programa foi compilado e que o mecanismo utilizado para a tradução é um compilador (que por sua vez nada mais é do que um programa). A versão compilada do programa tipicamente é armazenada, de forma que o programa pode ser executado um número indefinido de vezes sem que seja necessária nova compilação, o que compensa o tempo gasto na compilação.

Interpretação - Se o texto do programa é traduzido à medida em que vai sendo executado, num processo de tradução de trechos seguidos de sua execução imediata, então diz-se que o programa foi interpretado e que o mecanismo utilizado para a tradução é um interpretador. Programas interpretados são geralmente mais lentos do que os compilados, mas são também geralmente mais flexíveis, já que podem interagir com o ambiente mais facilmente