Baixe o app para aproveitar ainda mais
Prévia do material em texto
TAREFA: Exercícios Introdução 1 TAREFA: Exercícios Introdução Exercícios Propostos 1. (Price, 2005) No contexto de implementação de linguagens de programação, dê o significado dos seguintes termos: Linguagem de máquina A linguagem de máquina é a linguagem de mais baixo nível de entendimento pelo ser humano e a única, na verdade, entendida pelo processador. É constituída inteiramente de números, o que torna praticamente impossível entendê-la diretamente. Cada processador tem seu conjunto único de instruções que definem sua linguagem de máquina, estabelecido pelo fabricante do chip. Uma instrução típica em linguagem de máquina seria algo como: 0100 1111 1010 Essa linguagem é também classificada como uma linguagem de primeira geração. Pré-compiladores Pré-compilador é o programa responsável por mudanças no código fonte destinadas de acordo com decisões tomadas em tempo de compilação. Por exemplo, um programa na linguagem de programação C permite instruções condicionais para o pré-compilador que podem incluir ou não parte do código caso uma assertiva lógica seja verdadeira ou falsa, ou simplesmente um termo esteja definido ou não. Interpretadores Interpretador é outro tipo comum de processador de linguagem, mas em vez de produzir um programa objeto como resultado da tradução, um interpretador executa diretamente as operações especificadas no programa fonte sobre as entradas fornecidas pelo usuário. Compiladores (Tradutores) Compilador é o programa que recebe como entrada um programa em uma linguagem de programação - a linguagem fonte - e o traduz para um programa equivalente em outra linguagem - a linguagem objeto. Um papel importante do TAREFA: Exercícios Introdução 2 compilador é relatar quaisquer erros no programa fonte detectados durante esse processo de tradução. Montadores (Assemblers) Montador é o programa que faz a tradução entre uma linguagem de montagem (assembly) e o código de máquina. Muitos confundem os termos assembler (o programa montador) e assembly (a linguagem de montagem). Ligadores (Linkers) Resolve referências simbólicas cruzadas (cross-references) entre os códigos- objeto. Carregadores (Loaders) Carrega segmentos (instruções e/ou dados) nos endereços de memória reservados e inicia execução. 2. Descreva as tarefas efetuadas pelos seguintes programas, e explique como eles se assemelham ou se relacionam a compiladores: Um pré-processador C E um tradutor que efetuam conversões da linguagem C para a linguagem de máquina. Os récompiladores surgiram para facilitar a extensão de linguagens de alto nível existentes. Um pretty-printer (formatador de programas) Tem como finalidade formatar o texto, porém deve verificar se existe o tipo de fonte, o tamanho da fonte, o estilo, entre outros devem ser verificados para realizar a formatação. Um colorizador de programas de um editor de texto Um montador São aqueles tradutores que mapeiam instruções em linguagem simbólica (assembly) para instruções em linguagem de máquina, geralmente, numa relação TAREFA: Exercícios Introdução 3 de um pra um, isto é, uma instrução de linguagem simbólica para uma instrução de máquina. Um linkeditor do sistema operacional Tem a função de efetuar a ligação dos módulos em código objeto e gerar um único programa executável. 3. (Aho, 2008) Qual é a diferença entre um compilador e um interpretador? Compiladores são tipos de tradutores que possuem uma forma específica de conversão, visto que, atuam na transformação de uma linguagem de alto nível para uma linguagem de baixo nível - linguagem de máquina. Assim como o compilador, um interpretador analisa sintática e semanticamente um programa escrito em uma determinada linguagem de programação, mas no entanto, algumas diferenças são observadas, principalmente no que se refere à forma de se executar o programa em questão: o compilador executa o programa somente após ter traduzido o mesmo por inteiro; já o interpretador, lê, traduz e executa cada linha de código sequencialmente, ou seja, passo a passo; no compilador, há geração de um código de máquina ao final do processo de tradução; já no interpretador, não existe a criação de código executável. 4. (Price, 2005) Aponte as vantagens e desvantagens dos interpretadores em relação aos compiladores? Vantagens dos compiladores: 1. a execução do programa é mais rápida; 2. estruturas de dados mais completas; 3. permitem a otimização de código fonte; 4. impossibilita ou pelo menos dificulta ser quebrado e visualizado o código fonte original. Desvantagens dos compiladores: 1. várias etapas de tradução; 2. processo de correção de erro e de depuração é mais demorado; TAREFA: Exercícios Introdução 4 3. programação final é maior, o que gera a necessidade de mais memória. Vantagens dos interpretadores: 1. depuração é mais simples; 2. consomem menos memória; 3. resultado imediato do programa ou rotina desenvolvida. Desvantagens dos interpretadores: 1. a execução do programa é mais lenta; 2. estrutura de dados demasiadamente simples; 3. necessário fornecer o programa fonte ao utilizador. 5. (Aho, 2008) Que vantagens existem em um sistema de processamento de linguagem no qual o compilador produz linguagem simbólica em vez de linguagem de máquina? Uma linguagem de máquina é constituída inteiramente por códigos numéricos, representados por números hexadecimais ou binários, tornando as instruções praticamente impossíveis de serem compreendidas diretamente por humanos. Uma linguagem simbólica é constituída por mnemônicos, tornando as instruções mais compreensíveis por humanos. Considerando, por exemplo, o processador hipotético proposto por Ricarte (2008), a instrução em linguagem simbólica LOAD 5, R1 é mais compreensível do que a instrução em linguagem de máquina 00010101 , apesar de ambas as instruções transferirem o conteúdo da posição de memória 5 para o registrador R1. A linguagem de máquina é a linguagem utilizada pelo processador para efetuar diretamente o processamento, estando diretamente relacionada as características do processador. A linguagem simbólica, por sua vez, não é executada diretamente pelo processador, sendo portanto independente do processador, de modo que a linguagem simbólica possa ser traduzida para várias linguagens de máquina, possibilitando que os programas desenvolvidos possam ser executados em diversos processadores com características diferentes, denominado portabilidade. Esse é, por exemplo, o mecanismo utilizado pela linguagem de programação Java, que ao ser compilado não produz linguagem de máquina, mas uma linguagem simbólica chamada de bytecode, que é a linguagem reconhecida pela Máquina Virtual Java (JVM). TAREFA: Exercícios Introdução 5 6. (Aho, 2008) Um compilador que traduz uma linguagem de alto nível para outra linguagem de alto nível é chamada de tradutor de fonte para fonte. Que vantagens existem em usar a linguagem de programação C como linguagem objeto para um compilador? A vantagem é poder ter portabilidade, pois existem compiladores C para quase todas as arquiteturas computacionais conhecidas, uma vez que a linguagem de programação C é praticamente a mãe de todas as linguagens de programação modernas. Outra vantagem importante é o desempenho, uma vez que a linguagem de programação C permite o compartilhamento de recursos de alto e baixo nível, permitindo o acesso direto aos instruções do microprocessador. 7.(Price, 2005) Qual o significado de "passo" no processo de compilação? Quais as vantagens e desvantagens de implementar um compilador em vários passos? Uma compilação pode ser realizada em um ou em vários passos. Entende-se por passo a passagem completa do compilador sobre o programa fonte que está sendo compilado. Em uma compilação em vários passos, a execução de um passo termina antes de iniciar-se a execução dos passos seguintes. Assim, o compilador de dois passos, por exemplo, poderia combinar a análise léxica e análise sintática num primeiro passoe a análise semântica e a geração de código num segundo passo. De outra forma, pode-se utilizar o analisador sintático como módulo principal: para construir a árvore sintática, obtém os tokens necessários através de chamadas ao analisador léxico e chama o processo de geração de código para executar a análise semântica e geração de código objeto. Os critérios para escolha da forma de implementação envolvem: memória disponível, tempo de compilação ou tempo de execução, características da linguagem, equipe de desenvolvimento, disponibilidade de ferramentas de apoio, e prazo de desenvolvimento. A principal vantagem de se construir compiladores de vários passos é a modularização alcançada no projeto e na implementação dos processos que constituem o compilador. A principal desvantagem é o aumento do projeto total, com a necessidade de introdução das linguagens (arquivos) intermediárias. TAREFA: Exercícios Introdução 6 8.(Aho, 2008) Descreva algumas das tarefas que um programa montador precisa realizar. O montador (assembler) é o programa do sistema responsável por traduzir o código assembly em linguagem de máquina, traduzindo cada instrução do programa para a sequência de bits que codifica a instrução de máquina. Como cada processador tem sua própria linguagem, montadores são específicos para processadores. Em geral, montadores oferecem facilidades além da simples tradução de código assembly para código de máquina. Além das instruções do processador, um programa fonte para o montador pode conter diretivas ou pseudo-instruções definidas para o montador (e não para o processador), assim como macro-instruções, uma sequência de instruções que será inserida no código ao ser referenciada pelo nome. Um montador que suporte a definição e utilização de macro-instruções é usualmente denominado um macro-montador (macro-assembler). Um montador multiplataforma (cross-assembler) é um montador que permite gerar código para um processador-alvo diferente daquele no qual o montador está sendo executado. 9.(José Neto, 2016) Quais as dificuldades encontradas quando se deseja transportar um compilador de uma máquina para outra? Como contorná-las? Caso o compilador tenha sido projetado de forma modular, a maior dificuldade seria no processo de otimização dependente de máquina, que teria que ser reescrito para a nova máquina destino, uma vez que os recursos fornecidos provavelmente seriam diferentes da máquina original. Agora, caso o compilador não tenha sido projetado de forma modular, provavelmente se teria que reescrever todo o compilador novamente, pois as rotinas de otimização dependente de máquina estariam mescladas com as rotinas dos demais processos envolvidos no desenvolvimento do compilador.
Compartilhar