Curso Sistemas de Informação Disciplina: Arquitetura de Software Compiladores e Interpretadores
Linguagem de Programação Uma Linguagem de Programação é composta de símbolos e códigos, regras de sintaxe e ferramenta. A primeira e mais primitiva linguagem de computador é a própria linguagem de máquina (formada por 0’s e 1’s).
Programação em Linguagem de Máquina Desenvolver um programa em linguagem de máquina é difícil, longo e principalmente caro de se construir. Um programa em linguagem de máquina é difícil de ser entendido por outros programadores. Essa complexidade levou a necessidade de desenvolver novas técnicas e ferramentas.
Linguagem Assembly e o Processo de Tradução O processo de tradução da linguagem de montagem para a linguagem de máquina é realizada por um programa chamado ASSEMBLER. Os programas de alto nível também precisam ser traduzidos para a linguagem de máquina. O processo de montagem traduz um programa escrito numa Linguagem de Programação num programa equivalente em Linguagem de Máquina.
Processo de Montagem e Tradução CÓDIGO FONTE TRADUÇÃO LINGUAGEM DE MÁQUINA
Compiladores (Processo de Compilação) Fonte LP Compilação Executável criado antes da execução LM Dados Execução
Interpretadores (Processo de Interpretação) Fonte LP Interpretação Executável criado em tempo de execução LM Dados Execução
Compiladores Híbridos LP Fonte Compilação Código intermediário criado antes da execução Código Intermediário Interpretação LM Executável criado em tempo de execução Dados Execução
Código Intermediário É mais ágil de INTERPRETAR. Não é específico de uma PLATAFORMA. Necessita ser instalado um INTERPRETADOR DE CÓDIGO.
Código Intermediário Exemplo.: JVM – Java Virtual Machine (Máquina Virtual Java) .NET – Dot Net (Máquina Virtual Microsoft) O código intermediário é chamado de bytecode.
Backus-Naur Form - BNF É uma linguagem usada para descrever outra linguagem. BNF é uma metalinguagem para descrever Linguagens de Programação.
Backus-Naur Form - BNF Foram os idealizadores iniciais da linguagem de livre contexto. John Backus Noam Chomsky Mais tarde Peter Naur modificou a linguagem para o projeto do Algol 60. Peter Naur
Gramática BNF Uma gramática em BNF é composta por um conjunto finito de regras para definir uma Linguagem de Programação. Portanto, a gramática consiste em um conjunto de definições “REGRAS”. É com a aplicação da gramática que conseguimos formar programas válidos na linguagem destino.
Exemplo de Gramática BNF <programa> ::= begin <list_inst> end <list_inst> ::= <instrução> ; | <instrução> ; <list_inst> <instrução> ::= <var> := <expressão> <var> ::= A | B | C <expressão> ::= <var> + <var> | <var> - <var> | <var>
Gramática BNF A BNF usa abstrações para representar estruturas sintáticas. Ex.: <expressão> Os itens léxicos são representados pelo negrito e são chamados de TERMINAIS. Ex.: A | B | C | D O símbolo ::= é usado no sentido de: “é definido por” <id> ::= A | B | C | D
Regras da BNF Sempre existe um símbolo não-terminal no lado esquerdo de uma instrução.| <var> ::= A | B | C | D No lado direito podemos ter terminais e/ou não-terminais. <var> ::= A | B | C | D <instrução> ::= <var> = <expressão>
Regras da BNF Sempre existe um símbolo não-terminal no lado esquerdo de uma instrução.| <var> ::= A | B | C | D No lado direito podemos ter terminais e/ou não-terminais. <var> ::= A | B | C | D <instrução> ::= <var> = <expressão>
Quais são os Não-Terminais e os Terminais ? <programa> ::= begin <lista_sentenças> end <lista_sentenças> ::= <sentença> ; | <sentença> ; <lista_sentenças> <sentença> ::= <id> := <expressão> <id> ::= A | B | C | D | E <expressão> ::= <id> + <id> | <id> - <id> | <id>
Quais são os Não-Terminais e os Terminais ? programa lista_sentenças sentença id expressão Terminais begin end ; := A B C D E + -
Exemplo de Programa Válido begin A := B + C; B := B - D; A := B; end Um programa apenas contém símbolos terminais!
Exemplo de uma Linguagem com SE condicional? <programa> ::= begin <lista_sentenças> end <lista_sentenças> ::= <sentença> ; | <sentença> ; <lista_sentenças> | <condição> ; <lista_sentenças> <sentença> ::= <id> := <expressão> <condição> ::= if <comparação> then <lista_sentenças> end if | if <comparação> then <lista_sentenças> else <lista_sentenças> end if <comparação> ::= <id> > <id> | <id> < <id> | <id> = <id> | <id> <> <id> | <id> <= <id> | <id> >= <id> <id> ::= A | B | C | D | E <expressão> ::= <id> + <id> | <id> - <id> | <id>
Parse Trees A := B + C <sentença> A := B + C <id> A := <expressão> <id> B + <id> C
Desenhe a Árvore de Análise para a instrução: Exercício Desenhe a Árvore de Análise para a instrução: A := B * ( A + C )
Exercício * <atrib> A := <expr> <expr> B ) ( + C
Exercício Desenhe a Árvore de Análise para a instrução: A := (B * C) + (A * C) + (B * C)