Um pouco mais sobre compiladores

11/06/2008 at 6:37 (Antes da primeira prova) ()

Breve Histórico dos compiladores

Os primeiros computadores não usavam compiladores, porque eles tinham apenas alguns poucos opcodes (pseudocódigos) e pouca memória e os usuários entravam com código binário de máquina diretamente. No final dos anos 40, os programadores descobriram que o código de máquina tedioso poderia ser representado usando alguns mnemônicos – abreviações de palavras, o que deu origem à linguagem assembly. Adicionalmente, os próprios computadores poderiam traduzir estes mnemônicos em linguagem de máquina.

Durante os anos 50, as linguagens de assembly dependentes da máquina para a qual eram projetadas ainda não eram ideais para os programadores, e por essa razão evoluíram as linguagens de alto-nível e independentes da máquina subjacente. Vários compiladores experimentais foram desenvolvidos desde então, começando com o trabalho de Grace Hopper na linguagem A-0.

O crédito do primeiro compilador completo, em 1957, é atribuído à equipe de desenvolvimento do FORTRAN, liderada por John Backus da IBM. O COBOL foi a primeira linguagem a ser compilada em múltiplas arquiteturas, em 1960.

O primeiro compilador autocontido – ou seja, capaz de compilar o seu próprio código-fonte em uma linguagem de alto-nível – foi criado para o LISP por Hart e Levin no MIT em 1962.

Link Permanente Deixe um comentário

Compiladores vs Interpretadores

11/06/2008 at 6:36 (Antes da primeira prova) (, )

Após definir-se a sintaxe e a semântica da linguagem, precisa-se de uma forma eficiente para a implementação de cada um dos elementos da linguagem. Essa implementação é feita por programas processadores: compiladores e interpretadores, ou ainda um misto entre estas formas de processadores.

  • Compiladores: os programas são transformados, por inteiro, em um conjunto correspondente de instruções que podem ser fisicamente efetuadas pelo computador. A execução do programa é feita diretamente através dessas instruções de computador; o programa inteiro constitui uma unidade a ser transferida “em um único lote” para o computador.
  • Interpretadores: cada expressão do programa é executada diretamente, ou seja, transformada nas instruções correspondentes e acionada no computador sem ter-se a necessidade de transformar o programa inteiro em uma unidade de execução. As expressões do programa são executadas sob demanda.

Um compilador é um programa de computador – ou um conjunto de programas – que traduzem texto(s) escrito(s) em uma determinada linguagem de computador (a linguagem-fonte) em outra linguagem de computador (a linguagem-alvo).

Link Permanente Deixe um comentário

Compiladores

11/06/2008 at 6:03 (Antes da primeira prova) (, , , )

1. Assembly e Compiladores

A razão mais comum para se querer traduzir código fonte é a de criar um programa executável. O nome “compilador” é reservado para programas que traduzem código- fonte de uma linguagem de alto-nível para uma de baixo-nível (por exemplo, em linguagem de máquina ou linguagem assembly).

Linguagem Assembly é uma versão mnemônica do código de máquina, na qual, nomes são usados ao invés de códigos binários. O assembler (montador) converte as instruções em linguagem assembly para a linguagem objeto relocável.

2. Linker

- Tem por função receber o código relocável, produzido pelo assembler, combinar com outros arquivos e gerar um arquivo executável.

- Lembrando que saída do linker é um único arquivo, sendo ainda um código objeto relocável.

3. Loader

O loader possui as funções de:

  • Ler o código objeto relocável do disco que foi produzido pelo linker;
  • Determinar o endereço de memória que o programa será carregado;
  • Alterar os endereços relocáveis das instruções que fazem acesso à memória, obtendo assim o código objeto absoluto;
  • Carregar as instruções alteradas e os dados na memória, no endereço apropriado.

    Link Permanente Deixe um comentário

    Big Endian vs Little Endian

    10/06/2008 at 21:23 (Antes da primeira prova) (, )

    Como proceder para ler dados da memória principal?

    Da esquerda para a direita?

    Da direita para a esquerda?

    Do meio para as extremidades?

    Tá, do meio para as extremidades torna-se um tanto desnecessário comentar. No entanto ainda hoje existe a questão: “de que ‘lado’ começar?”

    Por um lado temos o Big Endian (ou grande fim O.o) que começa pelo “maior” lado, aquele dos bits MAIS significativos. Do outro temos o Little Endian (precisa dizer que é pequeno fim?) que começa pelo lado “pequeno”, ou seja, o lado que contém os bits MENOS significativos.

    O Big Endian tem boas vantagens, afinal ele pensa igual a nós ocidentais. Ele lê da ‘esquerda’ para a direita, do algarismo MAIS significativo até chegar ao MENOS significativo. Isso facilita a nossa vida de programador, uma vez que, utilizando métodos que se assemelhem à nossa natureza, podemos programar com mais facilidade. No entanto grande parte da perda dele se deve justamente ao mesmo fato! Ler os algarismos partindo do mais significativo significa uma grande perda de eficiência ao se incrementar o número, pois para isso deve-se conhecer TODO o número e alocar o espaço necessário para ele. Fora o fato de que, numa busca, primeiro a gente descobre a faixa que ele está, para só então descobrir a linha.

    A imagem a seguir, retirada da Wikipédia, demonstra o funcionamento do Big Endian.

    Big Endian

    O Little Endian tem como desvantagem a vantagem do Big Endian e vice-versa. Afinal ler da direita para a esquerda só dá certo lá no oriente, onde eles lêem até de cima para baixo! Imagine você ter que programar uma coisa que usa um padrão totalmente fora da convenção do dia a dia. Deve ser estranho. Porém, esse modo de leitura facilita na incrementação do número, afinal à medida que se vai lendo os algarismos, vai-se acrescentando-os em seus devidos lugares na ordem MENOS SIGNIFICATIVOS -> MAIS SIGNIFICATIVOS. Isso gera uma certa eficiência, não?

    A imagem a seguir, retirada da Wikipédia, demonstra o funcionamento do Little Endian.

    Little Endian

    Só para salientar, de acordo com esse site (http://support.microsoft.com/kb/102025/pt-br) o Windows NT foi construído com a tecnologia Little Endian e NÃO é compatível com Big Endian. Em sua horrível tradução para o português (tradução automática), o site explica que isso se deve ao fato da maioria dos programas terem dependências com o Little Endian (ao menos foi isso que eu consegui entender O.o).

    Acho que por enquanto é só isso =)

    Link Permanente Deixe um comentário