A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Montadores, Compiladores, Link-editores, Interpretadores

Apresentações semelhantes


Apresentação em tema: "Montadores, Compiladores, Link-editores, Interpretadores"— Transcrição da apresentação:

1 Montadores, Compiladores, Link-editores, Interpretadores
Introdução à Computação

2 EXECUÇÃO DE PROGRAMAS Um computador precisa ser instruído, passo a passo, para fazer qualquer tarefa (mesmo as mais simples como, por exemplo, somar 10 números em sequência); Para realizar as operações, o computador necessita ser projetado com a capacidade de: Armazenar Interpretar e Executar.

3 EXECUÇÃO DE PROGRAMAS (cont)
Cada operação é constituída de um conjunto de instruções que a máquina (computador) compreenda, são chamadas instruções de máquina; O conjunto de instruções ou comandos organizados em uma certa sequência compõe o que denominamos programa de computador.

4 LINGUAGENS DE PROGRAMAÇÃO
Linguagem de programação é um conjunto de comandos criados para instruir um computador a realizar suas tarefas; Um programa completo escrito em uma linguagem de programação, é freqüentemente denominado de código-fonte; Codificar um algoritmo (sequência de instruções) significa converter suas declarações em um comando ou instrução específico de uma certa linguagem de programação.

5 LINGUAGENS DE PROGRAMAÇÃO (cont)
A Linguagem de Programação mais simples é a linguagem que o computador entende diretamente, isto é, as instruções que podem ser diretamente executadas pelo hardware, isto é, pela UCP  Linguagem de Máquina; Um programa em linguagem de máquina é uma longa sequência de números, representando as instruções e os dados a serem manipulados pelas instruções.

6 Para escrever um programa em linguagem de máquina, o programador deve conhecer:
todas as instruções disponíveis para aquela máquina e seus respectivos códigos de operação e formatos; os endereços dos registradores da UCP disponíveis e; os endereços das células de memória onde serão armazenadas as instruções e os dados. Um programa real, em linguagem de máquina, pode conter milhares de instruções; Fazer um programa em linguagem de máquina pode ser uma tarefa extremamente tediosa e difícil, pelos detalhes que precisam ser observados pelo programador.

7 É caro, devido ao custo da mão-de-obra envolvida;
Para tentar minimizar estes problemas foi desenvolvida uma linguagem que representasse as instruções por símbolos e não por números; Esta linguagem simbólica foi denominada Linguagem de Montagem (Assembly Language).

8 Programa em linguagem de montagem
Início: ORG ZERO Origem do programa. Endereço relativo Ø LDA Contador Carregar valor do contador no ACC JZ FIM Se Acumulador = O, então PARAR (desvia para FIM) Parcela Carregar a parcela 1 no acumulador ADD Soma o próximo valor lido com o valor do Acumulador STR Resultado Colocar o resultado no registrador Ler valor do contador para ACC DCR Subtrair 1 do Acumulador JMP Voltar para o início do laço Fim: HLT Parar DAD Indica a quantidade de parcelas a somar Vai receber o resultado da Soma Parcelas de uma soma …..

9 Qual é a vantagem? Códigos de operação, como 0101, são mais fáceis de serem lembrados se representados como ADD (somar) do que pelo número 0101; O programador, ao escrever um programa em Assembly, não precisa mais guardar os endereços reais de memória onde dados e instruções estarão armazenados.

10 Qual é a vantagem? (cont)
O programador pode usar símbolos (caracteres alfabéticos ou alfanuméricos para indicar endereços ou dados); É denominada Linguagem de baixo nível.

11 O uso de algumas poucas técnicas de projeto de compiladores pode ser utilizada para construção de:
tradutores, formatadores e processadores de texto, interpretadores (de programas ou queries), Montadores, Organizadores, além de compiladores.

12 Definição de Compilador
Compilador (sentido geral): aquele de compila, isto é, copia ou transcreve, podendo ou não traduzir aquilo que é transcrito. Compilador (software): programa que lê um texto escrito numa linguagem (fonte) traduzindo-o num texto equivalente escrito em outra linguagem (alvo). 9/15/2018 Introdução

13 Definição Programa Fonte (linguagem fonte) Compilador (compiler)
Alvo (linguagem alvo) Mensagens de erro 9/15/2018 Introdução

14 Definição As linguagens fonte (source languages) são linguagens de programação (C, Pascal, Java, Fortran etc). As linguagens alvo (target languagens) são também variadas tal como outra linguagem de programação, uma linguagem de máquina (assembly) ou uma outra representação. 9/15/2018 Introdução

15 Montagem O processo de conversão (tradução) é chamado de montagem;
É feito por um programa chamado Montador (Assembler); O ASSEMBLER lê cada instrução em linguagem de montagem e cria uma instrução equivalente em linguagem de máquina.

16 Montagem (cont) Programar em linguagem de montagem ainda é uma tarefa árdua, tediosa e complexa, mas bem mais atraente do que programar em Linguagem de Máquina; Mas...Seria bom que a linguagem de comunicação com o computador fosse: mais simples e com menos instruções.

17 Existem linguagens que refletem mais os procedimentos utilizados na solução de um problema, sem preocupação com o tipo de UCP ou de memória onde o programa será executado; Estas linguagens, por serem estruturadas de acordo com a compreensão e a intenção do programador, são usualmente denominadas linguagens de alto nível; Uma linguagem de alto nível, ou orientada ao problema, permite ao programador especificar a realização de ações do computador com muito menos instruções (são os comandos).

18 MONTAGEM E COMPILAÇÃO Os programas em linguagem de alto nível também requerem uma conversão para instruções de máquinas; Este processo é denominado compilação; Normalmente, a conversão de um simples comando em C, gera dezenas de instruções de máquina; Um programa em linguagem de montagem gera, para cada instrução, uma instrução de máquina; O processo de tradução ou conversão é normalmente dividido em dois tipos ou categorias: Montagem Compilação

19 Montagem A tradução mais rápida e simples que existe
É realizada por um programa denominado montador (assembler). A montagem é realizada para traduzir um programa em linguagem de montagem para seu equivalente em linguagem binária executável. Fluxo básico de uma montagem Programa Original em Linguagem de Montagem Código Fonte Montagem Montador Programa Resultante em Linguagem Binária Código Executável

20 Compilação Existem Linguagens de Programação que são mais voltadas ao desenvolvimento de aplicação e menos voltadas para as instruções de máquina; Isso é bom para o programador, pois ele se preocupa com o negócio estudado e não em como o programa vai ser construído em binário.

21 Compilação Mas como converter um programa escrito em Linguagem de Alto Nível para um programa em Linguagem de Máquina? Só o procedimento de montagem ... não funciona... devemos usar a compilação; Compilação é: o processo de análise de um programa escrito em linguagem de alto nível e a conversão em um programa equivalente, escrito em linguagem binária.

22 Fluxograma básico do processo de compilação
Código Fonte Programa inicial, escrito em linguagem de alto nível Programa Compilador Exec. Programa resultante da compilação, relacionado em linguagem de máquina open file_entrada read A,B,C while not eof (file_entrada) do K = A +B - C point A,B,C,X end while close file_entrada Compilação

23 Compilação x Montagem A compilação é semelhante à montagem:
análise de programa fonte, criação de tabelas auxiliares e geração de código executável final em linguagem de máquina Mas a compilação é um pouco mais complexa e demorada na execução destas fases.

24 Compilação x Montagem (cont)
Na montagem, há uma relação de 1:1 entre as instruções de linguagem de montagem e as instruções de máquina; Na compilação um único comando em linguagem de alto nível pode gerar várias instruções em linguagem de máquina; Durante a compilação, o código fonte é analisado, comando por comando; O programa compilador realiza várias tarefas, que podem ser divididas em fases, até chegar no código objeto.

25 Softwares Auxiliares Pré-processadores
produzem a entrada para os compiladores, é ativado antes do início da tradução efetuam o processamento de macros #define MAX 30 realizam a inclusão de arquivos #include “global.h” permitem adicionar extensões a linguagem permitem realizar compilação condicional 9/15/2018 Introdução

26 Softwares Auxiliares Assemblers Carregadores e Link-Editors
Convertem assembly em linguagem de máquina Assembler de 2 passos é o mais simples Carregadores e Link-Editors efetuam o carregamento do programa na memória efetuando a substituição dos endereços relocáveis. permitem a união de arquivos compilados separadamente 9/15/2018 Introdução

27 LIGAÇÃO ou LINKEDIÇÃO Quando escrevemos um programa não nos preocupamos em codificar determinadas operações (entrada e/ou saída de dados), porque o código binário destas tarefas já existe; Apenas referenciamos o código e ele será incorporado ao programa; É o caso, por exemplo, de comandos de entrada e saída; Então, para imprimir, podemos passar os dados para um programa específico de tratamento da impressão.

28 LIGAÇÃO ou LINKEDIÇÃO (cont)
Um outro exemplo: podemos precisar em nosso programa de um código que realize o cálculo do seno, ou da raiz quadrada; Este código poderia estar no sistema e simplesmente ser referenciado no nosso programa.

29 LIGAÇÃO ou LINKEDIÇÃO (cont)
As rotinas externas são organizadas em arquivos e diretórios específicos para cada grupo de rotinas. São as bibliotecas; Uma biblioteca é uma coleção de códigos objeto, um para cada rotina específica. É indexada (organizada) pelo nome da rotina; Quando o programa de aplicação deseja usar uma dessas rotinas, ele insere uma chamada de biblioteca no seu código (“library call”).

30 LIGAÇÃO ou LINKEDIÇÃO (cont)
Quando um código objeto gerado por um compilador não é imediatamente executável, pois ainda há código binário a ser incluído no programa; O compilador, ao gerar o código objeto, pode encontrar um comando da linguagem de alto nível que peça o uso de uma rotina de biblioteca, então ele insere uma chamada para a rotina em código objeto; A chamada (CALL) inclui o nome da rotina, bem como o endereço de qualquer dado que deve ser passado entre o programa e a rotina.

31 LIGAÇÃO ou LINKEDIÇÃO (cont)
O processo de interpretação da chamada (CALL) e a respectiva conexão com a rotina chamada denomina-se ligação ou linkedição; É realizado por um programa linkeditor (ligador); Como resultado do processo de ligação, obtém-se um conjunto de códigos de máquina, interligados e prontos para execução.

32 LIGAÇÃO ou LINKEDIÇÃO (cont)
Chama-se este conjunto de códigos de módulo de carga ou código executável; A chamada de uma biblioteca é denominada referência externa não resolvida, pois se trata de uma chamada para uma rotina que não pertence ao código objeto que está sendo gerado pelo compilador: Não resolvida pois sua localização é desconhecida para ele Externa porque não pertence ao código objeto referido.

33 LIGAÇÃO ou LINKEDIÇÃO (cont)
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 Procurar a localização das bibliotecas indicadas nos comandos de execução do programa, para cada uma das chamadas Substituir a linha de chamada pelo código objeto da rotina (quando o linkeditor encontra a rotina), isto se chama “resolver a referência externa” Na prática, o processo de criação do código executável tem duas fases distintas, o da geração do objeto e o de ligação.

34 LIGAÇÃO ou LINKEDIÇÃO (cont)
São fases distintas e independentes do procedimento global de compilação de um programa; Muitas vezes são realizadas em seqüência como se fossem uma única atividade; Por serem independentes, também geram produtos distintos: o código objeto (ao final da geração do objeto) e o código executável (após a ligação).

35 Fluxograma do processo de compilação e ligação
Programa Fonte Programa Inicial, Escrito em linguagem de alto nível Código Objeto Compilação Ligador Código Executável Ligação Compilador biblioteca

36 Resumindo A execução de um programa se inicia pelo armazenamento, na memória principal, do código fonte e do programa compilador; Após a realização da compilação é gerado o código objeto; Este arquivo pode ser armazenado na memória secundária (disco rígido) para ser ligado mais tarde ou Ser carregado na memória principal, junto com o programa ligador, e se inicia a etapa de ligação.

37 Resumindo (cont) A decisão do que fazer depende das diretivas definidas pelo programador quando executa o programa; Após a fase de ligação, está formado o código executável ou módulo de carga; Este código é também armazenado em um arquivo; Pode ser imediatamente carregado na memória para ser executado efetivamente pela UCP ou pode ser armazenado na memória secundária para uso posterior.

38 Modelo Análise-Síntese
Compilação constitui-se de duas partes: Análise Síntese Programa Alvo Compilador Análise Síntese Programa Fonte Significado 9/15/2018 Introdução

39 Modelo Análise-Síntese
Inclui possíveis mecanismos de pré-processamento. Divide o programa fonte em suas partes constituintes. Cria uma representação intermediária do programa fonte. É uma tarefa relativamente simples. 9/15/2018 Introdução

40 Modelo Análise-Síntese
Constrói o programa alvo a partir da representação intermediária produzida pela análise. É uma tarefa relativamente complexa. Utiliza a maior parte das técnicas especializadas. 9/15/2018 Introdução

41 Modelo Análise-Síntese
Grande parte das técnicas se aplicam a maioria das linguagens fonte e alvo. Existem várias ferramentas que facilitam o desenvolvimento de novos compiladores ou softwares que usem as mesmas técnicas. Dá origem aos conceitos de: front-end, relacionado com a linguagem a ser processada; back-end: relacionado com a linguagem a ser produzida. 9/15/2018 Introdução

42 Sistema de Processamento de Linguagem
Módulos fonte Pré-processador (preprocessor) Compilador (compiler) Programa Fonte Montador (assembler) Assembly Alvo Loader/Link Editor Código Relocável Código Absoluto 9/15/2018 Introdução

43 Fases da Compilação Compiladores operam em “fases”, cada qual realizando uma transformação no programa fonte. Algumas fases podem ser agrupadas. Tipicamente a Análise é realizada em três fases: análise léxica, sintática e semântica. Igualmente a Síntese é realizada de uma a três fases conforme o tipo de compilador. 9/15/2018 Introdução

44 Fases da Compilação Análise Léxica Programa Fonte Análise Sintática
Semântica Tabela de Símbolos Detecção de Erros Geração de Pseudo-Código Otimização de Código Programa Alvo Geração de Código 9/15/2018 Introdução

45 Análise Léxica ou Linear
Efetua a análise da cadeia de caracteres do programa fonte (da esquerda para direita) agrupando as sequências que possuam significado coletivo (tokens ou lexeme). Tokens são separados uns dos outros por caracteres denominados separadores. Separadores são usualmente os caracteres “brancos” (espaços, tabulações e quebras de linha) e os operadores. 9/15/2018 Introdução

46 Análise Léxica ou Linear
Dado o programa abaixo: void main( ) { int total = 0; println(“Total = %d.”, total + 10); } Quantos tokens possui? 9/15/2018 Introdução

47 Análise Léxica ou Linear
Resposta: 20 (vinte) tipo void identificador main pontuação ( pontuação ) pontuação { tipo int identificador total atribuição = número 0 pontuação ; identificador println pontuação ( string “Total = %d.” pontuação , identificador total operador + número 10 pontuação ) pontuação ; pontuação } 9/15/2018 Introdução

48 Análise Léxica ou Linear
Uma tarefa adicional da análise léxica é determinar os tipos dos tokens obtidos programa fonte: A cada token é geralmente associado um tipo ou classe. Classes ou tipos comuns são: palavra-chave, identificador, constante (número ou string), pontuação e operador. 9/15/2018 Introdução

49 Análise Sintática ou Hierárquica (parsing)
Envolve o agrupamento dos tokens obtidos do programa fonte em frases ou unidades lógicas. As frases/unidade devem ser gramaticalmente aceitas pela linguagem fonte para possibilitar sua síntese. Usualmente as frases/unidades são representadas por árvores sintáticas (parsing trees). 9/15/2018 Introdução

50 Análise Sintática ou Hierárquica
Um outro exemplo: subtotal = 10 + valorUnitario * quantidade; atribuição = identificador expressão subtotal + expressão expressão * número expressão expressão identificador 10 identificador valorUnitario quantidade 9/15/2018 Introdução

51 Análise Sintática ou Hierárquica
Note que: identificador = expressão é uma unidade lógica assim como valorUnitario*quantidade mas 10+valorUnitario não são agrupados como unidade lógica porque as multiplicações devem ser executadas antes das adições ou seja, a precedência das operações deve ser respeitada apesar da ordem em que os tokens originalmente aparecem no programa fonte. 9/15/2018 Introdução

52 Análise Sintática ou Hierárquica
A estrutura hierárquica de uma linguagem é usualmente expressa por regras: (1) Um identificador é uma expressão (2) Um número é uma expressão (3) Se expr1 e expr2 são expressões então também são expressões: expr1 + expr2 expr1 * expr2 ( expr1 ) 9/15/2018 Introdução

53 Análise Sintática ou Hierárquica
Uma outra forma de expressar-se as mesmas regras: (1) expr  id (2) expr  number (3) expr  expr + expr | expr * expr | ( expr ) 9/15/2018 Introdução

54 Análise Sintática ou Hierárquica
As regras (1) e (2) são regras básicas não recursivas. A regra (3) define expressões em termos de operadores aplicados a outras expressões, ou seja, é uma regra recursiva. É frequente o uso de regras recursivas na definição (da gramática) de linguagens. 9/15/2018 Introdução

55 Análise Sintática ou Hierárquica
Diretivas de linguagens de programação são exemplos típicos de regras recursivas: (1) Se id1 é um identificador e expr1 é uma expressão então é também uma diretiva: id1 = expr1 (2) Se expr1 é uma expressão e stmt1 e stmt2 são diretivas então são também diretivas: while (expr1) stmt1 if (expr1) stmt1 else stmt2 9/15/2018 Introdução

56 Análise Léxica versus Análise Sintática
A divisão entre análise léxica e sintática é arbitrária. Geralmente tal divisão é pensada para simplificar a etapa de análise como um todo. O fator determinante é a recursão, isto é, se a linguagem fonte é inerentemente recursiva ou não. 9/15/2018 Introdução

57 Análise Léxica versus Análise Sintática
Construções léxicas são geralmente não recursivas enquanto construções sintáticas geralmente o são. O reconhecimento de identificadores não envolve recursão enquanto que o processamento de expressões sim. Gramáticas livres de contexto (context-free grammars) são uma formalização de regras recursivas que podem ser usadas para conduzir a análise sintática. 9/15/2018 Introdução

58 Análise Semântica ou de Contexto
Nesta fase verifica-se se cada unidade lógica pode efetivamente ser aplicada dentro do contexto onde foi encontrada. Relaciona portanto se as operações indicadas são aplicáveis (tem significado semântico) aos operandos utilizados. Só pode ser realizada após a análise léxica e sintática. 9/15/2018 Introdução

59 Análise Semântica ou de Contexto
Um exemplo: A = 0 Da análise léxica e sintática temos: A é um identificador = é o operador de atribuição 0 é um valor numérico (uma expressão) Equivale assim a: identificador = expressão 9/15/2018 Introdução

60 Análise Semântica ou de Contexto
Embora sintaticamente correto pode ser semanticamente inválido se: identificador A não foi declarado; identificador A corresponder a uma função, método ou classe; o tipo do identificador de variável A for incompatível com o valor numérico 0 (zero); operação de atribuição for inadequada dentro do contexto em que ocorre (p.e. expressão condicional de um laço). 9/15/2018 Introdução

61 Análise Semântica ou de Contexto
Realiza a verificação de tipos e, quando permitido pela linguagem, efetua a coerção de operandos: int a = 1; float b = 2.5, c; c = a + b; Sintaticamente correto. Se permitido a operação de inteiros com reais ocorre a coerção: c = inttoreal(a) + b; 9/15/2018 Introdução

62 Tabela de Símbolos Função essencial de qualquer compilador que consiste no registro de todos os identificadores encontrados no programa fonte e também seus atributos. Como atributos temos: tipo, escopo, local de armazenamento, número e tipo dos argumentos (se função), método de passagem dos argumentos (se função) e valor de retorno (se função). 9/15/2018 Introdução

63 Tabela de Símbolos As informações sobre os identificadores e seus atributos é mantida numa tabela denominada tabela de símbolos na forma de um registro para cada identificador. Embora os identificadores sejam determinados durante a análise léxica, a maior parte dos seus atributos só pode ser determinada durante a análise semântica. 9/15/2018 Introdução

64 Tabela de Símbolos Durante a etapa de síntese, as informações contidas na tabela de símbolos será bastante utilizada para: determinação do espaço necessário para armazenamento, determinação dos endereços de armazenamento e seleção das instruções para realização das operações indicadas pelo programa fonte. 9/15/2018 Introdução

65 Síntese Implementa procedimentos de avaliação para o programa-fonte em termos de primitivas de um computador-alvo. Para prover maior independência e flexibilidade do projeto do compilador divide-se geralmente em: geração de pseudo-código (target independent) otimização do pseudo-código geração do código-alvo otimização do código-alvo 9/15/2018 Introdução

66 Geração de Código Intermediário (pseudocode)
Muitos compiladores geram uma representação intermediária antes do código-alvo. Esta representação intermediária pode ser entendida como um programa para uma máquina abstrata (virtual). Tal representação deve ser facilmente gerada e traduzida no programa-alvo. 9/15/2018 Introdução

67 Geração de Código Intermediário (pseudocode)
Uma forma típica é a three-address code (código de três endereços) onde o trecho de programa abaixo: montante = depInicial + taxaJuros*60 Poderia originar o seguinte pseudo-código: temp1 = intoreal(60) temp2 = id3 * temp1 temp3 = id2 + temp2 id1 = temp3 9/15/2018 Introdução

68 Geração de Código Intermediário (pseudocode)
O three-address code tem como características: cada posição de memória é tratada como um registrador; sequências de instruções possuem no máximo três operandos; possui assim um único operador além da atribuição precedência é resolvida através da ordem de execução; posições temporárias são geradas e usadas para armazenar valores intermediários. 9/15/2018 Introdução

69 Geração de Código Intermediário (pseudocode)
Embora gere sequências de código mais longas que aparentemente necessário, facilita futuras otimizações e traduções devido sua simplicidade. Modificando-se apenas as etapas seguintes pode-se obter compiladores para diferentes linguagens-alvo, diferentes arquiteturas. 9/15/2018 Introdução

70 Otimização de Código Procura melhorar o código intermediário gerado em termos de: velocidade de execução quantidade de armazenamento utilizado É uma tarefa relativamente complexa que usualmente toma tempo significativo da compilação, entretanto algumas otimizações simples podem melhorar muito o tempo de execução sem retardar demais a compilação. 9/15/2018 Introdução

71 Geração de Código Fase final da compilação que produz código relocável ou assembly. Conforme o tipo de código gerado torna-se necessário utilizar-se ferramentas adicionais para que o programa-alvo seja executado. Instruções do código intermediário são traduzidas em sequências específicas de instruções de máquina. 9/15/2018 Introdução

72 Geração de Código Posições de memória são selecionadas para cada uma das variáveis usadas pelo programa. Um importante aspecto é a atribuição de variáveis para registradores do processador. Alguns compiladores procuram otimizar novamente o código final gerado. 9/15/2018 Introdução

73 Detecção de Erros Podem ocorrer erros em qualquer fase da compilação, os quais devem ser relatados de forma apurada. Mesmo com a ocorrência de erros, cada fase deve procurar prosseguir sempre que possível (compilador deve ser robusto). Maior parte dos erros ocorre durante análise sintática e semântica. 9/15/2018 Introdução

74 Transformações do Código
A medida que as etapas de análise e síntese se realizam, várias transformações ocorrem, cada uma delas modificando a representação de suas entradas pela adição de novas informações. 9/15/2018 Introdução

75 Transformações do Código
a = b + c * 3 Tabela de Símbolos # id info 1 a 2 b 3 c Análise Léxica Id1 = id2 + id3 * number Análise Sintática = id1 + Id2 * id3 Number 9/15/2018 Introdução

76 Transformações do Código
= id1 + Id2 * id3 Number Análise Semântica = id1 + Id2 * id3 Intoreal(3) 9/15/2018 Introdução

77 Transformações do Código
= id1 + Id2 * id3 Intoreal(3) Otimização Código Intermediário temp1 = id3 * 3.0 id1 = id2 + temp1 Geração de Código Intermediário Geração Código Alvo MOV id3, R2 MUL #3.0, R2 MOV id2, R1 ADD R2, R1 MOV R1, id1 temp1 = intoreal(3) temp2 = id3 * temp1 temp3 = id2 + temp2 id1 = temp3 9/15/2018 Introdução

78 Interpretação Existe um outro processo de execução de um programa com um modo bem diferente do método compilação / ligação / execução; Na compilação/ligação/execução para executar um programa é necessário que: Todos os comandos do código fonte sejam previamente convertidos para código objeto e Todas as referências externas sejam resolvidas (etapa de ligação). A compilação não compreende execução; ela é apenas uma fase de tradução, de conversão.

79 Interpretação (cont) Além disso, o método gera produtos bem distintos. como o código objeto e, mais tarde, o código executável; A INTERPRETAÇÃO se caracteriza por realizar as três fases (compilação, ligação e execução), comando a comando, do programa fonte; Não existe o processo explícito de compilação e ligação.

80 Interpretação(cont) Na INTERPRETAÇÃO um programa fonte é diretamente executado (interpretado) por um outro programa (o interpretador) e produz o resultado; Não há produtos intermediários, como o código objeto ou código executável, como acontece no método anterior; Escrevemos um arquivo com os comandos a serem executados e acionamos o interpretador.

81 Interpretação (cont) Na 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; Linguagens de programação compiladas: Cobol, Fortran, Pascal e C Linguagens interpretadas: PYTHON, PERL e PHP

82 Compilação x Interpretação
Ambos os métodos possuem vantagens e desvantagens, oriundas do modo próprio de funcionamento de cada um; A principal vantagem da interpretação sobre a compilação é sua capacidade de identificar e indicar um erro no programa fonte, seja na etapa de conversão da fonte para executável (estática), seja na execução do código binário (dinâmica), isto é, erro na lógica do algoritmo ou na inconsistência entre o valor do dado e o tipo de dado definido, por exemplo; Uma razoável desvantagem da interpretação é o consumo de memória, uma vez que a tradução, ligação e a execução são feitas comando a comando.

83 Compilação x Interpretação (cont)
No que se refere ao consumo de memória, verificamos que o método de compilação usa memória apenas por períodos definidos de tempo: O compilador permanece na memória só durante a fase de compilação; ao terminar esta fase, o compilador cede espaço para o ligador e este em seguida, para o carregador executar o código binário O interpretador permanece na memória durante toda a execução do programa, pois cada comando precisa do interpretador (outra desvantagem) Outra desvantagem da interpretação consiste na possibilidade de certas partes do código de um programa fonte (um laço, p.ex.) terem que ser interpretadas tantas vezes quantas definidas no laço, enquanto, no método de compilação, isto sempre acontece uma única vez.

84 Resumo de Uso de Recursos de Computação durante o Processo de Compilação e Interpretação
Uso da memória (durante a execução) - Interpretador ou Compilador Não Sim - Código Fonte Parcial - Código Executável - Rotinas de Bibliotecas Só as necessárias Todas Instruções de Máquina (durante a execução) - Operações de Tradução - Ligação de Bibliotecas - Programa de Aplicação

85 Compilação x Interpretação (cont)
Os interpretadores são vantajosos quando se trata de desenvolvimento de programa e correção de erros nesta fase; Na compilação, a identificação de erros no programa é difícil quando o código executável está em fase de execução. É difícil identificar exatamente a origem do erro, pois não há uma relação entre o comando do código fonte e as instruções de máquina do código executável.

86 Compilação x Interpretação (cont)
No código fonte temos nomes simbólicos de variáveis, no executável há endereços de memória; Um nome de comando é substituído por um ou mais códigos de operação numéricos; Erros de execução são, às vezes, bem difíceis de identificar devido, justamente, à falta de uma relação melhor definida entre fonte e executável.

87 Compilação x Interpretação (cont)
Na interpretação a relação entre código fonte e o executável é mais simples, porque cada comando fonte é imediatamente traduzido e executado; Assim, se ocorrer um erro o responsável deve ser o comando que está sendo executado e, portanto, já está identificado; O interpretador pode informar o erro, indicando diretamente o comando ou variável causadora da ocorrência, pelo seu nome simbólico e não por um endereço numérico de memória.

88

89 Máquina Virtual Java (Java Virtual Machine)
Quando escrevemos um programa em JAVA, este aplicativo pode ser executado tanto no Windows como no Linux e em outros SO’s; Para que isso ocorra, basta que exista a JVM instalada na máquina onde será executada a aplicação.

90 Máquina Virtual Java (cont) (Java Virtual Machine)
Nos aparelhos celulares encontramos diversos aplicativos Java: Cronômetro Agenda Jogos, etc.

91 Máquina Virtual Java (cont) (Java Virtual Machine)
A JVM é um mecanismo que permite executar código em Java em qualquer plataforma.

92 Máquina Virtual Java (cont) (Java Virtual Machine)
De acordo com a SUN ( Graças à JVM, os programas escritos em Java podem funcionar em qualquer plataforma de hardware e software que possua uma versão da JVM, tornando assim essas aplicações independentes da plataforma onde funcionam.

93 Máquina Virtual Java (cont) (Java Virtual Machine)
“...uma máquina imaginária implementada via software ou hardware que executa instruções vindas de bytecodes“.

94 Máquina Virtual Java (cont) (Java Virtual Machine)
Funcionamento da JVM: Quando escrevemos um programa em Java e o compilamos, o compilador gerará bytecodes desse programa; Bytecode é uma espécie de codificação que traduz tudo o que foi escrito no programa para um formato que a JVM entenda e seja capaz de executar; Assim, se fizermos um programa em Java no Linux, ele será capaz de executar no Windows ou em qualquer outro sistema operacional que tenha JVM.

95 Máquina Virtual Java (cont) (Java Virtual Machine)
Isso ocorre porque não existe bytecodes diferentes, isto é, os bytecodes dos programas em Java compilados no Windows são constituídos da mesma forma que bytecodes gerados se a compilação fosse feita em Mac OS, por exemplo.

96 JVM e a questão da segurança
A linguagem Java, não permite a criação de programas para fins maliciosos; Quando um programa em Java é executado, seu bytecode precisa passar pelos requisitos de segurança presentes na JVM, que impede a execução se o código tiver alguma irregularidade; Assim, se, por exemplo, no programa houver instruções para acessar áreas restritas da memória ou acessar recursos de hardware, a JVM não aprovará o código.

97 JVM e a questão da segurança (cont)
Outras linguagens, como C, são executadas diretamente pelo sistema operacional; Com isso, é possível criar programas que acessem recursos críticos do sistema; Em Java, a JVM atua como uma espécie de intermediária entre o programa e o sistema. Sendo assim, até mesmo o acesso a recursos de entrada e saída só é feito por meio da JVM.

98 JVM e a questão da segurança (cont)
Código-fonte Compilador Análise sintática e semântica Bytecode (para todas as arquiteturas) Máquina virtual Interpretação do Bytecode e execução

99 Runtime de Linguagem Comum (Common Language Runtime - CLR)
O “.Net” Common Language Runtime consiste em: Ambiente de execução (máquina virtual) que executa a linguagem intermediária (LI) e disponibiliza uma série de serviços (gerência de armazenamento, depuração, segurança, etc.) e um conjunto de bibliotecas de suporte (.Net Frameworks).

100 Runtime de Linguagem Comum (Common Language Runtime - CLR) (cont)
Atua no gerenciamento de códigos durante o tempo de execução; Os serviços oferecidos vão desde o gerenciamento de memória e conflitos à garantia de proteção aos códigos.

101 F I M


Carregar ppt "Montadores, Compiladores, Link-editores, Interpretadores"

Apresentações semelhantes


Anúncios Google