SlideShare uma empresa Scribd logo
1 de 41
Baixar para ler offline
Compiladores na visão do usuário

           Ivan Ricarte


              2008




                               I NTRODUÇÃO À COMPILAÇÃO
Sumário
  Compiladores na programação
    A linguagem dos processadores
    Linguagens de alto nível
  Compiladores no processamento da informação
    Processamento de arquivos XML
    Páginas dinâmicas na Web
  Atividades de um compilador
      Leitura de arquivo de origem
      Escrita de arquivos de destino
      Interação com arquivos padrão
  Exemplos de compiladores
     Compilador C++
     Exemplo de processamento XML
  Sugestões de leitura
                                                I NTRODUÇÃO À COMPILAÇÃO
Para que compiladores?
A programação antes dos compiladores




                                                     add C,A,B
                      C = A + B!

                                         Programador
                                         Computador X

                                                   Load A
                                                   Add B
                                  Programador
                                                   Store C
                                  Computador Y


                                       SUM A,B,C
                   Programador
                   Computador Z




                                                                 I NTRODUÇÃO À COMPILAÇÃO
Para que compiladores?
A programação com os compiladores




                                                      add C,A,B
                                           Tradutor
                  C = A + B!                  X


                              REAL A,B,C
                                           Tradutor    Load A
                              C=A+B
                                                       Add B
                                              Y
                                                       Store C

                                           Tradutor
                   Programador
                                              Z       SUM A,B,C
                   genérico




                                                            I NTRODUÇÃO À COMPILAÇÃO
A linguagem dos processadores



     Cada processador tem seu próprio jogo de instruções
         Instruções refletem as características peculiares de cada
         processador — sua arquitetura
     Para cada instrução, duas representações
     Linguagem de máquina: seqüência de bits que codifica
                 instrução no formato apropriado para a
                 interpretação pelos circuitos
     Linguagem simbólica: representação mnemônica (textual)




                                                        I NTRODUÇÃO À COMPILAÇÃO
Exemplo
Arquitetura de um processador hipotético




                                       A0−A3
                          R0
                          R1
                          R2
                          R3               D0−D7
                                                   memória
                  processador




                                                             I NTRODUÇÃO À COMPILAÇÃO
Exemplo
Instruções desse processador




           LOAD para transferir o conteúdo de uma posição de
                memória para um registrador.
         STORE para transferir o conteúdo de um registrador para
               uma posição de memória.
            ADD para adicionar o conteúdo de dois registradores e
                armazenar o resultado em outro registrador.
         BZERO para mudar o conteúdo do contador de programas
               para a posição de memória especificada se o
               conteúdo do registrador indicado for igual a zero.




                                                       I NTRODUÇÃO À COMPILAÇÃO
Exemplo
Características do processador e impacto no formato da instrução de máquina


          Quatro instruções
           ⇒ Código de operação de dois bits:
                   LOAD 00
                 STORE 01
                    ADD 10
                 BZERO 11
          Quatro registradores de dados (além de outros não
          representados)
           ⇒ Endereços de registradores ocupam dois bits
          Capacidade de endereçar 16 posições de memória
           ⇒ endereços de memória ocupam quatro bits
          Palavras de oito bits
           ⇒ nenhum impacto


                                                                  I NTRODUÇÃO À COMPILAÇÃO
Exemplo
Um programa desse processador




    Linguagem simbólica         Linguagem de
    LOAD    10,   R1            máquina
    LOAD    11,   R2            00101001
    ADD     R1,   R2, R0        00101110
    STORE   R0,   12            10011000
                                01001100




                                               I NTRODUÇÃO À COMPILAÇÃO
Linguagens de alto nível



      Permitem expressar os comandos de forma independente
      do processador
      Comandos em linguagem mais próxima da humana
      Variações nas linguagens de acordo com seu objetivo
       FORTRAN Programação científica
           C, C++ Programação de sistemas
           Pascal Programação estruturada
               lisp Processamento simbólico




                                                   I NTRODUÇÃO À COMPILAÇÃO
Papel dos compiladores


  Compilador
  Programa que realiza a tradução de um programa em uma
  linguagem para um programa equivalente em outra linguagem

      Tipicamente: linguagem de alto nível → linguagem de
      máquina
      mas também: linguagem de alto nível → linguagem
      intermediária
      ou: linguagem intermediária → linguagem de máquina
      ou ainda: linguagem de script → linguagem de alto nível



                                                     I NTRODUÇÃO À COMPILAÇÃO
Compiladores no processamento da informação




     Compiladores traduzem descrições de uma linguagem
     para outra
     Mesmo tipo de processamento está presente em
     aplicações que processam arquivos com informações
         Processamento de arquivos XML
         Processamento de páginas dinâmicas para a Web




                                                   I NTRODUÇÃO À COMPILAÇÃO
Processamento de arquivos XML


  XML
  eXtensible Markup Language

     Aplicações em troca de informações entre processos
     distribuídos, em manutenção de arquivos de configuração
     e em representação de textos
     Arquivo organizado em elementos definidos por
     marcações e, eventualmente, conteúdos
     Existem regras básicas de formação para esses arquivos
     Esquemas podem restringir como esses elementos podem
     ser combinados



                                                    I NTRODUÇÃO À COMPILAÇÃO
Exemplo de arquivo XML



  <livro>
    <titulo>Dom Casmurro</titulo>
    <autor>Machado de Assis</autor>
    <ano>1900</ano>
  </livro>


  Como se compara o processamento desse arquivo à
  compilação de um programa em linguagem de alto nível?




                                                  I NTRODUÇÃO À COMPILAÇÃO
Páginas dinâmicas na Web



     Página dinâmica é criada no momento do atendimento a
     uma solicitação, a partir de uma descrição genérica que
     deve ser processada
     Tipicamente, descrição contém diretivas em uma
     linguagem de script que geram os conteúdos
     apresentados
     O resultado desse processamento é um arquivo com
     conteúdo em HTML (Hypertext Markup Language)




                                                   I NTRODUÇÃO À COMPILAÇÃO
Exemplo de especificação de página dinâmica


  <csp>
  <@ #include ... %>
  <% // código C ... %>
  <html>
         Conteúdo em HTML
         com <%= código C %>
  </html>
  </csp>


  Como se compara o processamento desse arquivo à
  compilação de um programa em linguagem de alto nível?



                                                  I NTRODUÇÃO À COMPILAÇÃO
Atividades de um compilador




   Arquivo de                                  Arquivo de
                   Análise           Síntese
     origem                                     destino


                Gramáticas   Estruturas
                              internas




                                               I NTRODUÇÃO À COMPILAÇÃO
Análise



  Análise léxica
  Identificação dos elementos básicos da linguagem a partir dos
  caracteres individuais do arquivo fonte

  Análise sintática
  Reconhecimento, a partir dos elementos básicos, da estrutura
  de comandos básicos, de blocos de comandos, de funções, de
  programas




                                                    I NTRODUÇÃO À COMPILAÇÃO
Síntese




  Geração de código
  Produção do código equivalente ao programa original a partir
  da estrutura construída na análise sintática

  Otimização
  Reorganização do código gerado para eliminar redundâncias e
  melhorar desempenho




                                                     I NTRODUÇÃO À COMPILAÇÃO
Geração do código executável




      O compilador utiliza outros programas do sistema para
      produzir o código executável a partir do código em
      linguagem simbólica
         Montador Tradução do código em linguagem simbólica
                   para o código de máquina
           Ligador Combinação de códigos de máquina de
                   diferentes módulos num único módulo




                                                  I NTRODUÇÃO À COMPILAÇÃO
Necessidade de manipulação de arquivos




     Entrada e saída para o compilador são arquivos
         Entrada arquivo de texto com a especificação de alto
                 nível (código-fonte)
          Saída arquivo binário com o código executável em
                 linguagem de máquina (módulo objeto)
     Outros arquivos temporários podem ser utilizados em
     etapas intermediárias




                                                   I NTRODUÇÃO À COMPILAÇÃO
Arquivos em C++



     As necessidades de um compilador relativas à interação
     com arquivos restringem-se ao acesso seqüencial
     Para tal fim, C++ trabalha com o conceito de streams
         Fontes ou destinos de dados acessados seqüencialmente
     Arquivos em disco podem ser manipulados como streams
     (fstream)
          ifstream para leitura seqüencial de arquivos
         ofstream para escrita seqüencial de arquivos




                                                    I NTRODUÇÃO À COMPILAÇÃO
Leitura de arquivos



      Inicialmente, é preciso associar o arquivo ao objeto
      (variável) que será a ele associado
      Com o construtor
                   ifstream
                   nomeVariavel(nomeArquivo);
      Com o método open
                   ifstream nomeVariavel;
                   ...
                   nomeVariavel.open(nomeArquivo);




                                                   I NTRODUÇÃO À COMPILAÇÃO
Modo de abertura




     O modo padrão para abertura de um arquivo é considerar
     que seu conteúdo é texto
     Se conteúdo é binário, é preciso indicar esse fato na
     abertura do arquivo
     Especificar o flag ios::binary como segundo
     argumento do construtor ou do método open




                                                     I NTRODUÇÃO À COMPILAÇÃO
Leitura do conteúdo do arquivo
Modo texto




         Para a leitura de caracteres de um arquivo texto (ifstream)
         Operador >> lê conteúdo com interpretação de formato,
                       ignorando espaços em branco
         Método get lê cada caráter do arquivo sem interpretação,
                       retornando o valor inteiro do código ASCII
                       correspondente
         Método getline lê um bloco (uma linha) de caracteres para
                       um arranjo de caracteres especificado pelo
                       programador




                                                         I NTRODUÇÃO À COMPILAÇÃO
Leitura do conteúdo do arquivo
Modo binário




          Para leitura de seqüências de bits de um arquivo
          Método read lê um bloco de bytes para um arranjo
                        especificado pelo programador

    eof
    Qualquer que seja o tipo de conteúdo do arquivo, o método
    eof retorna true quando o final do arquivo é alcançado




                                                       I NTRODUÇÃO À COMPILAÇÃO
Escrita de arquivos de destino



      Também é preciso associar o arquivo a um objeto
      Com o construtor
                 ofstream
                 nomeVariavel(nomeArquivo);
      Com o método open
                 ofstream nomeVariavel;
                 ...
                 nomeVariavel.open(nomeArquivo);




                                               I NTRODUÇÃO À COMPILAÇÃO
Escrita do conteúdo em disco



      Para ofstream, outros especificadores além de
      ios::binary podem ser indicados na abertura do
      arquivo
      Caso arquivo já exista
          ios::app agrega novo conteúdo ao conteúdo já
                   existente
        ios::trunc substitui conteúdo existente pelo novo
                   conteúdo




                                                      I NTRODUÇÃO À COMPILAÇÃO
Escrita do conteúdo em disco



      Operações para realizar a escrita no arquivo:
      Operador << formata (transforma valores de variáveis em
                  caracteres)
      Método put escreve um caráter, sem interpretação
      Método write escreve um bloco de dados, sem
                  interpretação
      Método flush descarrega o buffer interno de dados para o
                  arquivo




                                                   I NTRODUÇÃO À COMPILAÇÃO
Interação com arquivos padrão


      Todo programa ao executar inicia com três streams
      associados
              cin arquivo padrão para entrada de caracteres
                  (ifstream)
             cout arquivo padrão para saída de caracteres
                  (ofstream)
             cerr arquivo padrão para saída de mensagens de
                  erro (ofstream)
      Para usá-los:
      #include <iostream>
      using namespace std;



                                                  I NTRODUÇÃO À COMPILAÇÃO
Exemplo de compilador C++: gcc/g++


     Compilador C/C++ do Projeto Gnu, para ambientes do tipo
     unix
     Invocado sem outros argumentos a não ser o nome do
     arquivo, realiza quatro tarefas
       1.   Pré-processamento (invoca programa cpp)
       2.   Compilação
       3.   Montagem (invoca programa as)
       4.   Ligação (invoca programa ld)
     Resultado final é a criação de um arquivo executável no
     disco (a.out)
            Nome padrão pode ser alterado com a chave -o




                                                           I NTRODUÇÃO À COMPILAÇÃO
Processamento parcial


     Processamento pode ser interrompido após cada uma das
     etapas intermediárias por meio do uso de outras chaves
     para o programa
       1. Após pré-processamento: chave -E
              Resultado é direcionado para a saída padrão
       2. Após compilação propriamente dita: chave -S
              Resultado (arquivo texto, assembly) é criado num arquivo
              em disco com mesmo nome do arquivo de entrada mas com
              extensão .s
       3. Após montagem: chave -c
              Resultado é criado num arquivo binário (código objeto) em
              disco com extensão .o




                                                            I NTRODUÇÃO À COMPILAÇÃO
Indicação de erros de compilação




  Considere a compilação do seguinte programa (hello.cpp):

  #include <iostream>
  using namespace std;
  int main() {
    cout << "Oi, gente!" << endl;
  }




                                                    I NTRODUÇÃO À COMPILAÇÃO
Indicação de erros de compilação




  Omissão de ; na quarta linha:

  hello.cpp: In function ‘int main()’:
  hello.cpp:5: parse error before ‘}’ token

  Por que o compilador gerou essa mensagem?




                                              I NTRODUÇÃO À COMPILAÇÃO
Indicação de erros de compilação

  Omissão de " de abertura na quarta linha:
  hello.cpp: In function ‘int main()’:
  hello.cpp:4: ‘Oi’ undeclared (first use this function)
  hello.cpp:4: (Each undeclared identifier is reported
       only once for each function it appears in.)
  hello.cpp:4: ‘gente’ undeclared (first use this
       function)
  hello.cpp:4: parse error before ‘!’ token
  hello.cpp:4:21: warning: multi-line string literals
       are deprecated
  hello.cpp:4:21: missing terminating " character
  hello.cpp:4:21: possible start of unterminated string
       literal


  Por que o compilador gerou essas mensagens?

                                                I NTRODUÇÃO À COMPILAÇÃO
Exemplo de processamento XML




     Analisador Xerces-C
         Suíte de aplicativos para processamento de arquivos com
         conteúdo em XML
     Exemplo
      SAXCount se arquivo estiver correto, indica quantos
               elementos XML foram reconhecidos




                                                      I NTRODUÇÃO À COMPILAÇÃO
Exemplo
  Arquivo livros.xml:
  <livros>
    <livro>
      <título>Dom Casmurro</título>
      <autor>Machado de Assis</autor>
      <ano>1900</ano>
    </livro>
    <livro>
      <título>As Intermitências da Morte</título>
      <autor>José Saramago</autor>
      <ano>2005</ano>
    </livro>
  </livros>

  Resultado:
  livros.xml: 1 ms (9 elems, 0 attrs, 0 spaces, 118 chars)
                                                        I NTRODUÇÃO À COMPILAÇÃO
Indicação de erros




   Troca de primeiro livro por lirvo:

   Fatal Error at file livros.xml, line 6, char 5
     Message: Expected end of tag ’lirvo’




                                         I NTRODUÇÃO À COMPILAÇÃO
Indicação de erros




   Omissão da primeira marcação /livro:

   Fatal Error at file livros.xml, line 11, char 8
     Message: Unterminated end tag, ’livro’




                                          I NTRODUÇÃO À COMPILAÇÃO
Indicação de erros




   Omissão da marcação /livros:

   Fatal Error at file livros.xml, line 13, char 1
     Message: The input ended before all started
               tags were ended. Last tag started
               was ’livros’




                                         I NTRODUÇÃO À COMPILAÇÃO
Sugestões de leitura (Web)




      C++
       Referência http://www.cppreference.com/
      Compilador http://gcc.gnu.org/
      XML
       Referência http://www.w3.org/XML/
       Analisador http:
                  //xerces.apache.org/xerces-c/




                                            I NTRODUÇÃO À COMPILAÇÃO

Mais conteúdo relacionado

Mais procurados

Aula 3 - Algoritmos computacionais - parte 1
Aula 3 - Algoritmos computacionais - parte 1Aula 3 - Algoritmos computacionais - parte 1
Aula 3 - Algoritmos computacionais - parte 1
Pacc UAB
 
Sistemas Distribuídos - Computação Paralela - Introdução
Sistemas Distribuídos - Computação Paralela - IntroduçãoSistemas Distribuídos - Computação Paralela - Introdução
Sistemas Distribuídos - Computação Paralela - Introdução
Adriano Teixeira de Souza
 

Mais procurados (20)

aula 04 - Logica de programacao
aula 04 - Logica de programacaoaula 04 - Logica de programacao
aula 04 - Logica de programacao
 
Trabalho linux
Trabalho linuxTrabalho linux
Trabalho linux
 
Apresentação HTML e CSS
Apresentação HTML e CSSApresentação HTML e CSS
Apresentação HTML e CSS
 
Aula 3 - Algoritmos computacionais - parte 1
Aula 3 - Algoritmos computacionais - parte 1Aula 3 - Algoritmos computacionais - parte 1
Aula 3 - Algoritmos computacionais - parte 1
 
Apostila 5 processos e threads
Apostila 5   processos e threadsApostila 5   processos e threads
Apostila 5 processos e threads
 
Sistemas Operacionais - Aula 01 (Conceitos básicos de so)
Sistemas Operacionais - Aula 01 (Conceitos básicos de so)Sistemas Operacionais - Aula 01 (Conceitos básicos de so)
Sistemas Operacionais - Aula 01 (Conceitos básicos de so)
 
Sistemas Distribuídos - Computação Paralela - Introdução
Sistemas Distribuídos - Computação Paralela - IntroduçãoSistemas Distribuídos - Computação Paralela - Introdução
Sistemas Distribuídos - Computação Paralela - Introdução
 
Sistemas Operacionais - 03 - Tipos e Estrutura dos SO
Sistemas Operacionais - 03 - Tipos e Estrutura dos SOSistemas Operacionais - 03 - Tipos e Estrutura dos SO
Sistemas Operacionais - 03 - Tipos e Estrutura dos SO
 
Aula de Introdução - JAVA
Aula de Introdução  - JAVAAula de Introdução  - JAVA
Aula de Introdução - JAVA
 
Curso javascript básico
Curso javascript básicoCurso javascript básico
Curso javascript básico
 
Paradigmas de programação
Paradigmas de programaçãoParadigmas de programação
Paradigmas de programação
 
Python - Introdução
Python - IntroduçãoPython - Introdução
Python - Introdução
 
Sistemas operacionais
Sistemas operacionaisSistemas operacionais
Sistemas operacionais
 
Aula 1 - Introdução a Engenharia de Software
Aula 1 -  Introdução a Engenharia de SoftwareAula 1 -  Introdução a Engenharia de Software
Aula 1 - Introdução a Engenharia de Software
 
Aula 3 - Sistemas operacionais - Linux
Aula 3 - Sistemas operacionais - LinuxAula 3 - Sistemas operacionais - Linux
Aula 3 - Sistemas operacionais - Linux
 
Introdução à Computação Aula 01 - Apresentação
Introdução à Computação  Aula 01 - ApresentaçãoIntrodução à Computação  Aula 01 - Apresentação
Introdução à Computação Aula 01 - Apresentação
 
Banco de Dados - Introdução - Projeto de Banco de Dados - DER
Banco de Dados - Introdução - Projeto de Banco de Dados - DERBanco de Dados - Introdução - Projeto de Banco de Dados - DER
Banco de Dados - Introdução - Projeto de Banco de Dados - DER
 
Aula - Introdução a Engenharia de Software
Aula - Introdução a Engenharia de SoftwareAula - Introdução a Engenharia de Software
Aula - Introdução a Engenharia de Software
 
Aula 1 Analise e Projeto
Aula 1   Analise e ProjetoAula 1   Analise e Projeto
Aula 1 Analise e Projeto
 
Aula 6 - Qualidade de Software
Aula 6 - Qualidade de SoftwareAula 6 - Qualidade de Software
Aula 6 - Qualidade de Software
 

Destaque

Cae software científico e de engenharia
Cae   software científico e de engenhariaCae   software científico e de engenharia
Cae software científico e de engenharia
Jaime Teixeira
 
Aula 8 - Lógica de Programação - Variáveis, Tipos de dados e Operadores
Aula 8 - Lógica de Programação - Variáveis, Tipos de dados e OperadoresAula 8 - Lógica de Programação - Variáveis, Tipos de dados e Operadores
Aula 8 - Lógica de Programação - Variáveis, Tipos de dados e Operadores
André Constantino da Silva
 
Lista de exercicios algoritmos resolvida-
Lista de exercicios   algoritmos  resolvida-Lista de exercicios   algoritmos  resolvida-
Lista de exercicios algoritmos resolvida-
Mauro Pereira
 

Destaque (11)

Introducao a LPC
Introducao a LPCIntroducao a LPC
Introducao a LPC
 
Teoria da Computação
Teoria da ComputaçãoTeoria da Computação
Teoria da Computação
 
Inteligência Artificial Parte 6 [IA]
Inteligência Artificial Parte 6 [IA]Inteligência Artificial Parte 6 [IA]
Inteligência Artificial Parte 6 [IA]
 
Curso de IA - Parte 4 -
Curso de IA - Parte 4 -Curso de IA - Parte 4 -
Curso de IA - Parte 4 -
 
Curso de Inteligência Artificial - Parte 3 -
Curso de Inteligência Artificial - Parte 3 -Curso de Inteligência Artificial - Parte 3 -
Curso de Inteligência Artificial - Parte 3 -
 
Inteligência Artificial - Parte 5 -
Inteligência Artificial - Parte 5 - Inteligência Artificial - Parte 5 -
Inteligência Artificial - Parte 5 -
 
Cae software científico e de engenharia
Cae   software científico e de engenhariaCae   software científico e de engenharia
Cae software científico e de engenharia
 
Aula 8 - Lógica de Programação - Variáveis, Tipos de dados e Operadores
Aula 8 - Lógica de Programação - Variáveis, Tipos de dados e OperadoresAula 8 - Lógica de Programação - Variáveis, Tipos de dados e Operadores
Aula 8 - Lógica de Programação - Variáveis, Tipos de dados e Operadores
 
Linguagem de programação
Linguagem de programação Linguagem de programação
Linguagem de programação
 
Curso Inteligência Artificial - Parte 1 -
Curso Inteligência Artificial - Parte 1 -Curso Inteligência Artificial - Parte 1 -
Curso Inteligência Artificial - Parte 1 -
 
Lista de exercicios algoritmos resolvida-
Lista de exercicios   algoritmos  resolvida-Lista de exercicios   algoritmos  resolvida-
Lista de exercicios algoritmos resolvida-
 

Semelhante a Compiladores 1

Linguagem C e Dev-C++ Algumas Explicações
Linguagem C e Dev-C++  Algumas ExplicaçõesLinguagem C e Dev-C++  Algumas Explicações
Linguagem C e Dev-C++ Algumas Explicações
nataferraz
 
Componentes De Um Computador
Componentes De Um ComputadorComponentes De Um Computador
Componentes De Um Computador
Alexandre Rojas
 
Geração de código linguagem c
Geração de código   linguagem cGeração de código   linguagem c
Geração de código linguagem c
Jefferson Bessa
 

Semelhante a Compiladores 1 (20)

Oc2 cap03
Oc2 cap03Oc2 cap03
Oc2 cap03
 
paradigmasdlsksmmskskkekekekekedmmmdmdmmf.pdf
paradigmasdlsksmmskskkekekekekedmmmdmdmmf.pdfparadigmasdlsksmmskskkekekekekedmmmdmdmmf.pdf
paradigmasdlsksmmskskkekekekekedmmmdmdmmf.pdf
 
Apostila c
Apostila cApostila c
Apostila c
 
Componentes de um Computador
Componentes de um ComputadorComponentes de um Computador
Componentes de um Computador
 
Linguagem C e Dev-C++ Algumas Explicações
Linguagem C e Dev-C++  Algumas ExplicaçõesLinguagem C e Dev-C++  Algumas Explicações
Linguagem C e Dev-C++ Algumas Explicações
 
C++ introducao
C++ introducaoC++ introducao
C++ introducao
 
Componentes De Um Computador
Componentes De Um ComputadorComponentes De Um Computador
Componentes De Um Computador
 
Linguagem c
Linguagem cLinguagem c
Linguagem c
 
Paradigmas de Linguagem
Paradigmas de LinguagemParadigmas de Linguagem
Paradigmas de Linguagem
 
Linguagem c
Linguagem cLinguagem c
Linguagem c
 
Introdução+à+linguagem+c
Introdução+à+linguagem+cIntrodução+à+linguagem+c
Introdução+à+linguagem+c
 
Mini Curso de C
Mini Curso de CMini Curso de C
Mini Curso de C
 
Algoritmos e Programação: Apresentação da ferramenta de programação. Comandos...
Algoritmos e Programação: Apresentação da ferramenta de programação. Comandos...Algoritmos e Programação: Apresentação da ferramenta de programação. Comandos...
Algoritmos e Programação: Apresentação da ferramenta de programação. Comandos...
 
joane
joane joane
joane
 
Introdução à Linguagem de Programação C
Introdução à Linguagem de Programação CIntrodução à Linguagem de Programação C
Introdução à Linguagem de Programação C
 
Compiladores 5
Compiladores 5Compiladores 5
Compiladores 5
 
Módulo 5 Arquitetura de Computadores
Módulo 5 Arquitetura de ComputadoresMódulo 5 Arquitetura de Computadores
Módulo 5 Arquitetura de Computadores
 
Geração de código linguagem c
Geração de código   linguagem cGeração de código   linguagem c
Geração de código linguagem c
 
Principios e paradigmas_de_computacao2
Principios e paradigmas_de_computacao2Principios e paradigmas_de_computacao2
Principios e paradigmas_de_computacao2
 
Aula 03 - Interpretador [mr_@@@@@].pdf
Aula 03 - Interpretador [mr_@@@@@].pdfAula 03 - Interpretador [mr_@@@@@].pdf
Aula 03 - Interpretador [mr_@@@@@].pdf
 

Mais de Ivan Ricarte

SI300 - Apoio a atividades práticas em C++ (01)
SI300 - Apoio a atividades práticas em C++ (01)SI300 - Apoio a atividades práticas em C++ (01)
SI300 - Apoio a atividades práticas em C++ (01)
Ivan Ricarte
 

Mais de Ivan Ricarte (20)

Aula catalogo de refatoracoes
Aula   catalogo de refatoracoesAula   catalogo de refatoracoes
Aula catalogo de refatoracoes
 
Testes de unidade em Java: JUnit
Testes de unidade em Java: JUnitTestes de unidade em Java: JUnit
Testes de unidade em Java: JUnit
 
Refatoração: Code smells
Refatoração: Code smellsRefatoração: Code smells
Refatoração: Code smells
 
Aplicacoes web semantica saude
Aplicacoes web semantica saudeAplicacoes web semantica saude
Aplicacoes web semantica saude
 
R - Software Estatistico
R - Software EstatisticoR - Software Estatistico
R - Software Estatistico
 
Aula UML e Java
Aula UML e JavaAula UML e Java
Aula UML e Java
 
Aula revisão de java e junit
Aula   revisão de java e junitAula   revisão de java e junit
Aula revisão de java e junit
 
Introducao a refatoracao
Introducao a refatoracaoIntroducao a refatoracao
Introducao a refatoracao
 
C++: biblioteca padrão de templates - Parte 1
C++: biblioteca padrão de templates - Parte 1C++: biblioteca padrão de templates - Parte 1
C++: biblioteca padrão de templates - Parte 1
 
c++ construtores
c++ construtoresc++ construtores
c++ construtores
 
Padroes
PadroesPadroes
Padroes
 
C++ Sobrecarga
C++ SobrecargaC++ Sobrecarga
C++ Sobrecarga
 
Membros de classes C++
Membros de classes C++Membros de classes C++
Membros de classes C++
 
UML e POO
UML e POOUML e POO
UML e POO
 
Antipadroes
AntipadroesAntipadroes
Antipadroes
 
Princípios da organização de código fonte C++
Princípios da organização de código fonte C++Princípios da organização de código fonte C++
Princípios da organização de código fonte C++
 
Problemas no desenvolvimento do software
Problemas no desenvolvimento do softwareProblemas no desenvolvimento do software
Problemas no desenvolvimento do software
 
Aula 01 - As linguagens do software (2015)
Aula 01 - As linguagens do software (2015)Aula 01 - As linguagens do software (2015)
Aula 01 - As linguagens do software (2015)
 
SI300 - Apoio a atividades práticas em C++ (01)
SI300 - Apoio a atividades práticas em C++ (01)SI300 - Apoio a atividades práticas em C++ (01)
SI300 - Apoio a atividades práticas em C++ (01)
 
O Projeto Evid@SP - Disseminação de evidências a profissionais da saúde
O Projeto Evid@SP - Disseminação de evidências a profissionais da saúdeO Projeto Evid@SP - Disseminação de evidências a profissionais da saúde
O Projeto Evid@SP - Disseminação de evidências a profissionais da saúde
 

Compiladores 1

  • 1. Compiladores na visão do usuário Ivan Ricarte 2008 I NTRODUÇÃO À COMPILAÇÃO
  • 2. Sumário Compiladores na programação A linguagem dos processadores Linguagens de alto nível Compiladores no processamento da informação Processamento de arquivos XML Páginas dinâmicas na Web Atividades de um compilador Leitura de arquivo de origem Escrita de arquivos de destino Interação com arquivos padrão Exemplos de compiladores Compilador C++ Exemplo de processamento XML Sugestões de leitura I NTRODUÇÃO À COMPILAÇÃO
  • 3. Para que compiladores? A programação antes dos compiladores add C,A,B C = A + B! Programador Computador X Load A Add B Programador Store C Computador Y SUM A,B,C Programador Computador Z I NTRODUÇÃO À COMPILAÇÃO
  • 4. Para que compiladores? A programação com os compiladores add C,A,B Tradutor C = A + B! X REAL A,B,C Tradutor Load A C=A+B Add B Y Store C Tradutor Programador Z SUM A,B,C genérico I NTRODUÇÃO À COMPILAÇÃO
  • 5. A linguagem dos processadores Cada processador tem seu próprio jogo de instruções Instruções refletem as características peculiares de cada processador — sua arquitetura Para cada instrução, duas representações Linguagem de máquina: seqüência de bits que codifica instrução no formato apropriado para a interpretação pelos circuitos Linguagem simbólica: representação mnemônica (textual) I NTRODUÇÃO À COMPILAÇÃO
  • 6. Exemplo Arquitetura de um processador hipotético A0−A3 R0 R1 R2 R3 D0−D7 memória processador I NTRODUÇÃO À COMPILAÇÃO
  • 7. Exemplo Instruções desse processador LOAD para transferir o conteúdo de uma posição de memória para um registrador. STORE para transferir o conteúdo de um registrador para uma posição de memória. ADD para adicionar o conteúdo de dois registradores e armazenar o resultado em outro registrador. BZERO para mudar o conteúdo do contador de programas para a posição de memória especificada se o conteúdo do registrador indicado for igual a zero. I NTRODUÇÃO À COMPILAÇÃO
  • 8. Exemplo Características do processador e impacto no formato da instrução de máquina Quatro instruções ⇒ Código de operação de dois bits: LOAD 00 STORE 01 ADD 10 BZERO 11 Quatro registradores de dados (além de outros não representados) ⇒ Endereços de registradores ocupam dois bits Capacidade de endereçar 16 posições de memória ⇒ endereços de memória ocupam quatro bits Palavras de oito bits ⇒ nenhum impacto I NTRODUÇÃO À COMPILAÇÃO
  • 9. Exemplo Um programa desse processador Linguagem simbólica Linguagem de LOAD 10, R1 máquina LOAD 11, R2 00101001 ADD R1, R2, R0 00101110 STORE R0, 12 10011000 01001100 I NTRODUÇÃO À COMPILAÇÃO
  • 10. Linguagens de alto nível Permitem expressar os comandos de forma independente do processador Comandos em linguagem mais próxima da humana Variações nas linguagens de acordo com seu objetivo FORTRAN Programação científica C, C++ Programação de sistemas Pascal Programação estruturada lisp Processamento simbólico I NTRODUÇÃO À COMPILAÇÃO
  • 11. Papel dos compiladores Compilador Programa que realiza a tradução de um programa em uma linguagem para um programa equivalente em outra linguagem Tipicamente: linguagem de alto nível → linguagem de máquina mas também: linguagem de alto nível → linguagem intermediária ou: linguagem intermediária → linguagem de máquina ou ainda: linguagem de script → linguagem de alto nível I NTRODUÇÃO À COMPILAÇÃO
  • 12. Compiladores no processamento da informação Compiladores traduzem descrições de uma linguagem para outra Mesmo tipo de processamento está presente em aplicações que processam arquivos com informações Processamento de arquivos XML Processamento de páginas dinâmicas para a Web I NTRODUÇÃO À COMPILAÇÃO
  • 13. Processamento de arquivos XML XML eXtensible Markup Language Aplicações em troca de informações entre processos distribuídos, em manutenção de arquivos de configuração e em representação de textos Arquivo organizado em elementos definidos por marcações e, eventualmente, conteúdos Existem regras básicas de formação para esses arquivos Esquemas podem restringir como esses elementos podem ser combinados I NTRODUÇÃO À COMPILAÇÃO
  • 14. Exemplo de arquivo XML <livro> <titulo>Dom Casmurro</titulo> <autor>Machado de Assis</autor> <ano>1900</ano> </livro> Como se compara o processamento desse arquivo à compilação de um programa em linguagem de alto nível? I NTRODUÇÃO À COMPILAÇÃO
  • 15. Páginas dinâmicas na Web Página dinâmica é criada no momento do atendimento a uma solicitação, a partir de uma descrição genérica que deve ser processada Tipicamente, descrição contém diretivas em uma linguagem de script que geram os conteúdos apresentados O resultado desse processamento é um arquivo com conteúdo em HTML (Hypertext Markup Language) I NTRODUÇÃO À COMPILAÇÃO
  • 16. Exemplo de especificação de página dinâmica <csp> <@ #include ... %> <% // código C ... %> <html> Conteúdo em HTML com <%= código C %> </html> </csp> Como se compara o processamento desse arquivo à compilação de um programa em linguagem de alto nível? I NTRODUÇÃO À COMPILAÇÃO
  • 17. Atividades de um compilador Arquivo de Arquivo de Análise Síntese origem destino Gramáticas Estruturas internas I NTRODUÇÃO À COMPILAÇÃO
  • 18. Análise Análise léxica Identificação dos elementos básicos da linguagem a partir dos caracteres individuais do arquivo fonte Análise sintática Reconhecimento, a partir dos elementos básicos, da estrutura de comandos básicos, de blocos de comandos, de funções, de programas I NTRODUÇÃO À COMPILAÇÃO
  • 19. Síntese Geração de código Produção do código equivalente ao programa original a partir da estrutura construída na análise sintática Otimização Reorganização do código gerado para eliminar redundâncias e melhorar desempenho I NTRODUÇÃO À COMPILAÇÃO
  • 20. Geração do código executável O compilador utiliza outros programas do sistema para produzir o código executável a partir do código em linguagem simbólica Montador Tradução do código em linguagem simbólica para o código de máquina Ligador Combinação de códigos de máquina de diferentes módulos num único módulo I NTRODUÇÃO À COMPILAÇÃO
  • 21. Necessidade de manipulação de arquivos Entrada e saída para o compilador são arquivos Entrada arquivo de texto com a especificação de alto nível (código-fonte) Saída arquivo binário com o código executável em linguagem de máquina (módulo objeto) Outros arquivos temporários podem ser utilizados em etapas intermediárias I NTRODUÇÃO À COMPILAÇÃO
  • 22. Arquivos em C++ As necessidades de um compilador relativas à interação com arquivos restringem-se ao acesso seqüencial Para tal fim, C++ trabalha com o conceito de streams Fontes ou destinos de dados acessados seqüencialmente Arquivos em disco podem ser manipulados como streams (fstream) ifstream para leitura seqüencial de arquivos ofstream para escrita seqüencial de arquivos I NTRODUÇÃO À COMPILAÇÃO
  • 23. Leitura de arquivos Inicialmente, é preciso associar o arquivo ao objeto (variável) que será a ele associado Com o construtor ifstream nomeVariavel(nomeArquivo); Com o método open ifstream nomeVariavel; ... nomeVariavel.open(nomeArquivo); I NTRODUÇÃO À COMPILAÇÃO
  • 24. Modo de abertura O modo padrão para abertura de um arquivo é considerar que seu conteúdo é texto Se conteúdo é binário, é preciso indicar esse fato na abertura do arquivo Especificar o flag ios::binary como segundo argumento do construtor ou do método open I NTRODUÇÃO À COMPILAÇÃO
  • 25. Leitura do conteúdo do arquivo Modo texto Para a leitura de caracteres de um arquivo texto (ifstream) Operador >> lê conteúdo com interpretação de formato, ignorando espaços em branco Método get lê cada caráter do arquivo sem interpretação, retornando o valor inteiro do código ASCII correspondente Método getline lê um bloco (uma linha) de caracteres para um arranjo de caracteres especificado pelo programador I NTRODUÇÃO À COMPILAÇÃO
  • 26. Leitura do conteúdo do arquivo Modo binário Para leitura de seqüências de bits de um arquivo Método read lê um bloco de bytes para um arranjo especificado pelo programador eof Qualquer que seja o tipo de conteúdo do arquivo, o método eof retorna true quando o final do arquivo é alcançado I NTRODUÇÃO À COMPILAÇÃO
  • 27. Escrita de arquivos de destino Também é preciso associar o arquivo a um objeto Com o construtor ofstream nomeVariavel(nomeArquivo); Com o método open ofstream nomeVariavel; ... nomeVariavel.open(nomeArquivo); I NTRODUÇÃO À COMPILAÇÃO
  • 28. Escrita do conteúdo em disco Para ofstream, outros especificadores além de ios::binary podem ser indicados na abertura do arquivo Caso arquivo já exista ios::app agrega novo conteúdo ao conteúdo já existente ios::trunc substitui conteúdo existente pelo novo conteúdo I NTRODUÇÃO À COMPILAÇÃO
  • 29. Escrita do conteúdo em disco Operações para realizar a escrita no arquivo: Operador << formata (transforma valores de variáveis em caracteres) Método put escreve um caráter, sem interpretação Método write escreve um bloco de dados, sem interpretação Método flush descarrega o buffer interno de dados para o arquivo I NTRODUÇÃO À COMPILAÇÃO
  • 30. Interação com arquivos padrão Todo programa ao executar inicia com três streams associados cin arquivo padrão para entrada de caracteres (ifstream) cout arquivo padrão para saída de caracteres (ofstream) cerr arquivo padrão para saída de mensagens de erro (ofstream) Para usá-los: #include <iostream> using namespace std; I NTRODUÇÃO À COMPILAÇÃO
  • 31. Exemplo de compilador C++: gcc/g++ Compilador C/C++ do Projeto Gnu, para ambientes do tipo unix Invocado sem outros argumentos a não ser o nome do arquivo, realiza quatro tarefas 1. Pré-processamento (invoca programa cpp) 2. Compilação 3. Montagem (invoca programa as) 4. Ligação (invoca programa ld) Resultado final é a criação de um arquivo executável no disco (a.out) Nome padrão pode ser alterado com a chave -o I NTRODUÇÃO À COMPILAÇÃO
  • 32. Processamento parcial Processamento pode ser interrompido após cada uma das etapas intermediárias por meio do uso de outras chaves para o programa 1. Após pré-processamento: chave -E Resultado é direcionado para a saída padrão 2. Após compilação propriamente dita: chave -S Resultado (arquivo texto, assembly) é criado num arquivo em disco com mesmo nome do arquivo de entrada mas com extensão .s 3. Após montagem: chave -c Resultado é criado num arquivo binário (código objeto) em disco com extensão .o I NTRODUÇÃO À COMPILAÇÃO
  • 33. Indicação de erros de compilação Considere a compilação do seguinte programa (hello.cpp): #include <iostream> using namespace std; int main() { cout << "Oi, gente!" << endl; } I NTRODUÇÃO À COMPILAÇÃO
  • 34. Indicação de erros de compilação Omissão de ; na quarta linha: hello.cpp: In function ‘int main()’: hello.cpp:5: parse error before ‘}’ token Por que o compilador gerou essa mensagem? I NTRODUÇÃO À COMPILAÇÃO
  • 35. Indicação de erros de compilação Omissão de " de abertura na quarta linha: hello.cpp: In function ‘int main()’: hello.cpp:4: ‘Oi’ undeclared (first use this function) hello.cpp:4: (Each undeclared identifier is reported only once for each function it appears in.) hello.cpp:4: ‘gente’ undeclared (first use this function) hello.cpp:4: parse error before ‘!’ token hello.cpp:4:21: warning: multi-line string literals are deprecated hello.cpp:4:21: missing terminating " character hello.cpp:4:21: possible start of unterminated string literal Por que o compilador gerou essas mensagens? I NTRODUÇÃO À COMPILAÇÃO
  • 36. Exemplo de processamento XML Analisador Xerces-C Suíte de aplicativos para processamento de arquivos com conteúdo em XML Exemplo SAXCount se arquivo estiver correto, indica quantos elementos XML foram reconhecidos I NTRODUÇÃO À COMPILAÇÃO
  • 37. Exemplo Arquivo livros.xml: <livros> <livro> <título>Dom Casmurro</título> <autor>Machado de Assis</autor> <ano>1900</ano> </livro> <livro> <título>As Intermitências da Morte</título> <autor>José Saramago</autor> <ano>2005</ano> </livro> </livros> Resultado: livros.xml: 1 ms (9 elems, 0 attrs, 0 spaces, 118 chars) I NTRODUÇÃO À COMPILAÇÃO
  • 38. Indicação de erros Troca de primeiro livro por lirvo: Fatal Error at file livros.xml, line 6, char 5 Message: Expected end of tag ’lirvo’ I NTRODUÇÃO À COMPILAÇÃO
  • 39. Indicação de erros Omissão da primeira marcação /livro: Fatal Error at file livros.xml, line 11, char 8 Message: Unterminated end tag, ’livro’ I NTRODUÇÃO À COMPILAÇÃO
  • 40. Indicação de erros Omissão da marcação /livros: Fatal Error at file livros.xml, line 13, char 1 Message: The input ended before all started tags were ended. Last tag started was ’livros’ I NTRODUÇÃO À COMPILAÇÃO
  • 41. Sugestões de leitura (Web) C++ Referência http://www.cppreference.com/ Compilador http://gcc.gnu.org/ XML Referência http://www.w3.org/XML/ Analisador http: //xerces.apache.org/xerces-c/ I NTRODUÇÃO À COMPILAÇÃO