Baixe o app para aproveitar ainda mais
Prévia do material em texto
22/02/2011 1 EA876 - Prof. Eleri Cardozo - FEEC/Unicamp EA876 - Introdução a Software de Sistema Software de Sistema: conjunto de programas utilizados para tornar o hardware transparente para o desenvolvedor ou usuário. Preenche um “gap de abstração”. Hardware Software de Sistema instruções registradores endereçamento interrupções .... programas executáveis arquivos & diretórios chamadas de sistema .... algoritmos estruturas de dados decomposição funcional ... EA876 - Prof. Eleri Cardozo - FEEC/Unicamp Principais Softwares de Sistema: Compilador: traduz uma notação em alto nível em outra comumente de mais baixo nível (exemplo: C � Assembly). Sistema operacional: controla os recursos de hardware fornecendo uma interface de alto nível para manipulá-los. É o mais complexo software de sistema. Montador: traduz um programa em linguagem simbólica para linguagem de máquina. Ligador: combina vários módulos em linguagem de máquina em um único módulo executável. Carregador: transfere e adapta um programa armazenado em memória secundária para execução em memória primária. 22/02/2011 2 EA876 - Prof. Eleri Cardozo - FEEC/Unicamp COMPILADORES Definição abstrata: um compilador é um programa que traduz um texto T1 descrito em um formalismo F1 em um texto T2 descrito em um formalismo F2, mantendo o mesmo significado semântico entre T1 e T2. P: Por que T1 e T2 devem ser descritos por formalismos? R: Para que o compilador possa utilizar no processo de tradução um procedimento algoritmico e computacionalmente viável. Exemplos de compiladores (F1 � F2) � C++ � Assembly x86 � SDL � C � Java � JVM bytecode � NesC � Assembly ARM Se o compilador é um programa, como ele é compilado? EA876 - Prof. Eleri Cardozo - FEEC/Unicamp Compilador X Tradutor X Interpretador Compilador: gera um texto a partir de outro, usualmente em nível mais baixo de abstração (diferença de níveis de abstração). Exemplo: Compiladores de linguagens de programação. Tradutor: altera um texto para outro mais apropriado para manipulação em um determinado contexto. Exemplos: JAXB (XML � Java), Tradutor Fortran � C Interpretador: processa cada fragmento de um texto (linha, comando, etc.) e produz um resultado imediato (impressão, armazenamento, etc.). Exemplos: MATLAB, C Shell. Compiladores, tradutores e interpretadores utilizam as mesmas técnicas de compilação. 22/02/2011 3 EA876 - Prof. Eleri Cardozo - FEEC/Unicamp Construção de Compiladores Raramente se constrói um compilador “do zero”, mas a partir de ferramentas tais como: � Analisadores léxicos e sintáticos. Exemplo: Flex, Bison. � APIs (Application Programming Interfaces). Exemplo: Java string tokenizer, Java scaner, Java regex. � Pré-processadores. Exemplo: cpp. � Toolkits. Exemplo: Cocktail, Eli. Importante: Técnicas de compilação não são utilizadas apenas na construção de compiladores de linguagens de programação. O Engenheiro de Computação deve entender estas técnicas para o desenvolvimento de código a partir de especificações (isto impacta no custo e na qualidade do software !!!). EA876 - Prof. Eleri Cardozo - FEEC/Unicamp Uso de Compiladores Via IDEs (Integrated Development Environment): o compilador está integrado com outras ferramentas: editores, depuradores, ferramentas de teste, analisadores estáticos, etc. O usuário tem pouco controle sobre o processo de compilação. Via linha de comando: o usuário tem pleno controle sobre o processo de compilação, por exemplo, fornecendo opções de otimização de código, linguagens de origem e alvo, arquitetura alvo, etc. (man gcc). Compilação cruzada (cross compiling): o compilador irá gerar código para outra arquitetura (ARM, M68xx, etc.) diferente daquela que o compilador executa. Um toolchain é um conjunto de ferramentas para cross compiling composto de: � compilador (usualmente gcc) � montador para a arquitetura alvo � ligador para a arquitetura alvo � biblioticas de runtime para a arquitetura alvo 22/02/2011 4 EA876 - Prof. Eleri Cardozo - FEEC/Unicamp Aplicações de Técnicas de Compilação � Análise e mineração de dados. Exemplos: detecção de padrões e eventos em logs, filtragem de informação. � Construção de ferramentas de software “in-house”. Exemplo: BeanBuilder. � Construção de linguagens específicas: Exemplos: CSP (C Server Pages), XMLIpthru. � Extensões de linguages para hardware dedicado. Exemplo: Cuda. � Automação de processos de software: Exemplo: tradução de modelos em processos MDA (Model Driven Architectures). EA876 - Prof. Eleri Cardozo - FEEC/Unicamp O Processo de Compilação A tradução de um texto de entrada em outro de saída requer: � Formalismos para especificar os textos de entrada e saída. Estes formalismos são denominados gramáticas. Exemplo: gramática de especifica a linguagem C, gramática que especifica a estrutura de documentos XML, gramática do assembly do x86. � Subdivisão em atividades sequenciais: análise (lexica, sintática, semântica) e síntese (otimização e geração de código). � Estabelecimento de algoritmos e heurísticas para a análise e síntese. Exemplo: algoritmo de deslocamento e redução. � Estruturas de dados para armazenas as transformações do texto de entrada. Exemplos: árvores, pilhas, tabelas. � Interação de outros software básicos. Exemplos: montador, ligador. 22/02/2011 5 EA876 - Prof. Eleri Cardozo - FEEC/Unicamp Fases do Processo de Compilação � Análise: Verifica se o texto de entrada está em conformidade com a linguagem de origem. Se estiver, gera uma representação intermediária apropriada para a síntese. Esta fase é realizada pelo Front-End do compilador. � Síntese: Tranforma a representação intermediária em uma notação apropriada para gerar o texto alvo (código intermediário). Este código intermediário é traduzido em código de montagem (assembly). Esta fase é realizada pelo Back-End do compilador. Passo adicional na análise: � Pré-processamento: substituição de diretivas tipo #include, #define, etc. Passos adicionais na síntese: � Otimização de código: redução do número de instruções, redução da memória requerida, uso de co-processadores. � Inserção de informação para depuração. EA876 - Prof. Eleri Cardozo - FEEC/Unicamp Exemplo Texto de origem: int x, y, z, w; w = (x + y) * z; Gramática: E � id E � id = E E � E + E E � E - E E � E * E E � E / E E � - E E � ( E ) E E= E E* E ( E ) E E+ E x y w z Código intermediário: temp1 := x + y temp2 := temp1 * z w := temp2 Código otimizado: temp1 := x + y; w := temp1 * z Código de montagem: MOVE.L x, D0 ADDI.L y, D0 ... Árvore sintática
Compartilhar