Compiladores INTRODUÇÃO www.pedrofreire.com Este documento tem alguns direitos reservados: Atribuição-Uso Não-Comercial-Não a Obras Derivadas 2.5 Portugal http://creativecommons.org/licenses/by-nc-nd/2.5/pt/ Isto significa que podes usá-lo para fins de estudo. Para outras utilizações, leia a licença completa. Crédito ao autor deve incluir o nome (“Pedro Freire”) e referência a www.pedrofreire.com. www.pedrofreire.com 2 INTRODUÇÃO www.pedrofreire.com 3 C / C++ Java C# PHP Perl O que são Um compilador prepara um ficheiro de texto com código-fonte para execução. O resultado final pode ser outro ficheiro, preparado para execução direta pelo processador (código máquina) ou preparado para execução por uma máquina virtual dedicada (byte code ou CIL), ou uma representação em memória para interpretação. Compilador Código máquina Byte code CIL Representação em memória www.pedrofreire.com 4 Exemplos de uso • Compiladores – C / C++ / Objective C – Pascal • Intérpretes/Interpretadores – – – – – JavaScript PHP XML / HTML / CSS Rich Text Format (RTF) Postscript • Tradutores de linguagens Java é um exemplo de uma linguagem com um compilador que não gera código executável. Gera “Java Byte Codes” que são depois interpretados por outra aplicação. – Java – C# • Extractores de informação textual www.pedrofreire.com 5 Analisador léxico Tokens Etapas de compilação. Analisador sintático Árvore sintática Analisador semântico Árvore sintática Gerador de código intermédio Representação intermédia Optimizador de código intermédio Representação intermédia Gerador de código Código máquina Optimizador de código Código máquina www.pedrofreire.com 6 Pré-processador Etapas Tokens Analisador sintático Árvore sintática de compilação. O pré-processador transforma um ou mais ficheiros de código-fonte noutro ficheiro de código-fonte. É usado em linguagens como C para implementar #include, #define e outras diretivas semelhantes. Analisador léxico Compilador Analisador semântico Árvore sintática Gerador de código intermédio Representação intermédia O linker liga um ou mais ficheiros de código máquina (ficheiros objecto, um por cada ficheiro de código-fonte) num último ficheiro executável pronto para execução. Optimizador de código intermédio Representação intermédia Gerador de código Código máquina Assembler Optimizador de código Linker www.pedrofreire.com Código máquina 7 Analisador léxico Tokens Etapas: Analisador léxico Analisador sintático Árvore sintática Também conhecido como scanner. Lê a sequência de caracteres do ficheiro fonte original e agrupa-os em sequências significativas chamadas lexemas. Analisador semântico Árvore sintática Gerador de código intermédio Constrói tokens para cada lexema que são um par com o nome do token e um atributo que o ajuda a especificar. Representação intermédia Optimizador de código intermédio Representação intermédia Gerador de código Código máquina Optimizador de código Código máquina www.pedrofreire.com 8 Analisador léxico Tokens Etapas: Analisador sintático Analisador sintático Árvore sintática Também conhecido como parser. Lê a sequência de tokens produzida pela etapa anterior e produz uma árvore que representa a sua estrutura gramatical. Analisador semântico Árvore sintática Gerador de código intermédio Representação intermédia Optimizador de código intermédio Representação intermédia Gerador de código Código máquina Optimizador de código Código máquina www.pedrofreire.com 9 Analisador léxico Tokens Etapas: Analisador semântico Analisador sintático Árvore sintática Lê a árvore gerada pela etapa anterior e verifica-a para consistência semântica de acordo com a definição da linguagem (e.g.: verificação de consistência e conversão de tipos de dados). Analisador semântico Árvore sintática Gerador de código intermédio Representação intermédia Optimizador de código intermédio Representação intermédia Gerador de código Código máquina Optimizador de código Código máquina www.pedrofreire.com 10 Analisador léxico Tokens Etapas: Gerador de código intermédio Analisador sintático Árvore sintática Lê a árvore gerada pela etapa anterior e transforma-a numa sequência de instruções de uma máquina hipotética. Analisador semântico Árvore sintática Esta máquina hipotética permite que as etapas seguintes sejam as mesmas para todas as versões do compilador para qualquer tipo de plataforma. Gerador de código intermédio Representação intermédia Optimizador de código intermédio Representação intermédia Gerador de código Código máquina Optimizador de código Código máquina www.pedrofreire.com 11 Analisador léxico Tokens Etapas: Optimizador de código intermédio Analisador sintático Árvore sintática Lê a sequência de instruções gerada pela etapa anterior e optimiza-a de acordo com algum objectivo (código mais rápido ou mais pequeno). Analisador semântico Árvore sintática Algumas das optimizações triviais executadas nesta fase são a remoção de variáveis temporárias desnecessárias geradas pela etapa anterior e cálculo antecipado de expressões e outras operações constantes. Gerador de código intermédio Representação intermédia Optimizador de código intermédio Representação intermédia Gerador de código Código máquina Optimizador de código Código máquina www.pedrofreire.com 12 Analisador léxico Tokens Etapas: Gerador de código Analisador sintático Árvore sintática Lê a sequência de instruções gerada pela etapa anterior e transforma-a numa sequência de instruções da plataforma destino desejada. Analisador semântico Árvore sintática Gerador de código intermédio Representação intermédia Optimizador de código intermédio Representação intermédia Gerador de código Código máquina Optimizador de código Código máquina www.pedrofreire.com 13 Analisador léxico Tokens Etapas: Optimizador de código Analisador sintático Árvore sintática Lê a sequência de instruções gerada pela etapa anterior e optimiza-a de acordo com algum objectivo (código mais rápido ou mais pequeno). Analisador semântico Árvore sintática Algumas das optimizações triviais executadas nesta fase são a optimização do uso de registos do processador e a reordenação de instruções para aproveitar oportunidades de paralelização (e.g.: pipelining). Gerador de código intermédio Representação intermédia Optimizador de código intermédio Representação intermédia Gerador de código Código máquina Optimizador de código Código máquina www.pedrofreire.com 14 lex / flex Ferramentas de geração de compiladores. yacc / bison O lex (ou a sua versão opensource, flex) gera scanners. Analisador léxico Tokens Analisador sintático Árvore sintática Analisador semântico Árvore sintática O yacc (ou a sua versão opensource, bison) gera parsers. Gerador de código intermédio Representação intermédia São ferramentas com décadas de uso, mas hoje em dia temos outras que nos geram em simultâneo um scanner e um parser (e.g.: ANTLR). Optimizador de código intermédio Representação intermédia Gerador de código Código máquina Optimizador de código Código máquina www.pedrofreire.com 15 Hiperligações úteis BIBLIOGRAFIA www.pedrofreire.com 16 • Compilers: Principles, Techniques and Tools – 2nd edition (2ª edição) – Alfred Aho, Monica Lam, Ravi Sethi, Jeffrey Ullman – Addison Wesley – http://dragonbook.stanford.edu • Compiler Construction Toolkit – http://hackingoff.com/compilers/ • GNU Flex – http://www.gnu.org/software/flex/ • GNU Bison – http://www.gnu.org/software/bison/ • ANTLR – http://www.antlr.org www.pedrofreire.com 17