Ir ao conteúdo
  • Cadastre-se

Compilação, Linkediçao, Assembler Etc..


Posts recomendados

Tendo em vista que eu vi um consideravel numero de usuarios com duvidas sobre compilaçao, linguagem assembler etc. resolvi criar esse topico..

Primeiro uma breve descrição do que é um Montador de assembler:

Montagem

A montagem é realizada para traduzir/converter um programa em linguagem de montagem (assembly) para seu equivalente em linguagem binária através do montador (assembler)

O programa escrito em linguagem de montagem (código fonte) é examinado, instrução por instrução, e convertivo para um outro programa em linguagem binária (código objeto)

Basicamente, as funções de um montador são:

substituir os nomes simbólicos dos código de operação e operandos;

Reservar espaço de memória p/ o armazenamento das instruções e dados;

Converter valores de constantes p/ código binário;

Examinar a correção de cada instrução

A implementação de uma linguagem de montagem pode ser realizada em um sistema de computação optando-se por um dos 2 tipos de montadores:

montador do tipo carrega e monta ou de 1 passo, ou

montador do tipo de módulos ou de 2 passos.

Montador de dois passos

É um montador que lê o programa de entrada duas vezes.

->primeiro passo:

verifica a correção das instruções

Se encontrar incorreção, o montador registra e o processo é interrompido;

Se as instruções estiverem corretas, o montador gera as tabelas de símbolos.

A cada entrada da tabela, o montador atribui o valor binário do codigo de operação, além de outros dados, como o tamanho da instrução e seus operandos, bem como a posição relativa à instrução inicial do programa.

->segundo passo:

o montador realiza a criação do código objeto, completando todas as entradas das tabelas.

Montador de um passo

o objetivo deste montador é completar a tarefa (carrega e monta) em um único passo. Para tanto, durante a avaliação de cada insrução ele vai criando entradas em um outra tabela para endereços ainda desconhecidos.

Avaliando os dois tipos de montadores

Montador de 2 passos:

Apesar de consumir um certo tempo devido ao fato de examinar 2 vezes todo o programa, ele produz um código de máquina direto no final da montagem.

Montador de 1 passo:

Não tem a mesma clareza de execução do tipo anterior, embora conceitualmente pretenda ser mais rápido.

Problemas:

não conclui a tarefa com um código direto e sequencialmente gerado. É preciso um rearranjo dos endereços para se inserir os que estavam desconhecidos;

Se a tabela de endereços desconhecidos for grande, a busca poderá ser tão demorada quanto se estivesse realizado um 2º passo.

A seguir uma breve explicação sobre compilaçao:

Compilação

Compilador é um programa que traduz todo o código-fonte de programas escritos numa linguagem de alto nível em código-objeto da execução do programa.

O processo de compilação é mais complexo e demorado que o de montagem, pois um único comando pode gerar várias instruções de máquina.

O compilador realiza uma análise do código fonte, a qual é dividida em 3 partes funcionalmente distintas:

análise léxica: decompõe o programa fonte em seus elementos individuais distintos, os quais são verificados de acordo com as regras da linguagem;

análise sintática: cria estruturas de cada comando, na verificação da correção dessas estruturas e na alimentação da tabela de símbolos com as informações geradas;

análise semântica: verifica as regras semânticas estáticas da linguagem, produzindo mensagem de erro para as incorreções

Ligação ou linkedição

Um código objeto gerado por um compilador não é imediatamente executável, visto que ainda há código binário a ser incluído no programa, como uma chamada às bibliotecas.

Este processo de interpretação da chamada de uma rotina e a respectiva conexão do código-objeto do programa com o código-objeto da rotina chamada denomina-se ligação.

Um linkeditor/ligador é um programa que reúne módulos compilados e arquivos (de dados ou de bibliotecas) para criar um programa executável.

O funcionamento do programa ligador consiste em examinar todo o código objeto, gerado após a compilação, e procurar as referências externas não resolvidas. Procurando suas respectivas localizações nas bibliotecas indicadas nos comandos de execução do programa.

Ao encontrar a rotina chamada em uma das bibliotecas, o ligador substitui a linha de chamada pelo código objeto da rotina.

O processo de compilação e de ligação são fases distintas e independentes do procedimento global de execução de um programa e também geram produtos distintos:

O código objeto ao final da compilação

O código executável após a ligação

Os códigos acima referenciados são arquivos de códigos binários que podem ser armazenados em memória secundária para uso imediato ou posterior.

Há outro tipo de ligador chamado carregador ou loader que realiza a ligação e em seqüência imediata a execução do código de máquina, sem gerar o código executável permanente.

Interpretação

Pelo método de interpretação, cada comando do código fonte é lido pelo interpretador, é convertido em código executável e imediatamente executado, antes que o comando seguinte seja lido.

Compilação X Interpretação

Compilação

>>Vantagens:

Usa a memória apenas por períodos definidos de tempo, economizando memória;

Na ocorrência de loop, o código fonte é compilado apenas uma única vez.

>>Desvantagem:

A identificação de erros no programa se torna mais problemática quando o código executável entra em fase de execução

Interpretação

>>Vantagens:

Capacidade de identificar e indicar um erro no programa fonte tanto na etapa de conversão estática como na dinâmica

>>Desvantagens

Consumo de memória;

Partes do código de um programa fonte necessitar ser interpretadas tantas vezes quantas definidas no loop

Espero que isso ajude! :lol:

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Bom, como eu ainda tenho duvidas, vai la:

1- Eu sempre pensei que o compilador gerasse o codigo assembly, mas pelo que você disse, ele não gera ass e sim o cod. binario???

2- como a maquina decodifica??? Tem um interpretador embutido no processador??Tipo, que le o cod. binario e executa as informações??

**Parabéns pela iniciativa de esclarecer estes pontos, visto que muitos neste forum, assim como eu, ainda temos duvidas quanto a estes assuntos.

T+

Link para o comentário
Compartilhar em outros sites

O compilador gera codigo Binario, de maquina, chame como quiser. o que é executavel pelo processador

Assembler é uma linguagem de programaçao de baixo nivel, apesar de chegar bem perto da linguagem de maquina ela ainda não é.

O Codigo binario é a propria instrução, os processadores vem com suas intruçoes pre-definidas, por isso q um programa compilado pra uma arquitetura CISC, provalvelmente não funcionara em uma arquitetura RISC, tendo em vista q a tabela de instruçoes que o processador vem programado para executar não é a mesma.

Aprofundando mais:

por ex se você tem em assembler

ADD X (Tendo em vista instruçoes com 1 operando)

essa instruçao seria adicionar o conteudo de X ao ACC (acumulador do processador), mas isso esta em uma linguagem perfeitamente entendivel HUMANA. O computador ainda não intende isso.

aí que entra o MONTADOR, que vai tranformar isso em linguagem de maquina.

o ADD digamos que é o bite 1 e o endereço de X na memoria é 0F

intao a instruçao seria :

10F

ficaria um pouco difícil programar assim ne?? :D

--------------

por ex em pascal você teria:

x:= a+b-c;

o computador não consegue fazer isso tudo de uma vez, aí q entra o compilador

que vai kebrar isso em instruçoes simples, ou seja uma coisa de cada vez:

ASSEMBLER com instruçoes de 1 operando

LDA a (carrega a para o acc)

ADD b (adicona B )

SUB c (subtrai c)

STA x (grava em x)

como podem ver uma coisinha simples como a+b-c é quebrado em 4 instruçoes de maquina (obs, ainda não ta em instruçao de maquina esta em assembler)

é isso q aproxima tanto o assembler do codigo de maquina, pois cada instrução do assembler equivale a uma instrucao de maquina. já as linguagens de alto nivel não.

espero ter ajudado.! B)

Link para o comentário
Compartilhar em outros sites

  • 2 meses depois...
Postado Originalmente por mirv@11 mar 2004, 09:20

Quando um programa java é compilado ele gera os byte-code, que podem ser excecutados em qualquer máquina, minha dúvida é em que linguagem estão esses byte-codes?

Valeu

Quando um programa em java ou em qualquer outra linguagem de programaçao é compilado, ele esta na linguagem de maquina. Mas aí a questao de rodar em qualquer maquina não é bem assim, vai depender da arquitetura do computador e do sistema operacional. Ou seja, um programa em java compilado pra windows não vai roda nem em um macintosh nem em um pc com unix, pois a "linguagem de maquina" que o compilador fez foi para aquela arquitetura e aquela plataforma especificamente.

Link para o comentário
Compartilhar em outros sites

  • mês depois...

O byte code java é independente de plataforma. Pois ele (o bytecode) é a linguagem de máquina da "máquina virtual Java", ou seja, um programa java compilado em qualquer plataforma rodará em qualquer plataforma que tenha uma máquina virtual java implementada. Ou seja, se um programa java é compilado no Windows, ele rodará de mesma forma, no linux, sem necessidade de compilacao. Pois o byte code é independente de plataforma. Assim, java é compilada (para byte code) e interpretada (conversao do byte code para codigo da plataforma nativa). Espero que tenha sido claro!!!

JAVA : WRITE ONCE, RUN ANYWHERE!!!!

Link para o comentário
Compartilhar em outros sites

não existe compilaçao para byte code java nenhum, compilação é pra linguagem de maquina fora isso não é compilaçao.. intao a ide java q você ta usando apenas converte para um codigo (esse bytecode) intendivel para a maquina virtual java.

Compilação é diferente de interpretaçao, no momento que é necessario uma maquina virtual para rodar a aplicaçao ela não esta compilada.

Link para o comentário
Compartilhar em outros sites

  • 4 semanas depois...

Para você compilar (na verdade montar) um programa escrito na linguagem assembly você vai precisar de um Montador ou Assembler. Existem varios como o TASM (turbo assembler) q se eu não me engano é da borland [não sei se é gratis] e também tem os open-source aí na net pra baixar...

Link para o comentário
Compartilhar em outros sites

  • mês depois...

O byte-code que o nosso colega se referiu acima existe sim, ele é uma pré-compilação.

Entendendo melhor, quem faz o papel da máquina nessa história é o JVM, cada plataforma possui um JVM, Linux, Windows, Unix até Mac OS. Todos os byte-codes gerados são iguais, pois quem deve entendê-los é o JVM e não o Hardware físico da máquina. Como já foi dito em uma mensagem anterior, o JVM interpreta o byte-code, pois o mesmo não é compilado... essa pré-compilação apenas transforma a código do programador em um nível um pouco mais baixo para facilitar a compreensão por parte do JVM. O byte-code não deixa de ser uma espécie de "assembler", pois não é um arquivo binário, porém só pode ser interpretado pelo JVM.

O Java até que eu saiba não faz nenhuma compilação completa, ou seja, não gera um arquivo binário nativo de um determinado SO, e é até por isso que o Java não é tão perfeito, pois o preço que se paga nesse processo de interpretação, etc... é o tempo. Um programa Java é muito mais lento que outro qualquer que possua um .exe por causa desse processo, em compensação Java roda em várias outras plataformas.

Link para o comentário
Compartilhar em outros sites

É, Java é multi plataforma por ser uma linguagem INTERPRETADA! Ela é decodifica pra linguagem de maquina no momento da execução, por isso até já vi gente falando que não curtia pela linguagem ser lenta.

Podemos dizer que:

Linguagem Compilada(comC++ e outras): Quando compilada gera um arquivo executavel que já traduz a linguagem de alto-nivel pra linguagem de maquina.

Linguagem INTERPRETADA(Java): Quando é "compilada" ela gera os byte-codes que traduzem a linguagem de alto-nivel para linguagem do Java Virtual Machine. E quando esse programa for executado, o Java Virtual Machine vai traduzir este codigo para linguagem de maquina !!!

Qualquer coisa postem aqui !! Se escrevi besteira me avisem também !!

Link para o comentário
Compartilhar em outros sites

Postado Originalmente por Juliano_cruz@30 jun 2004, 11:28

O byte-code que o nosso colega se referiu acima existe sim, ele é uma pré-compilação.

Entendendo melhor, quem faz o papel da máquina nessa história é o JVM, cada plataforma possui um JVM, Linux, Windows, Unix até Mac OS. Todos os byte-codes gerados são iguais, pois quem deve entendê-los é o JVM e não o Hardware físico da máquina. Como já foi dito em uma mensagem anterior, o JVM interpreta o byte-code, pois o mesmo não é compilado... essa pré-compilação apenas transforma a código do programador em um nível um pouco mais baixo para facilitar a compreensão por parte do JVM. O byte-code não deixa de ser uma espécie de "assembler", pois não é um arquivo binário, porém só pode ser interpretado pelo JVM.

O Java até que eu saiba não faz nenhuma compilação completa, ou seja, não gera um arquivo binário nativo de um determinado SO, e é até por isso que o Java não é tão perfeito, pois o preço que se paga nesse processo de interpretação, etc... é o tempo. Um programa Java é muito mais lento que outro qualquer que possua um .exe por causa desse processo, em compensação Java roda em várias outras plataformas.

Eu não disse q o byte code não existe.. apenas que não é uma compilaçao...

O conceito de compilação foi dado a passagem de uma linguagem de alto nivel para linguagem de maquina, para o processador entender.

Uma vez q você precisa da maquina virtual para INTERPRETAR o bytecode ele não se encaixa no conceito de compilação, portanto a trasformaçao do programa em java em byte code poder ser chamado de tradução, ou sei la como voce queira!

Link para o comentário
Compartilhar em outros sites

Postado Originalmente por Nukem@30 jun 2004, 18:35

Eu não disse q o byte code não existe.. apenas que não é uma compilaçao...

Com certeza você está certo Nukem, talvez tenha dado a impressão mas não penso que você negou a existência do byte-code, estive relendo minha postagem e realmente me expressei mau, eu só queria enfatizar na minha postagem logo que o byte-code é uma "pré-compilação". Como eu disse, é gerado um código porém este não chega a ser um código binário nativo de um SO e sim um código para o JVM poder compreender, e este último que tem a finalidade de conversar com o SO em que está instalado. E a propósito, sua explicação sobre o assunto ficou bastante completa e de forma bem compreensível para todos os usuários.

Link para o comentário
Compartilhar em outros sites

  • 4 meses depois...
  • 6 meses depois...
  • 5 meses depois...

Olá, eu sou o Breno e não entendo nada de progrmaçao.eu sou muito interessado no assunto.Gostaria de saber se eu tendo o pascalzim instalado em meu pc se preciso ter um compilador poque toda vez que vou na net e copio um programa ou codigo fonte não sei como se fala, para o pascal da um erro de sintaxe.Porque isso ocorre já que pego eles todos mastigados e prontos para serem compilados.Por favor se eu precisar de um compilador pra resolver o problema me informem um site para o compilador porque o programa eu já tenho.Abraços!Espero muitas respostas...

:-BEER:muro:

Link para o comentário
Compartilhar em outros sites

  • 6 meses depois...
  • 2 meses depois...

Haee pessoal.........

Aproveitando o assunto sobre ASSEMBLY...................

Estou montando meu TCC pra facu sobre assembly, e tudo que eu li ate agora leva a crer que a linguagem assembly não é muito utilizada hoje em dia (pois linguagens como C fazem acesso a baixo nivel e são mais estruturadas).

Se alguem puder me informar como anda o mercado por ai em relação ao assembly, quem usa hoje em dia e para qual area!

Valewwww :bandeira:

Link para o comentário
Compartilhar em outros sites

  • mês depois...
  • mês depois...
  • 3 anos depois...
Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...