A876 - 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. algoritmos estruturas de dados decomposição funcional... Software de Sistema programas executáveis arquivos & diretórios chamadas de sistema... Hardware instruções registradores endereçamento interrupções... 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. 1
COMPILADORS 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. xemplos de compiladores (F1 F2) C++ Assembly x86 SDL Java C JVM bytecode NesC Assembly ARM Se o compilador é um programa, como ele é compilado? 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). xemplo: Compiladores de linguagens de programação. Tradutor: altera um texto para outro mais apropriado para manipulação em um determinado contexto. xemplos: 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.). xemplos: MATLAB, C Shell. Compiladores, tradutores e interpretadores utilizam as mesmas técnicas de compilação. 2
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. xemplo: Flex, Bison. APIs (Application Programming Interfaces). xemplo: Java string tokenizer, Java scaner, Java regex. Pré-processadores. xemplo: cpp. Toolkits. xemplo: Cocktail, li. Importante: Técnicas de compilação não são utilizadas apenas na construção de compiladores de linguagens de programação. O ngenheiro 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!!!). Uso de Compiladores Via IDs (Integrated Development nvironment): 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 3
Aplicações de Técnicas de Compilação Análise e mineração de dados. xemplos: detecção de padrões e eventos em logs, filtragem de informação. Construção de ferramentas de software in-house. xemplo: BeanBuilder. Construção de linguagens específicas: xemplos: CSP (C Server Pages), XMLIpthru. xtensões de linguages para hardware dedicado. xemplo: Cuda. Automação de processos de software: xemplo: tradução de modelos em processos MDA (Model Driven Architectures). 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. stes formalismos são denominados gramáticas. xemplo: 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). stabelecimento de algoritmos e heurísticas para a análise e síntese. xemplo: algoritmo de deslocamento e redução. struturas de dados para armazenas as transformações do texto de entrada. xemplos: árvores, pilhas, tabelas. Interação de outros software básicos. xemplos: montador, ligador. 4
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. sta fase é realizada pelo Front-nd do compilador. Síntese: Tranforma a representação intermediária em uma notação apropriada para gerar o texto alvo (código intermediário). ste código intermediário é traduzido em código de montagem (assembly). sta fase é realizada pelo Back-nd 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. xemplo Texto de origem: int x, y, z, w; w = (x + y) * z; Gramática: id id = + - * / - ( ) w = ( ) x + * y Árvore sintática 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: MOV.L x, D0 ADDI.L y, D0... 5