Montadores e Compiladores Prof. Idevar Gonçalves de Souza Júnior Conteúdo Programático Resumido Revisão da Arquitetura de Computadores Introdução a Teoria das Linguagens Compilação e Interpretação Análise Léxica, Sintática e Semântica Autômatos Finitos Determinísticos Árvore Sintática Notação Pós-Fixa Geração e Otimização de Código Introdução à Linguagem Assembly Bibliografia Básica: AHO, A. V.; SETHI, R.; ULLMAN, J. D. Compiladores: Princípios, Técnicas e Ferramentas. LTC Editora, Rio de Janeiro, 1995. PRICE, A. M. A., TOSCANI, S. S. Implementação de Linguagens de Programação: Compiladores, 2ª edição. Sagra Luzzatto, Porto Alegre, 2001. Complementar: MENEZES, P. B. Linguagens Formais e Automatos, 4ª edição. Sagra luzzato, Porto Alegre, 2001. TANENBAUM, ANDREW S. Organização Estruturada de Computadores. LTC, Rio de Janeiro 2000. WEBER, R. F. Arquitetura de Computadores Pessoais, 2ª edição. Sagra Luzzatto, Porto Alegre, 2001. 1
2
3
Linguagens de Programação Linguagens de Programação Linguagem (língua ou idioma): Meio mais eficaz de comunicação. Usuário: Pensamento não estruturado Linguagem de Programação Ligação Máquina: Lógica e Precisa A linguagem de programação fica mais fácil de ser compreendida se incluirmos construções próximas à linguagem humana (linguagem de alto nível) Computadores entendem linguagem de máquina, uma combinação de 0s e 1s. Os diversos tipos de tradutores realizam a conversão entre essas duas linguagens ou mais. Segundo o grau de independência da máquina 4
Segundo a forma de suas instruções Segundo as gerações Cronologicamente classificadas em 5 gerações: 1. Linguagens de Máquina 2. Linguagens Simbólicas (Assembly) 3. Linguagens Orientadas ao Usuário 4. Linguagens Orientadas à Aplicação 5. Linguagens de Conhecimento 1 e 2 Baixo Nível. As demais, alto nível. 1ª Geração de Linguagem Linguagem de máquina 1ºs computadores = programados em Linguagem Binária (0s e 1s) Programação complexa, cansativa e fortemente sujeita a erros. Comunicação direta com o computador em termos de bits. Cada instrução, em geral, era formada por uma operação e um ou dois endereços de registradores ou de memória. 5
2ª Geração de Linguagem Linguagens simbólicas ou de montagem Nesta linguagem, a maioria das instruções são representações simbólicas de instrução de máquina. Projetada para minimizar a dificuldade na programação em notação binária. O processo de um programa em linguagem simbólica requer tradução para a linguagem binária. Linguagem Assembly. IBM/360.30 - Cérebro Eletrônico Década de 70 Tamanho 32Kb de memória (16Kb Sistema Operacional) Linguagem Assembly Cartão Perfurado 3ª Geração Linguagem orientada ao usuário Procedimentais (procedurais ou imperativas): Baseada em procedimentos, uma seqüência de passos a serem seguidos para solucionar o problema. (BASIC, Visual Basic, PASCAL, ALGOL, ADA, C, C#, etc) Declarativas Funcionais: Baseada em funções recursivas A programação funcional envolve, essencialmente, a definição e a chamada de funções. (LISP) Lógicas: Baseada em Lógica Matemática São declarados fatos e cláusulas lógicas que permitem deduzir novas verdades a partir dos fatos conhecidos. O programador não detalha passos a serem seguidos. (PROLOG) 6
Procedimentais e declarativas Procedimental Lê a, b, c Calcula Delta=b^2-4ac Calcula X1=(-b+sqrt(Delta))/2a Calcula X2=(-b-sqrt(Delta))/2a Mostra X1,X2 Declarativa Função 1 Declaração Função 2 Declaração Função Delta (a,b,c) Declaração... Delta (1,2,3) 4ª Geração Orientada à aplicação As linguagens de 3ª geração foram projetadas para profissionais de processamento de dados. Sua depuração é mais demorada e a modificação de sistemas complexa para um usuário final. As linguagens de 4ª geração foram projetadas em resposta a esses problemas e com o objetivo de: 1. Facilitar a programação para os usuários finais. 2. Melhorar o processo de desenvolvimento de aplicações (maior desenvolvimento em menor tempo). 3. Facilitar a manutenção de aplicações. 4. Minimizar problemas de depuração. 5. Gerar códigos sem erros a partir de expressões de alto nível. 4ª Geração de Linguagem Introdução de mecanismos como: interação por vídeo (menus), preenchimento de formulário, construção de gráficos, estruturas de diálogo, mecanismos de verificação, dentre várias facilidades oferecidas. (LOTUS 1-2-3, Excel, SQL, etc. 7
5ª Geração de Linguagem As linguagens de 5ª geração são usadas principalmente na área de Inteligência Artificial. Essas linguagens facilitam a representação do conhecimento, que é essencial para a simulação de comportamentos inteligentes. Tradutores de Linguagens de Programação Tradutor, no contexto de linguagens de programação, é um sistema que aceita como entrada um programa escrito em uma linguagem de programação (L1) e produz um programa equivalente em outra linguagem de programação (L2). Programa Fonte Tradutor Programa Objeto Tradutores de Linguagens de Programação Podem ser classificados em: 1. Montadores (Assemblers) 2. Macro-Assemblers 3. Compiladores 4. Pré-Compiladores, Pré-Processadores ou Filtros 5. Interpretadores 8
Montadores (Assemblers) São aqueles tradutores que mapeiam instrução em linguagem simbólica (assembly) para instruções de linguagem de máquina. Geralmente mapeiam numa relação de 1 para 1 (uma instrução de linguagem simbólica para uma instrução em linguagem de máquina). Macro-Assemblers São Tradutores que mapeiam instruções em linguagem simbólica para linguagem de máquina Geralmente mapeiam numa relação de 1 para várias Compiladores São Tradutores que mapeiam programas escritos em linguagem de alto nível para programas equivalentes em linguagem simbólica ou de máquina. Programa Fonte Compilador Programa Objeto Tempo de Compilação Dados de Entrada Programa Objeto Resultados Tempo de Execução 9
Pré-Compiladores, Pré-Processadores ou Filtros São tradutores que efetuam conversão entre duas linguagens de alto nível. FORTRAN IV Nível G IBM Filtro FORTRAN IV Padrão ANSI Interpretadores Processadores que aceitam como entrada o código intermediário de um programa anteriormente traduzido e produzem o efeito de execução do algoritmo original, sem mapeá-lo em linguagem de máquina no disco. Programa Fonte Tradutor Programa Intermediário Interpretador Resultados Dados OBS: Alguns interpretadores trabalham diretamente sobre o código fonte Interpretadores Os interpretadores são geralmente menores que os compiladores e facilitam a implementação de construções complexas de linguagens de programação. No entanto, o tempo de execução de um programa interpretado é maior que o tempo necessário para executar um programa objeto (compilado) equivalente. 10
Exercícios Qual é a geração de linguagens mais utilizada atualmente pelos programadores? Classifique Montador, Compilador e Interpretador em ordem de vantagens (do mais vantajoso para o menos vantajoso), pelos seguintes parâmetros: - Velocidade - Tamanho - Portabilidade - Debugging (Depuração) - Facilidade de Programar Respostas 3ª geração. Velocidade: Montador > Compilador > Interpretador Tamanho: Montador > Compilador > Interpretador Portabilidade: Interpretador > Compilador > Montador Debugging: Interpretador > Compilador > Montador Facilidade de Programar: Interpretador = Compilador > Montador 11