Sumário VII. Prefácio

Tamanho: px
Começar a partir da página:

Download "Sumário VII. Prefácio"

Transcrição

1 Sumário Prefácio XI 1 INTRODUÇÃO Por que compiladores? Um breve histórico Programas relacionados a compiladores O processo de tradução Principais estruturas de dados em um compilador Outros aspectos da estrutura de um compilador Partida rápida e transposição A linguagem TINY e seu compilador C : uma linguagem para um projeto de compilador 26 Exercícios 27 Notas e referências 29 2 VARREDURA O processo de varredura Expressões regulares Autômatos finitos Das expressões regulares para os autômatos finitos determinísticos Implementação de um sistema de varredura TINY Uso de Lex para gerar automaticamente um sistema de varredura 81 Exercícios 90 Exercícios de programação 93 Notas e referências 94 3 GRAMÁTICAS LIVRES DE CONTEXTO E ANÁLISE SINTÁTICA O processo de análise sintática Gramáticas livres de contexto Árvores de análise sintática e árvores sintáticas abstratas Ambigüidade Notações estendidas: EBNF e diagramas sintáticos Propriedades formais de linguagens livres de contexto Sintaxe da linguagem TINY 133 Exercícios 138 Notas e referências ANÁLISE SINTÁTICA DESCENDENTE Análise sintática descendente recursiva Análise sintática LL(1) 152 VII

2 VIII COMPILADORES: PRINCÍPIOS E PRÁTICAS 4.3 Conjuntos primeiros e de seqüência Um analisador sintático para a linguagem TINY Recuperação de erros em analisadores sintáticos descendentes 183 Exercícios 190 Exercícios de programação 194 Notas e referências ANÁLISE SINTÁTICA ASCENDENTE Visão geral da análise sintática ascendente Autômatos finitos dos itens LR(0) e análise sintática LR(0) Análise sintática SLR(1) Análise sintática geral LR(1) e LALR(1) Yacc: um gerador de analisadores sintáticos LALR(1) Geração de um analisador sintático TINY usando o Yacc Recuperação de erros em analisadores sintáticos ascendentes 247 Exercícios 252 Exercícios de programação 256 Notas e referências ANÁLISE SEMÂNTICA Atributos e gramáticas de atributos Algoritmos para computação de atributos A tabela de símbolos Tipos de dados e verificação de tipos Analisador semântico para a linguagem TINY 337 Exercícios 342 Exercícios de programação 345 Notas e referências AMBIENTES DE EXECUÇÃO Organização de memória durante a execução de programas Ambientes de execução totalmente estáticos Ambientes de execução baseados em pilhas Memória dinâmica Mecanismos para passagem de parâmetros Ambiente de execução para a linguagem TINY 390 Exercícios 392 Exercícios de programação 399 Notas e referências GERAÇÃO DE CÓDIGO Código intermediário e estruturas de dados para geração de código Técnicas básicas para geração de código Geração de código para referências a estruturas de dados Geração de código para declarações de controle e expressões lógicas Geração de código para chamadas de procedimentos e funções Geração de código em compiladores comerciais: dois estudos de casos TM: uma máquina-alvo simples 454

3 SUMÁRIO IX 8.8 Gerador de código para a linguagem TINY Revisão das técnicas de otimização de código Otimizações simples para o gerador de código TINY 482 Exercícios 485 Exercícios de programação 489 Notas e referências 490 APÊNDICE A PROJETO DE COMPILADOR 493 A.1 Convenções léxicas de C 493 A.2 Sintaxe e semântica de C 494 A.3 Programas de exemplo em C 497 A.4 Ambiente de execução TINY para a linguagem C 499 A.5 Projetos de programação utilizando C e TM 502 APÊNDICE B LISTAGEM DO COMPILADOR TINY 503 APÊNDICE C LISTAGEM DO SIMULADOR DE MÁQUINA TINY 535 BIBLIOGRAFIA 545 ÍNDICE 549

4 Prefácio Este livro é uma introdução ao campo de construção de compiladores. Ele combina um estudo detalhado da teoria subjacente à abordagem moderna de projeto de compiladores, acompanhado de diversos exemplos práticos e uma descrição completa, com código-fonte, de um compilador para uma pequena linguagem. Ele é projetado especificamente para uso em um curso introdutório sobre projeto de compiladores ou sobre construção de compiladores para alunos em final de graduação. Ele pode também ser útil para profissionais que estejam participando de um projeto de compilador, já que tem por objetivo proporcionar ao leitor as ferramentas necessárias e a experiência prática para projetar e programar efetivamente um compilador. Já existem muitos textos para esse campo. Por que escrever mais um? Porque virtualmente todos os textos existentes se restringem ao estudo de somente um dos dois aspectos importantes da construção de compiladores. A primeira variedade de textos se concentra no estudo da teoria e dos princípios do projeto de compiladores, com apenas breves exemplos de aplicação da teoria. A segunda variedade de textos se concentra no objetivo prático de produzir um compilador, seja para uma linguagem de programação real ou para uma versão simplificada de alguma linguagem, com apenas breves incursões na teoria subjacente ao código para explicar sua origem e comportamento. Considero essas duas abordagens insuficientes. Para compreender realmente os aspectos práticos do projeto de compiladores, é preciso entender a teoria; para apreciar realmente a teoria, é preciso vê-la em ação em condições reais ou bem próximas de reais. Este texto se propõe a promover o equilíbrio entre teoria e prática, e a fornecer detalhes de implementação suficientes para que se sinta um sabor real das técnicas, sem entretanto sobrecarregar o leitor. Nele, apresento um compilador completo para uma pequena linguagem, escrito em C e desenvolvido utilizando as diferentes técnicas estudadas em cada capítulo. Adicionalmente, descrições detalhadas das técnicas de codificação para exemplos adicionais de linguagens são fornecidas à medida que os tópicos associados são estudados. Finalmente, cada capítulo termina com um amplo conjunto de exercícios, divididos em duas seções. A primeira contém exercícios para solução com lápis e papel e que envolvem pouca programação. A segunda contém exercícios que requerem programação. Ao escrever um texto assim, é preciso levar em conta as diferentes posições que um curso de compiladores ocupa em diferentes currículos de ciência da computação. Em alguns programas, um curso sobre teoria de autômatos é pré-requisito; em outros, um curso sobre linguagens de programação é um pré-requisito; em outros, ainda, não existem pré-requisitos (além de estruturas de dados). Este texto não assume pré-requisitos além do curso usual de estruturas de dados e familiaridade com a linguagem C. Ele está organizado, entretanto, para que um pré-requisito como um curso de teoria de autômatos possa ser levado em conta. Ele deveria portanto ser útil para uma ampla variedade de programas. Um último problema para escrever um texto sobre compiladores é que os professores usam muitas abordagens diferentes de aula para a aplicação prática da teoria. Alguns preferem XI

5 XII COMPILADORES: PRINCÍPIOS E PRÁTICAS estudar as técnicas usando apenas uma série de exemplos pequenos e independentes, cada um direcionado a um conceito específico. Outros apresentam um grande projeto de compilador, que se torna factível com o uso de ferramentas como Lex e Yacc. Outros, ainda, pedem que os estudantes escrevam todo o código manualmente (utilizando, por exemplo, análise sintática recursiva descendente), mas aliviam a tarefa fornecendo as estruturas de dados básicas e algum código de exemplo. Este livro deve ser útil para todos esses cenários. Visão geral e organização Na maioria dos casos, cada capítulo é independente dos demais, sem restringir artificialmente o material em cada um. Referências cruzadas no texto permitem ao leitor ou ao professor completar eventuais lacunas, mesmo se algum capítulo ou seção não tiver sido coberto. O Capítulo 1 é uma visão geral da estrutura básica de um compilador e das técnicas estudadas nos capítulos seguintes. Ele também inclui uma seção sobre transposição e partida rápida. O Capítulo 2 estuda a teoria de autômatos finitos e expressões regulares, e, em seguida, aplica essa teoria na construção de um sistema de varredura codificado manualmente e utilizando a ferramenta de geração de sistemas de varredura Lex. O Capítulo 3 trata da teoria de gramáticas livres de contexto no que se refere à análise sintática, com ênfase especial à resolução de ambigüidade. Ele dá uma descrição detalhada de três notações comuns para essas gramáticas, que são BNF, EBNF e diagramas sintáticos. Ele também discute a hierarquia de Chomsky e os limites de poder das gramáticas livres de contexto, e menciona alguns dos resultados teóricos importantes relacionados a essas gramáticas. Uma gramática para a linguagem de exemplo usada neste texto também é fornecida. O Capítulo 4 estuda os algoritmos de análise sintática descendente, em particular os métodos de análise sintática recursiva descendente e LL(1). Um analisador sintático recursivo descendente para a linguagem de exemplo também é apresentado. O Capítulo 5 dá continuidade ao estudo dos algoritmos para análise sintática, com a análise sintática ascendente, culminando nas tabelas de análise sintática LALR(1) e no uso da ferramenta de geração de analisadores sintáticos Yacc. Uma especificação Yacc para a linguagem de exemplo é apresentada. O Capítulo 6 é uma revisão ampla da análise semântica estática, com foco em gramáticas de atributos e percursos em árvores sintáticas. Ele cobre extensivamente a construção de tabelas de símbolos e a verificação estática de tipos, os dois exemplos fundamentais da análise semântica. Uma implementação baseada em tabelas de hashing para uma tabela de símbolos também é dada e usada para implementar um analisador semântico para a linguagem de exemplo. O Capítulo 7 aborda as diferentes formas de ambientes de execução, desde o ambiente totalmente estático da linguagem Fortran até os ambientes totalmente dinâmicos das linguagens baseadas em Lisp, passando pelas variedades de ambientes baseados em pilhas. Ele fornece também uma implementação para heap de armazenamento alocado dinamicamente. O Capítulo 8 discute a geração de código tanto para código intermediário, como código de três endereços e P-código, quanto para código objeto executável para uma arquitetura de von Neumann simples, para a qual é fornecido um simulador. É fornecido um

6 Capítulo 1 Introdução 1.1 Por que compiladores? Um breve histórico 1.2 Programas relacionados a compiladores 1.3 O processo de tradução 1.4 Principais estruturas de dados em um compilador 1.5 Outros aspectos da estrutura de um compilador 1.6 Partida rápida e transposição 1.7 A linguagem TINY e seu compilador 1.8 C : uma linguagem para um projeto de compilador Compiladores são programas de computador que traduzem de uma linguagem para outra. Um compilador recebe como entrada um programa escrito na linguagem-fonte e produz um programa equivalente na linguagem-alvo. Geralmente, a linguagem-fonte é uma linguagem de alto nível, como C ou C++, e a linguagem-alvo é um código-objeto (algumas vezes também chamado de código de máquina) para a máquina-alvo, ou seja, um código escrito usando as instruções de máquina do computador no qual ele será executado. Podemos ver esse processo esquematicamente assim: Programa- Fonte Compilador Programa- Alvo Um compilador é um programa bastante complexo, que pode ter de a de linhas de código. Escrever um programa desses, ou mesmo entendê-lo, não é tarefa simples, e a maioria dos cientistas e profissionais de computação jamais escreverão um compilador completo. Compiladores, entretanto, são usados em quase todas as formas de computação, e qualquer pessoa envolvida profissionalmente com computadores deveria conhecer a organização e as operações básicas de um compilador. Além disso, uma tarefa freqüente em aplicações de computador é o desenvolvimento de interpretadores de comandos e programas de interface, menores que os compiladores, mas que utilizam as mesmas técnicas. Conhecer essas técnicas tem, portanto, uso prático significativo. Este texto tem por objetivo não apenas proporcionar esse conhecimento básico, mas também dar ao leitor todas as ferramentas necessárias e a experiência prática para projetar e programar um compilador. Para isso, é necessário estudar as técnicas teóricas, principalmente da teoria de autômatos, que tornam a construção de compiladores uma tarefa factível. Ao apresentar essa teoria, não assumimos que o leitor tenha conhecimento prévio da teoria de autômatos. O ponto de vista adotado aqui é diferente daquele de um texto padrão sobre teoria de autômatos, pois tem por objetivo específico o processo de compilação. Um leitor que tenha estudado teoria 1

7 2 COMPILADORES: PRINCÍPIOS E PRÁTICAS de autômatos terá maior familiaridade com esse material teórico e poderá prosseguir mais rapidamente por essas seções. Em particular, as seções 2.2, 2.3, 2.4 e 3.2 podem ser ignoradas ou lidas superficialmente por quem tenha conhecimento prévio sobre a teoria de autômatos. Em qualquer caso, o leitor deve ter familiaridade com estruturas básicas de dados e matemática discreta. Algum conhecimento de arquitetura de máquinas e linguagens de montagem também é essencial, particularmente para o capítulo sobre geração de código. O estudo das técnicas práticas de codificação requer planejamento cuidadoso, pois, mesmo com boa fundamentação teórica, os detalhes de código podem ser complexos e desafiadores. Este texto contém uma série de exemplos simples de construções em linguagens de programação, usados na elaboração da discussão das técnicas. A linguagem que usamos para essa discussão se chama TINY. Fornecemos também (no Apêndice A) um exemplo mais completo, composto por um pequeno mas suficientemente complexo subconjunto da linguagem C, que denominamos C, o qual é também apropriado para um projeto de curso. Há também diversos exercícios, incluindo exercícios simples para resolver com lápis e papel, extensões do código no texto e exercícios que envolvem mais programação. De maneira geral, existe interação significativa entre a estrutura de um compilador e o projeto da linguagem de programação a ser compilada. Neste texto, vamos tratar de questões de projeto de linguagens apenas em alguns pontos. Existem outros textos que se concentram mais diretamente em conceitos de linguagem de programação e questões de projeto. (Ver a seção de notas e referências no final deste capítulo.) Iniciamos com uma breve revisão do histórico e dos motivos de existência dos compiladores, juntamente com uma descrição de programas relacionados a compiladores. Examinamos, em seguida, a estrutura de um compilador e os diversos processos de tradução e estruturas de dados associadas, para a seguir percorrer essa estrutura usando um exemplo concreto simples. Finalmente, apresentamos uma visão geral de outros aspectos da estrutura do compilador, incluindo partida rápida e transportabilidade, concluindo com uma descrição dos principais exemplos de linguagem usados no restante do livro. 1.1 POR QUE COMPILADORES? UM BREVE HISTÓRICO Com o advento do computador de programa armazenado de John von Neumann no final da década de 1940, tornou-se necessário escrever seqüências de código, ou programas, para que esses computadores efetuassem as computações desejadas. Inicialmente, esses programas foram escritos em linguagem de máquina código numérico representando as operações de máquina a serem efetivamente executadas. Por exemplo, C representa a instrução para mover o número 2 do endereço 0000 (hexadecimal) em processadores Intel 8x86 utilizados em computadores IBM PC. Evidentemente, escrever códigos como esse consome muito tempo e é entediante. Assim, essa forma de codificação foi rapidamente substituída pela linguagem de montagem, em que instruções e endereços de memória adotam uma forma simbólica. Por exemplo, a instrução em linguagem de montagem MOV X, 2 é equivalente à instrução de máquina vista anteriormente (assumindo que o endereço de memória X seja 0000). Um montador traduz os códigos simbólicos e endereços de memória da linguagem de montagem para os códigos correspondentes da linguagem de máquina. As linguagens de montagem aumentaram muito a velocidade e a precisão com que os programas podem ser escritos, e são usadas ainda hoje, especialmente quando muita velocidade

8 Capítulo 1 INTRODUÇÃO 3 ou concisão de código são necessárias. Entretanto, a linguagem de montagem tem alguns defeitos: não é fácil escrever e é difícil ler e entender o que é escrito nela. Além disso, a linguagem de montagem é extremamente dependente da máquina em particular para a qual ela seja escrita; portanto, o código escrito para um computador precisa ser completamente reescrito para outro. Evidentemente, o grande passo seguinte na tecnologia de programação foi escrever as operações de um programa em uma forma concisa, mais semelhante a uma notação matemática ou linguagem natural, independentemente de qualquer máquina em particular e ainda assim passível de tradução por um programa em código executável. Por exemplo, o código anteriormente apresentado em linguagem de montagem pode ser escrito de forma concisa e independente de máquina como X = 2 Houve um temor inicial de que isso poderia ser impossível, ou, se fosse possível, que o código objeto fosse tão ineficiente que seria inútil. O desenvolvimento da linguagem Fortran e de seu compilador por um grupo na IBM dirigido por John Backus, entre 1954 e 1957, mostrou que esse temor não tinha fundamento. Ainda assim, o sucesso desse projeto resultou de muito esforço, pois a maioria dos processos de tradução de linguagens de programação era pouco entendida naquele momento. Na mesma época do desenvolvimento do primeiro compilador, Noam Chomsky iniciou seus estudos da estrutura da linguagem natural. Seus resultados tornaram a construção de compiladores mais simples e parcialmente automatizável. Os estudos de Chomsky levaram à classificação de linguagens segundo a complexidade de suas gramáticas (as regras que especificam sua estrutura) e o poder dos algoritmos necessários para reconhecê-las. A hierarquia de Chomsky, como é conhecida hoje, consiste de quatro níveis de gramática, denominadas tipo 0, tipo 1, tipo 2 e tipo 3, cada uma sendo uma especialização da anterior. As gramáticas de tipo 2, ou gramáticas livres de contexto, são as mais úteis para as linguagens de programação, e são hoje a forma padrão para representar a estrutura de linguagens de programação. O problema da análise sintática (a determinação de algoritmos eficientes para reconhecer linguagens livres de contexto) foi estudado nos anos 1960 e 1970, levando a uma solução bastante completa que hoje faz parte da teoria de compiladores. As linguagens livres de contexto e os algoritmos para análise sintática são estudados nos Capítulos 3, 4 e 5. Assuntos fortemente relacionados com as gramáticas livres de contexto são autômatos finitos e expressões regulares, que correspondem às gramáticas de Chomsky de tipo 3. Inicialmente desenvolvido pelo próprio Chomsky, o estudo desses temas levou a métodos simbólicos para expressar a estrutura de palavras, ou marcas, de uma linguagem de programação. No Capítulo 2 são discutidos autômatos finitos e expressões regulares. Um assunto muito mais complexo tem sido o desenvolvimento de métodos para gerar códigos objeto eficientes, que têm sido estudados desde o primeiro compilador até hoje. Essas técnicas geralmente recebem o nome inadequado de técnicas de otimização, mas deveriam ser denominadas técnicas de melhoria de código, pois quase nunca levam a um código-objeto efetivamente ótimo, embora melhorem sua eficiência. No Capítulo 8, os fundamentos dessas técnicas são apresentados. À medida que crescia a compreensão do problema da análise sintática, um grande número de trabalhos foi devotado à criação de programas para automatizar essa parte do desenvolvimento de compiladores. Esses programas foram originalmente denominados compiladores de compiladores, mas são mais bem identificados como geradores de analisadores sintáticos, pois automatizam somente uma parte do processo de compilação. O mais conhecido desses programas é o Yacc (yet another compiler compiler outro compilador

9 4 COMPILADORES: PRINCÍPIOS E PRÁTICAS de compiladores), escrito por Steve Johnson, em 1975, para o sistema Unix. O Yacc é estudado no Capítulo 5. De maneira similar, o estudo de autômatos finitos levou ao desenvolvimento de outra ferramenta, denominada gerador de sistemas de varredura, da qual a Lex (desenvolvida para o sistema Unix por Mike Lesk na mesma época do Yacc) é a mais conhecida. A Lex é estudada no Capítulo 2. No final dos anos 1970 e 1980, diversos projetos visavam automatizar a geração de outras partes de um compilador, como a geração de código. Esses empreendimentos foram menos bem-sucedidos, possivelmente em razão da natureza complexa das operações e ao nosso entendimento limitado dessas operações. Eles não são estudados em detalhe neste texto. Avanços mais recentes em projetos de compiladores têm gerado resultados interessantes. Primeiro, os compiladores têm incorporado algoritmos mais sofisticados para inferência e/ou simplificação da informação contida em um programa, o que tem ocorrido em paralelo ao desenvolvimento de linguagens de programação mais sofisticadas para as quais essa análise é relevante. Um exemplo típico é o algoritmo de Hindley-Milner para verificação de tipos, utilizado na compilação de linguagens funcionais. Em segundo lugar, os compiladores estão se tornando cada vez mais parte de ambientes de desenvolvimento interativo baseados em janelas (IDE), contendo editores, organizadores, depuradores e gerenciadores de projetos. Pouca padronização desses ambientes tem ocorrido até o momento, mas o desenvolvimento de ambientes padrão baseados em janelas tem apontado para essa direção. O estudo desses tópicos está além do escopo deste livro (mas veja na próxima seção uma breve descrição de alguns componentes de um IDE). Para referências bibliográficas, veja a seção de notas e bibliografia no final do capítulo. Apesar das atividades de pesquisa em anos recentes, entretanto, os fundamentos do projeto de compiladores não mudaram muito nos últimos 20 anos, e têm sido incorporados cada vez mais ao currículo básico de ciência da computação. 1.2 PROGRAMAS RELACIONADOS A COMPILADORES Nesta seção, descrevemos brevemente outros programas relacionados a ou utilizados juntamente com compiladores, os quais freqüentemente acompanham compiladores em um ambiente de desenvolvimento de linguagens completo. (Alguns deles já foram mencionados.) INTERPRETADORES Um interpretador é um tradutor de linguagens, assim como um compilador. A diferença é que o interpretador executa o programa-fonte de imediato, em vez de gerar um código-objeto que seja executado após o término da tradução. Em princípio, qualquer linguagem de programação pode ser interpretada ou compilada, mas dependendo da linguagem e da situação em que ocorre a tradução, um interpretador pode ser preferível. Por exemplo, a linguagem Basic é mais comumente interpretada que compilada. De maneira similar, linguagens funcionais como Lisp tendem a ser interpretadas. Interpretadores são usados freqüentemente também em situações educacionais e de desenvolvimento de software, quando os programas são traduzidos e retraduzidos muitas vezes. Um compilador, no entanto, é preferível se a velocidade de execução for importante, pois o código-objeto compilado é invariavelmente mais rápido que o código-fonte, interpretado dez ou mais vezes mais rápido. Entretanto, os interpretadores compartilham muitas de suas operações com os compiladores, podendo inclusive existir tradutores híbridos, que ficam entre os interpretadores e os compiladores. Discutiremos os interpretadores de forma intermitente, mas nosso foco principal, neste texto, serão os compiladores.

10 Capítulo 1 INTRODUÇÃO 5 MONTADORES Um montador é um tradutor para a linguagem de montagem de um computador em particular. Como já foi dito, a linguagem de montagem é uma forma simbólica da linguagem de máquina do computador, e é particularmente fácil de traduzir. Por vezes, um compilador irá gerar a linguagem de montagem como sua linguagem-alvo e, em seguida, contar com um montador para concluir a tradução para o código-objeto. ORGANIZADORES Tanto compiladores como montadores freqüentemente dependem de um programa denominado organizador, que coleta o código compilado separadamente, ou montado como arquivos-objeto distintos, e coloca tudo em um arquivo diretamente executável. Nesse sentido, uma distinção pode ser feita entre código-objeto código de máquina que ainda não foi organizado e código de máquina executável. Um organizador pode também conectar um programa-objeto ao código para funções padrão de biblioteca e para recursos fornecidos pelo sistema operacional do computador, como alocadores de memória e dispositivos de entrada e saída. É interessante notar que os organizadores efetuam hoje em dia a tarefa que era originalmente uma das principais atividades de um compilador (daí o uso da palavra compilar construir pela coleta a partir de diferentes fontes). Não estudaremos o processo de organização neste texto, pois ele depende de detalhes de sistema operacional e de processador. Também não faremos uma distinção clara entre código-objeto não organizado e código executável, pois essa distinção não será importante para nosso estudo das técnicas de compilação. CARREGADORES Freqüentemente, um compilador, montador ou organizador produz um código que não está completamente determinado e pronto para execução, mas cujas referências de memória principais são relativas a uma localização inicial não determinada, que pode estar em qualquer ponto da memória. Códigos desse tipo são denominados realocáveis, e um carregador resolve os endereços realocáveis relativos a um dado endereço de base ou inicial. O uso de um carregador torna o código executável mais flexível, mas o processo de carga normalmente ocorre nos bastidores (como parte do ambiente operacional) ou juntamente com a organização. Raramente um carregador é um programa em separado. PRÉ-PROCESSADORES Um pré-processador é um programa separado, ativado pelo compilador antes do início da tradução. Ele pode apagar comentários, incluir outros arquivos e executar substituições de macros (uma macro é uma descrição resumida de uma seqüência repetida de texto). Pré-processadores podem ser requeridos pela linguagem (como em C) ou podem ser acréscimos para conseguir recursos adicionais (como no pré-processador Ratfor para Fortran). EDITORES Geralmente, os compiladores aceitam programas-fonte escritos com qualquer editor que gere um arquivo padrão, por exemplo um arquivo ASCII. Mais recentemente, compiladores têm sido apresentados juntamente com editores e outros programas, na forma de um ambiente interativo para desenvolvimento (IDE). Nesse caso, um editor gera arquivos padrão, que também são orientados pela estrutura ou formato da linguagem de programação em questão. Esses editores são denominados baseados em estrutura e incluem parte das operações de um compilador, para que, por exemplo, o

11 6 COMPILADORES: PRINCÍPIOS E PRÁTICAS programador seja informado sobre erros enquanto o programa é escrito, e não quando ele está sendo compilado. O compilador e os programas que o acompanham podem também ser ativados pelo editor, e assim o programador pode executar o programa sem encerrar a execução do editor. DEPURADORES Um depurador é um programa que pode ser utilizado para determinar erros de execução em um programa compilado. Ele costuma ser apresentado juntamente com um compilador em um IDE. A execução de um programa com um depurador difere da execução padrão, pois o depurador registra muita ou toda a informação do código-fonte, como, por exemplo, números de linhas e nomes de variáveis e procedimentos. Ele pode também interromper a execução em pontos pré-especificados, denominados pontos de interrupção, bem como fornecer informações sobre que funções foram ativadas e quais os valores das variáveis. Para efetuar essas funções, o depurador precisa receber a informação simbólica apropriada do compilador, o que pode, por vezes, ser difícil, especialmente para compiladores que tentam otimizar o código-objeto. Assim, a depuração é um assunto ligado ao compilador, o qual, entretanto, está além do escopo deste livro. GERADORES DE PERFIL Um gerador de perfil é um programa que coleta estatísticas sobre o comportamento de um programa-objeto durante sua execução. Estatísticas que normalmente interessam a um programador são o número de ativações de um procedimento e a relação entre os tempos de execução dos procedimentos. Essas estatísticas podem ser extremamente úteis para ajudar o programador a melhorar a velocidade de execução do programa. Por vezes, o compilador pode utilizar a saída do gerador de perfil para melhorar automaticamente o código-objeto, sem a intervenção do programador. GERENCIADORES DE PROJETOS Projetos de software modernos são, em geral, tão grandes que precisam ser feitos por grupos de programadores, em vez de um único programador individualmente. Nesses casos, é importante que os arquivos trabalhados por essas várias pessoas sejam coordenados, e é isso que um programa gerenciador de projetos faz. Por exemplo, um gerenciador de projetos deve coordenar a junção de versões de um mesmo arquivo produzidas por diferentes programadores. Ele deve também manter um histórico de alterações em cada grupo de arquivos, para que versões coerentes de um programa em desenvolvimento possam ser mantidas (isso também pode ser útil para os projetos com um único programador). Um gerenciador de projetos pode ser escrito de forma independente da linguagem, mas quando acompanha um compilador, ele pode manter informações específicas e úteis do compilador e do organizador. Dois gerenciadores de projetos populares em sistemas Unix são sccs (source code control system sistema de controle de código-fonte) e rcs (revision control system sistema de controle de revisões). 1.3 O PROCESSO DE TRADUÇÃO Um compilador é constituído internamente por passos, ou fases, para operações lógicas distintas. Essas fases podem ser entendidas como peças separadas dentro do compilador, que podem efetivamente ser escritas como operações codificadas separadamente, embora na prática elas sejam freqüentemente agrupadas. As fases de um compilador estão mostradas na Figura 1.1, juntamente com os componentes auxiliares que interagem com algumas ou com todas as fases: a tabela de literais, a tabela de símbolos e o manipulador de erros. Cada uma

12 Capítulo 1 INTRODUÇÃO 7 Código-fonte Sistema de varredura Marcas Analisador sintático Árvore sintática Analisador semântico Tabela de literais Árvore anotada Tabela de símbolos Otimizador de código-fonte Manipulador de erros Código intermediário Gerador de código Código-alvo Otimizador de código-alvo Código-alvo Figura 1.1 As fases de um compilador. das fases será descrita brevemente: elas serão estudadas com mais detalhes nos próximos capítulos. (As tabelas de literais e de símbolos serão discutidas com mais detalhes na próxima seção, e o manipulador de erros, na Seção 1.5.)

13 8 COMPILADORES: PRINCÍPIOS E PRÁTICAS O SISTEMA DE VARREDURA Nessa fase do compilador o programa-fonte é lido. Geralmente, o programa-fonte é fornecido como uma seqüência de caracteres. Durante a varredura, ocorre a análise léxica: seqüências de caracteres são organizadas como unidades significativas denominadas marcas, que são como as palavras em uma linguagem natural como o inglês, por exemplo. Um sistema de varredura tem função similar à de um sistema para soletrar. Por exemplo, considere a linha de código a seguir, que poderia pertencer a um programa em C: a [index] = Esse código contém 12 caracteres diferentes de espaço, mas somente 8 marcas: a identificador [ colchete à esquerda index identificador ] colchete à direita = atribuição 4 número + sinal de adição 2 número Cada marca é composta por um ou mais caracteres, que são agrupados como uma unidade antes de o processamento prosseguir. Um sistema de varredura efetua outras operações além de reconhecer marcas. Por exemplo, ele pode inserir identificadores na tabela de símbolos e literais na tabela de literais (os literais incluem constantes numéricas, como , e cadeias de caracteres entre aspas, como Hello, world! ). O ANALISADOR SINTÁTICO O analisador sintático recebe do sistema de varredura o código-fonte na forma de marcas e efetua a análise sintática, que determina a estrutura do programa. Isso é similar à análise gramatical de uma sentença em linguagem natural. A análise sintática determina os elementos estruturais do programa e seus relacionamentos. Os resultados da análise sintática são geralmente representados como uma árvore de análise sintática ou uma árvore sintática. Como exemplo, considere novamente a linha de código em C vista anteriormente. Ela representa um elemento estrutural denominado expressão, no caso uma expressão de atribuição composta por uma expressão indexada à esquerda e uma expressão de aritmética de inteiros à direita. Essa estrutura pode ser representada em uma árvore de análise sintática da seguinte forma:

14 Capítulo 1 INTRODUÇÃO 9 expressão expressão de atribuição expressão = expressão expressão indexada expressão de adição expressão [ expressão ] expressão + expressão identificador a identificador index número 4 número 2 Observe que os nós internos da árvore de análise sintática são rotulados pelos nomes das estruturas que elas representam, e as folhas da árvore de análise sintática representam a seqüência recebida de marcas. (Os nomes das estruturas estão escritos com fonte diferente para diferenciar das marcas.) Uma árvore de análise sintática é um recurso útil para visualizar a sintaxe de um programa ou elemento de programa, mas é ineficiente para representar sua estrutura. Analisadores sintáticos tendem a gerar uma árvore sintática, que condensa a informação contida na árvore de análise sintática. (Por vezes, as árvores sintáticas são denominadas árvores sintáticas abstratas, porque representam uma abstração adicional sobre árvores de análise sintática.) Uma árvore sintática abstrata para nosso exemplo de expressão de atribuição em C fica assim: expressão de atribuição expressão indexada expressão de adição identificador a identificador index número 4 número 2 Observe que, na árvore sintática, muitos dos nós desaparecem (incluindo os nós de marcas). Por exemplo, se soubermos que uma expressão é uma operação de indexação, não é mais necessário preservar os colchetes [ e ] que representam essa operação na entrada original. ANALISADOR SEMÂNTICO A semântica de um programa é o seu significado, contrastando com sua sintaxe ou estrutura. A semântica de um programa determina o seu comportamento durante a

15 10 COMPILADORES: PRINCÍPIOS E PRÁTICAS execução, mas as linguagens de programação, em sua maioria, têm atributos que podem ser determinados antes da execução, mas que não podem ser expressos de forma conveniente como sintaxe para serem analisados pelo analisador sintático. Esses atributos são denominados semântica estática, e a análise dessa semântica é tarefa para o analisador semântico. (A semântica dinâmica de um programa as propriedades de um programa que podem ser determinadas somente por meio de sua execução não pode ser determinada por um compilador, pois ele não executa o programa.) Atributos típicos de semântica estática de linguagens de programação comuns incluem verificação de tipos e declarações. As informações adicionais (por exemplo, tipos de dados) computadas pelo analisador semântico são denominadas atributos, e são freqüentemente adicionadas à árvore como anotações. (Atributos podem também ser inseridos na tabela de símbolos.) Em nosso exemplo da expressão em C, a[index] = as informações de tipos típicas que poderiam ser obtidas antes de analisar essa linha seriam que a é um vetor de valores inteiros com índices de um intervalo de inteiros e que index é uma variável de inteiros. O analisador semântico anotaria a árvore sintática com os tipos de todas as subexpressões e verificaria se as atribuições fazem sentido para esses tipos, declarando um erro de divergência entre tipos em caso contrário. Em nosso exemplo, todos os tipos fazem sentido, e o resultado da análise semântica na árvore sintática poderia ser representado pela árvore a seguir: expressão de atribuição expressão indexada inteiro expressão de adição inteiro identificador a vetor de inteiros identificador index inteiro número 4 inteiro número 2 inteiro OTIMIZADOR DE CÓDIGO-FONTE Freqüentemente, os compiladores incluem uma série de passos de melhoria de código, também denominados otimizações. O primeiro ponto passível de aplicação de passos de otimização é logo após a análise semântica, e certas possibilidades de melhoria de código dependem apenas do código-fonte. Essa possibilidade é indicada pela apresentação dessa operação como uma fase separada no processo de compilação. Compiladores individuais apresentam grande variedade de tipos de otimização e posicionamento das fases de otimização. Em nosso exemplo, incluímos uma oportunidade de otimização de fonte: a expressão pode ser pré-computada pelo compilador para obter o resultado 6. (Essa otimização, em particular, é conhecida como empacotamento constante.)

16 Capítulo 1 INTRODUÇÃO 11 Evidentemente, existem possibilidades muito mais complexas (algumas delas são mencionadas no Capítulo 8). Em nosso exemplo, essa otimização pode ser efetuada diretamente sobre a árvore sintática (anotada) pela fusão da subárvore à direita do nó-raiz em seu valor constante: expressão de atribuição expressão indexada inteiro número 6 inteiro identificador a vetor de inteiros identificador index inteiro Diversas otimizações podem ser efetuadas diretamente na árvore, mas em muitos casos é mais fácil otimizar uma forma linearizada da árvore, mais próxima do código de montagem. Existem muitas variedades de código de montagem, mas uma escolha padrão é o código de três endereços, que recebe esse nome porque contém (até) três endereços na memória. Outra escolha popular é o P-código, usado em muitos compiladores Pascal. Em nosso exemplo, um código de três endereços para a expressão original em C poderia ficar assim: t = a[index] = t (Observe o uso de uma variável temporária adicional t para armazenar o resultado intermediário da adição.) O otimizador melhoraria esse código em dois passos, inicialmente computando o resultado da adição t = 6 a[index] = t e depois substituindo t por seu valor, para obter a declaração de três endereços a[index] = 6 Na Figura 1.1, indicamos a possibilidade de o otimizador de código-fonte utilizar um código de três endereços referindo-se à sua saída como código intermediário. Historicamente, esse nome era usado para uma forma de representação de código intermediária entre fonte e objeto, como o código de três endereços ou uma representação linear semelhante. Entretanto, ele pode se referir de maneira mais geral a qualquer representação interna para o código-fonte usada pelo compilador. Nesse sentido, a árvore sintática pode também ser identificada como código intermediário, e o otimizador de código-fonte pode continuar a usar essa representação em sua saída.

Compiladores. Motivação. Tradutores. Motivação. Tipos de Tradutores. Tipos de Tradutores

Compiladores. Motivação. Tradutores. Motivação. Tipos de Tradutores. Tipos de Tradutores Motivação Prof. Sérgio Faustino Compiladores Conhecimento das estruturas e algoritmos usados na implementação de linguagens: noções importantes sobre uso de memória, eficiência, etc. Aplicabilidade freqüente

Leia mais

Universidade de Santa Cruz do Sul UNISC Departamento de informática COMPILADORES. Introdução. Geovane Griesang

Universidade de Santa Cruz do Sul UNISC Departamento de informática COMPILADORES. Introdução. Geovane Griesang Universidade de Santa Cruz do Sul UNISC Departamento de informática COMPILADORES Introdução geovanegriesang@unisc.br Processadores de linguagem Linguagens de programação são notações para se descrever

Leia mais

Introdução à Programação

Introdução à Programação Introdução à Programação Linguagens de Programação: sintaxe e semântica de linguagens de programação e conceitos de linguagens interpretadas e compiladas Engenharia da Computação Professor: Críston Pereira

Leia mais

Compiladores I Prof. Ricardo Santos (cap 1)

Compiladores I Prof. Ricardo Santos (cap 1) Compiladores I Prof. Ricardo Santos (cap 1) Compiladores Linguagens de programação são notações que permitem descrever como programas devem executar em uma máquina Mas, antes do programa executar, deve

Leia mais

Compiladores. Introdução à Compiladores

Compiladores. Introdução à Compiladores Compiladores Introdução à Compiladores Cristiano Lehrer, M.Sc. Introdução (1/2) O meio mais eficaz de comunicação entre pessoas é a linguagem (língua ou idioma). Na programação de computadores, uma linguagem

Leia mais

Especificações Gerais do Compilador e Definição de FRANKIE

Especificações Gerais do Compilador e Definição de FRANKIE Especificações Gerais do Compilador e Definição de FRANKIE 1. Especificações Gerais do Compilador (Decisões de projeto) 2. Especificações da Linguagem Fonte Definição Informal Considerações Léxicas Considerações

Leia mais

Desenvolvimento de Aplicações Desktop

Desenvolvimento de Aplicações Desktop Desenvolvimento de Aplicações Desktop Conceitos Básicos de Programação Professor: Charles Leite O Desenvolvimento de Programas A programação consiste em indicar como o computador (hardware) deve trabalhar

Leia mais

DESENVOLVIMENTO DO COMPILADOR PARA A LINGUAGEM SIMPLE

DESENVOLVIMENTO DO COMPILADOR PARA A LINGUAGEM SIMPLE DESENVOLVIMENTO DO COMPILADOR PARA A LINGUAGEM SIMPLE Jeferson MENEGAZZO 1, Fernando SCHULZ 2, Munyque MITTELMANN 3, Fábio ALEXANDRINI 4. 1 Aluno 5ª fase do Curso de Ciência da Computação do Instituto

Leia mais

I LINGUAGENS E PROCESSADORES: INTRODUÇÃO 1

I LINGUAGENS E PROCESSADORES: INTRODUÇÃO 1 PREÂMBULO PREFÂCIO xiii xv I LINGUAGENS E PROCESSADORES: INTRODUÇÃO 1 1 1.1 1.1.1 1.1.2 1.2 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 2 2.1 2.2 2.2.1 2.2.2 2.3 2.3.1 2.3.2 2.3.3 2.3.4 2.3.5 2.3.6 2.4 2.4.1 2.4.2

Leia mais

Linguagens de Programação

Linguagens de Programação O estudante estuda muito. Regras: 7 9 12 14. . Regras: 2 4 . Regras: 1 Representar através de uma árvore de derivação. 77 O estudante estuda muito.

Leia mais

Conceitos de Linguagens de Programação

Conceitos de Linguagens de Programação Conceitos de Linguagens de Programação Aula 03 Processo de Compilação Edirlei Soares de Lima Métodos de Implementação Arquitetura de Von Neumann: A linguagem de máquina de um computador

Leia mais

Compiladores. Conceitos Básicos

Compiladores. Conceitos Básicos Compiladores Conceitos Básicos Processadores de Linguagem De forma simples, um compilador é um programa que recebe como entrada um programa em uma linguagem de programação a linguagem fonte e o traduz

Leia mais

Universidade Federal de Goiás Bacharelado em Ciências da Computacão Compiladores

Universidade Federal de Goiás Bacharelado em Ciências da Computacão Compiladores Universidade Federal de Goiás Bacharelado em Ciências da Computacão Compiladores 2013-2 Compilador para a Linguagem Cafezinho Especificação dos trabalhos: T2 (Geração da Representação Intermediária e Análise

Leia mais

PROGRAMAÇÃO I. Introdução

PROGRAMAÇÃO I. Introdução PROGRAMAÇÃO I Introdução Introdução 2 Princípios da Solução de Problemas Problema 1 Fase de Resolução do Problema Solução na forma de Algoritmo Solução como um programa de computador 2 Fase de Implementação

Leia mais

Capítulo 1. Aspectos Preliminares

Capítulo 1. Aspectos Preliminares Capítulo 1 Aspectos Preliminares Tópicos do Capítulo 1 Razões para estudar conceitos de linguagens de programação Domínios de programação Critérios de avaliação de linguagens Influências no projeto de

Leia mais

Introdução à Computação

Introdução à Computação Introdução à Computação Jordana Sarmenghi Salamon jssalamon@inf.ufes.br jordanasalamon@gmail.com http://inf.ufes.br/~jssalamon Departamento de Informática Universidade Federal do Espírito Santo Agenda

Leia mais

EA876 - Introdução a Software de Sistema

EA876 - Introdução a Software de Sistema 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

Leia mais

Paradigmas de Programação

Paradigmas de Programação Paradigmas de Programação Prof.: Edilberto M. Silva http://www.edilms.eti.br Aula 2 Linguagens de Programação Desenvolvimento e execução de programas Características de linguagens Execução de programas

Leia mais

Compiladores. Introdução

Compiladores. Introdução Compiladores Introdução Apresentação Turma Noite Continuada I 20/03 Continuada II 22/05 Atividades Regimental 05/06 Total 1 Ponto 1 Ponto 1 Ponto 7 Pontos 10 Pontos Aulas expositivas teórico-práticas Exercícios

Leia mais

COMPILAÇÃO. Ricardo José Cabeça de Souza

COMPILAÇÃO. Ricardo José Cabeça de Souza COMPILAÇÃO Ricardo José Cabeça de Souza www.ricardojcsouza.com.br Programas Código-fonte escrito em linguagem de programação de alto nível, ou seja, com um nível de abstração muito grande, mais próximo

Leia mais

Projeto de Compiladores

Projeto de Compiladores Projeto de Compiladores FIR Faculdade Integrada do Recife João Ferreira 12 e 13 de fevereiro de 2007 Questionário 1. Em quais linguagens de programação você já programou? 2. O que você sabe sobre compiladores?

Leia mais

Introdução. Compiladores Análise Semântica. Introdução. Introdução. Introdução. Introdução 11/3/2008

Introdução. Compiladores Análise Semântica. Introdução. Introdução. Introdução. Introdução 11/3/2008 Compiladores Análise Semântica Fabiano Baldo Análise Semântica é por vezes referenciada como análise sensível ao contexto porque lida com algumas semânticas simples tais como o uso de uma variável somente

Leia mais

Conclusões. Baseado no Capítulo 9 de Programming Language Processors in Java, de Watt & Brown

Conclusões. Baseado no Capítulo 9 de Programming Language Processors in Java, de Watt & Brown Conclusões Baseado no Capítulo 9 de Programming Language Processors in Java, de Watt & Brown QUESTÕES FUNDAMENTAIS 1. Correção do código gerado 2. Desempenho do compilador: a. Notificação de erros; b.

Leia mais

CP Compiladores I Prof. Msc.. Carlos de Salles

CP Compiladores I Prof. Msc.. Carlos de Salles CP 5017.9 Prof. Msc.. Carlos de Salles 1 - EMENTA O Processo de Compilação. Deteção e Recuperação de Erros. Introdução à geração de Código Intermediário. Geração de Código de Máquina. Otimização. Uma visão

Leia mais

AULA 03: FUNCIONAMENTO DE UM COMPUTADOR

AULA 03: FUNCIONAMENTO DE UM COMPUTADOR ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES I AULA 03: FUNCIONAMENTO DE UM COMPUTADOR Prof. Max Santana Rolemberg Farias max.santana@univasf.edu.br Colegiado de Engenharia de Computação O QUE É UM COMPUTADOR?

Leia mais

Introdução à Computação: Máquinas Multiníveis

Introdução à Computação: Máquinas Multiníveis Introdução à Computação: Máquinas Multiníveis Beatriz F. M. Souza (bfmartins@inf.ufes.br) http://inf.ufes.br/~bfmartins/ Computer Science Department Federal University of Espírito Santo (Ufes), Vitória,

Leia mais

Conversões de Linguagens: Tradução, Montagem, Compilação, Ligação e Interpretação

Conversões de Linguagens: Tradução, Montagem, Compilação, Ligação e Interpretação Conversões de Linguagens: Tradução, Montagem, Compilação, Ligação e Interpretação Para executar uma tarefa qualquer, um computador precisa receber instruções precisas sobre o que fazer. Uma seqüência adequada

Leia mais

Noções de compilação

Noções de compilação Noções de compilação Compilador: o que é, para que serve e estrutura geral Parentes do compilador e programas correlatos Prof. Thiago A. S. Pardo 1 Exercício em duplas Para esquentar... 2 1 Compilação:

Leia mais

Autômatos e Linguagens

Autômatos e Linguagens Autômatos e Linguagens Eduardo Ferreira dos Santos Ciência da Computação Centro Universitário de Brasília UniCEUB Agosto, 2016 1 / 41 Sumário 1 Compiladores 2 Linguagens de programação 3 Ciência dos compiladores

Leia mais

Compiladores. Prof. Bruno Moreno

Compiladores. Prof. Bruno Moreno Compiladores Prof. Bruno Moreno Apresentação - Professor Bruno Neiva Moreno Graduado em Ciência da Computação (UFPB) 2004 a 2009 Bolsista PIBIC/CNPq LARHENA - Laboratório de Recursos Hídricos e Engenharia

Leia mais

INE5421 LINGUAGENS FORMAIS E COMPILADORES

INE5421 LINGUAGENS FORMAIS E COMPILADORES INE5421 LINGUAGENS FORMAIS E COMPILADORES PLANO DE ENSINO Objetivo geral Conhecer a teoria das linguagens formais visando sua aplicação na especificação de linguagens de programação e na construção de

Leia mais

Compiladores. Eduardo Ferreira dos Santos. Fevereiro, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 38

Compiladores. Eduardo Ferreira dos Santos. Fevereiro, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 38 Compiladores Eduardo Ferreira dos Santos Ciência da Computação Centro Universitário de Brasília UniCEUB Fevereiro, 2017 1 / 38 Sumário 1 Compiladores 2 Linguagens de programação 3 Ciência dos compiladores

Leia mais

Noções de compilação

Noções de compilação Noções de compilação Compilador: o que é, para que serve e estrutura geral Parentes do compilador e programas correlatos Prof. Thiago A. S. Pardo 1 Compilação: por que estudar? (parte 1) Compiladores:

Leia mais

Algoritmos e Programação

Algoritmos e Programação ESTADO DE MATO GROSSO SECRETARIA DE ESTADO DE CIÊNCIA E TECNOLOGIA UNIVERSIDADE DO ESTADO DE MATO GROSSO CAMPUS UNIVERSITÁRIO DE SINOP FACULDADE DE CIÊNCIAS EXATAS E TECNOLÓGICAS CURSO DE ENGENHARIA ELÉTRICA

Leia mais

V.2 Especificação Sintática de Linguagens de Programação

V.2 Especificação Sintática de Linguagens de Programação V.2 Especificação Sintática de Linguagens de Programação Deve ser baseada: No planejamento da Linguagem / Compilador Objetivos, Filosofia, Potencialidades,... Nos critérios de projeto/avaliação Legibilidade,

Leia mais

Organização e Arquitetura de Computadores I

Organização e Arquitetura de Computadores I Organização e Arquitetura de Computadores I Conjunto de Instruções Slide 1 Sumário Características de Instruções de Máquina Tipos de Operandos Tipos de Operações Linguagem de Montagem Slide 2 Características

Leia mais

Construção de Compiladores. Capítulo 1. Introdução. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2014.

Construção de Compiladores. Capítulo 1. Introdução. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2014. Construção de Compiladores Capítulo 1 Introdução José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2014.2 1/22 1 Linguagens de programação 2 Compilação 2/22 Tópicos 1

Leia mais

Algoritmos e Programação

Algoritmos e Programação ESTADO DE MATO GROSSO SECRETARIA DE ESTADO DE CIÊNCIA E TECNOLOGIA UNIVERSIDADE DO ESTADO DE MATO GROSSO CAMPUS UNIVERSITÁRIO DE SINOP FACULDADE DE CIÊNCIAS EXATAS E TECNOLÓGICAS Algoritmos e Programação

Leia mais

FERRAMENTA DE AUXÍLIO AO PROCESSO DE DESENVOLVIMENTO DE SOFTWARE INTEGRANDO TECNOLOGIAS OTIMIZADORAS

FERRAMENTA DE AUXÍLIO AO PROCESSO DE DESENVOLVIMENTO DE SOFTWARE INTEGRANDO TECNOLOGIAS OTIMIZADORAS FERRAMENTA DE AUXÍLIO AO PROCESSO DE DESENVOLVIMENTO DE SOFTWARE INTEGRANDO TECNOLOGIAS OTIMIZADORAS Acadêmico: Roger Anderson Schmidt Orientador : Marcel Hugo Supervisor : Ricardo de Freitas Becker Empresa

Leia mais

TÉCNICO EM MANUTENÇÃO E SUPORTE EM INFORMÁTICA FORMA SUBSEQUENTE. Professora: Isabela C. Damke

TÉCNICO EM MANUTENÇÃO E SUPORTE EM INFORMÁTICA FORMA SUBSEQUENTE. Professora: Isabela C. Damke TÉCNICO EM MANUTENÇÃO E SUPORTE EM INFORMÁTICA FORMA SUBSEQUENTE Professora: Isabela C. Damke isabeladamke@hotmail.com Linguagem de Programação Uma linguagem de programação é um conjunto de símbolos (

Leia mais

II.1 Conceitos Fundamentais. Uma delas é programar o =>

II.1 Conceitos Fundamentais. Uma delas é programar o => II.1 Conceitos Fundamentais II.2 Gerações das Linguagens de Programação II.3 Linguagem de Programação II.4 Sistema Operacional II.5 Tradutores II.5.1 Estrutura de um tradutor II.5.1.1 Análise Léxica II.5.1.3

Leia mais

Existem três categorias principais de linguagem de programação: linguagem de máquina, linguagens assembly e linguagens de alto nível.

Existem três categorias principais de linguagem de programação: linguagem de máquina, linguagens assembly e linguagens de alto nível. Aula 3 SOFTWARE (programas) Um programa (software) consiste em uma sequência de instruções escritas numa linguagem precisa chamada linguagem de programação. Estas instruções são traduzidas em um compilador,

Leia mais

Métodos de implementação de linguagens. Kellen Pinagé

Métodos de implementação de linguagens. Kellen Pinagé Métodos de implementação de linguagens Kellen Pinagé Sumário Métodos de implementação de linguagens Compilação Interpretação pura Híbrido Métodos de implementação de linguagens Principais componentes de

Leia mais

Apresentação. !! Familiarização com os métodos de construção de compiladores de linguagens e com as técnicas de compilação mais habituais.

Apresentação. !! Familiarização com os métodos de construção de compiladores de linguagens e com as técnicas de compilação mais habituais. Apresentação Universidade dos Açores Departamento de Matemática www.uac.pt/~hguerra/!! Aquisição de conceitos sobre a definição de linguagens de programação.!! Familiarização com os métodos de construção

Leia mais

Banco de Dados Profa. Dra. Cristina Dutra de Aguiar Ciferri. Banco de Dados Processamento e Otimização de Consultas

Banco de Dados Profa. Dra. Cristina Dutra de Aguiar Ciferri. Banco de Dados Processamento e Otimização de Consultas Processamento e Otimização de Consultas Banco de Dados Motivação Consulta pode ter sua resposta computada por uma variedade de métodos (geralmente) Usuário (programador) sugere uma estratégia para achar

Leia mais

3. Linguagem de Programação C

3. Linguagem de Programação C Introdução à Computação I IBM1006 3. Linguagem de Programação C Prof. Renato Tinós Departamento de Computação e Matemática (FFCLRP/USP) 1 Principais Tópicos 3. Linguagem de programação C 3.1. Conceitos

Leia mais

Sistema Computacional

Sistema Computacional Algoritmos e Lógica de Programação Conceitos Básicos Abstração Reinaldo Gomes reinaldo@cefet-al.br O que é um? Integração de componentes atuando como uma entidade, com o propósito de processar dados, i.e.

Leia mais

Introdução à Programação de Computadores Fabricação Mecânica

Introdução à Programação de Computadores Fabricação Mecânica Introdução à Programação de Computadores Fabricação Mecânica Edilson Hipolito da Silva edilson.hipolito@ifsc.edu.br - http://www.hipolito.info Aula 04 - Linguagens de Programação, Interpretador, compilador

Leia mais

Projeto de Compiladores

Projeto de Compiladores Projeto de Compiladores FIR Faculdade Integrada do Recife João Ferreira 26 e 27 de fevereiro de 2007 Agenda da Aula Revisão Linguagem de Programação Tradutores Compilador As Fases de Um Compilador Linguagem

Leia mais

FACULDADE LEÃO SAMPAIO

FACULDADE LEÃO SAMPAIO FACULDADE LEÃO SAMPAIO Paradigmas de Programação Curso de Análise e Desenvolvimento de Sistemas Turma: 309-5 Semestre - 2014.2 Paradigmas de Programação Prof. MSc. Isaac Bezerra de Oliveira. 1 PARADIGMAS

Leia mais

Infraestrutura de Hardware. Funcionamento de um Computador

Infraestrutura de Hardware. Funcionamento de um Computador Infraestrutura de Hardware Funcionamento de um Computador Computador: Hardware + Software Perguntas que Devem ser Respondidas ao Final do Curso Como um programa escrito em uma linguagem de alto nível é

Leia mais

Conceitos Básicos de Programação

Conceitos Básicos de Programação BCC 201 - Introdução à Programação Conceitos Básicos de Programação Guillermo Cámara-Chávez UFOP 1/53 Conceitos básicos I Variável 2/53 Conceitos básicos II Posição de memoria, identificada através de

Leia mais

Universidade Estadual da Paraíba - UEPB Curso de Licenciatura em Computação

Universidade Estadual da Paraíba - UEPB Curso de Licenciatura em Computação Universidade Estadual da Paraíba - UEPB Curso de Licenciatura em Computação Análise Semântica Disciplina: Compiladores Equipe: Luiz Carlos dos Anjos Filho José Ferreira Júnior Compiladores Um compilador

Leia mais

Introdução à Programação Aula 03. Prof. Max Santana Rolemberg Farias Colegiado de Engenharia de Computação

Introdução à Programação Aula 03. Prof. Max Santana Rolemberg Farias Colegiado de Engenharia de Computação Aula 03 Prof. Max Santana Rolemberg Farias max.santana@univasf.edu.br Colegiado de Engenharia de Computação Linguagens de Programação A primeira linguagem de programação foi criada por Ada Lovelace. Amiga

Leia mais

Memória. Arquitetura de Von Neumann. Universidade do Vale do Rio dos Sinos Laboratório I Prof.ª Vera Alves 1 CPU. Unidade de controle ULA

Memória. Arquitetura de Von Neumann. Universidade do Vale do Rio dos Sinos Laboratório I Prof.ª Vera Alves 1 CPU. Unidade de controle ULA Universidade do Vale do Rio dos Sinos Laboratório I Prof.ª Vera Alves 1 Arquitetura de Von Neumann CPU Unidade de controle Unidade de entrada Unidade de saída ULA Von Neumann era um gênio. Falava muitos

Leia mais

Compiladores. Bruno Lopes. Bruno Lopes Compiladores 1 / 32. Instituto de C

Compiladores. Bruno Lopes. Bruno Lopes Compiladores 1 / 32. Instituto de C ompiladores Introdução Bruno Lopes Bruno Lopes ompiladores 1 / 32 Apresentação Em que período estão? O quanto sabem de programação? Quais linguagens? O quanto sabem de unix? O quanto sabem de Linguagens

Leia mais

Compiladores. Fabio Mascarenhas

Compiladores. Fabio Mascarenhas Compiladores Fabio Mascarenhas 2017.1 http://www.dcc.ufrj.br/~fabiom/comp Introdução Compiladores x Interpretadores Offline x Online Um compilador transforma um programa executável de uma linguagem fonte

Leia mais

Programação: Compiladores x Interpretadores PROF. CARLOS SARMANHO JR

Programação: Compiladores x Interpretadores PROF. CARLOS SARMANHO JR Programação: Compiladores x Interpretadores PROF. CARLOS SARMANHO JR Introdução Compiladores e interpretadores são formas de tradução de um código geralmente de alto nível (escrito em uma linguagem de

Leia mais

Linguagens de Programação Classificação

Linguagens de Programação Classificação Classificação Classificação A proximidade que a linguagem de programação tem com a humana determina sua classe (o nível): Linguagem de máquina (primeira geração) Linguagem assembly - de montagem (segunda

Leia mais

Puca Huachi Vaz Penna

Puca Huachi Vaz Penna BCC201 Introdução à Computação Turmas 31, 32 e 33 Puca Huachi Vaz Penna Departamento de Computação Universidade Federal de Ouro Preto http://www.decom.ufop.br/puca puca@iceb.ufop.br Aula 2 Introdução:

Leia mais

Programação de Computadores

Programação de Computadores Programação de Computadores Instituto de Computação UFF Departamento de Ciência da Computação Otton Teixeira da Silveira Filho Conteúdo Alguns Conceitos sobre Linguagens Paradigmas para linguagens de Programação

Leia mais

Introdução à Computação

Introdução à Computação UNIVERSIDADE ESTADUAL DE MARINGÁ DEPARTAMENTO DE INFORMÁTICA Introdução à Computação Prof. Yandre Maldonado - 1 Prof. Yandre Maldonado e Gomes da Costa yandre@din.uem.br Histórico da Computação Prof. Yandre

Leia mais

SSC510 Arquitetura de Computadores 1ª AULA

SSC510 Arquitetura de Computadores 1ª AULA SSC510 Arquitetura de Computadores 1ª AULA REVISÃO DE ORGANIZAÇÃO DE COMPUTADORES Arquitetura X Organização Arquitetura - Atributos de um Sistema Computacional como visto pelo programador, isto é a estrutura

Leia mais

Introdução à Computação

Introdução à Computação UNIVERSIDADE ESTADUAL DE MARINGÁ DEPARTAMENTO DE INFORMÁTICA Introdução à Computação Prof. Yandre Maldonado - 1 Prof. Yandre Maldonado e Gomes da Costa yandre@din.uem.br Histórico da Computação Prof. Yandre

Leia mais

Introdução parte II. Compiladores. Mariella Berger

Introdução parte II. Compiladores. Mariella Berger Introdução parte II Compiladores Mariella Berger Sumário Partes de um compilador Gerador da Tabela de Símbolos Detecção de erros As fases da análise As fases de um compilador Montadores O que é um Compilador?

Leia mais

Resolução de Problemas com Computador. Resolução de Problemas com Computador. Resolução de Problemas com Computador

Resolução de Problemas com Computador. Resolução de Problemas com Computador. Resolução de Problemas com Computador Prof. Araken Medeiros araken@ufersa.edu.br O processo de resolução de um problema com um computador leva à escrita de um algoritmo ou programa e à sua execução. Mas o que é um algoritmo? Angicos, RN 15/9/2009

Leia mais

DECivil Departamento de Engenharia Civil, Arquitectura e Georrecursos. Apresentação. Computação e Programação (CP) 2013/2014.

DECivil Departamento de Engenharia Civil, Arquitectura e Georrecursos. Apresentação. Computação e Programação (CP) 2013/2014. DECivil Departamento de Engenharia Civil, Arquitectura e Georrecursos Apresentação Computação e Programação (CP) 2013/2014 Aula 1 Objetivos Ficar a saber: funcionamento da unidade curricular (UC) Computação

Leia mais

Universidade Federal de Alfenas

Universidade Federal de Alfenas Universidade Federal de Alfenas Linguagens Formais e Autômatos Aula 12 Linguagens Livres do Contexto humberto@bcc.unifal-mg.edu.br Linguagens Livres do Contexto Para as LLC, temos as Gramáticas Livres

Leia mais

Programação de Computadores I Introdução PROFESSORA CINTIA CAETANO

Programação de Computadores I Introdução PROFESSORA CINTIA CAETANO Programação de Computadores I Introdução PROFESSORA CINTIA CAETANO Introdução Resolução de problemas Encontrar uma maneira de descrever este problema de uma forma clara e precisa. Encontremos uma seqüência

Leia mais

Introdução aos Compiladores

Introdução aos Compiladores Universidade Católica de Pelotas Introdução aos Compiladores André Rauber Du Bois dubois@ucpel.tche.br 1 MOTIVAÇÃO Entender os algor ıtmos e estruturas usados para se implementar linguagens de programação

Leia mais

15/03/2018. Professor Ariel da Silva Dias Aspectos sintáticos e semânticos básicos de linguagens de programação

15/03/2018. Professor Ariel da Silva Dias Aspectos sintáticos e semânticos básicos de linguagens de programação Professor Ariel da Silva Dias Aspectos sintáticos e semânticos básicos de linguagens de programação Conjunto de regras que definem a forma da linguagem; Como as sentenças podem ser formadas como sequências

Leia mais

INE5416 Paradigmas de Programação. Ricardo Azambuja Silveira INE CTC UFSC E Mail: URL:

INE5416 Paradigmas de Programação. Ricardo Azambuja Silveira INE CTC UFSC E Mail: URL: INE5416 Paradigmas de Programação Ricardo Azambuja Silveira INE CTC UFSC E Mail: silveira@inf.ufsc.br URL: www.inf.ufsc.br/~silveira Conceitos Léxica estudo dos símbolos que compõem uma linguagem Sintaxe

Leia mais

Algoritmos Computacionais

Algoritmos Computacionais UNIDADE 1 Processador e instruções Memórias Dispositivos de Entrada e Saída Software ARQUITETURA BÁSICA UCP Unidade central de processamento MEM Memória E/S Dispositivos de entrada e saída UCP UNIDADE

Leia mais

Programação de Sistemas (Sistemas de Programação) Semana 10, Aula 17

Programação de Sistemas (Sistemas de Programação) Semana 10, Aula 17 PCS3616 Programação de Sistemas (Sistemas de Programação) Semana 10, Aula 17 Linguagens e Compiladores Programação em linguagem de alto nível Escola Politécnica da Universidade de São Paulo Roteiro 1.

Leia mais

Programação de Computadores

Programação de Computadores Programação de Computadores Instituto de Computação UFF Departamento de Ciência da Computação Otton Teixeira da Silveira Filho Conteúdo Alguns Conceitos sobre Linguagens Conceito de Algoritmo Pseudocódigo

Leia mais

Tratamento dos Erros de Sintaxe. Adriano Maranhão

Tratamento dos Erros de Sintaxe. Adriano Maranhão Tratamento dos Erros de Sintaxe Adriano Maranhão Introdução Se um compilador tivesse que processar somente programas corretos, seu projeto e sua implementação seriam grandemente simplificados. Mas os programadores

Leia mais

Introdução. Tradutores de Linguagens de Programação

Introdução. Tradutores de Linguagens de Programação Introdução Compiladores 1 Linguagens de programação são notações para se descrever computações para pessoas e para máquinas. Todo software executado em todos os computadores foi escrito em alguma linguagem

Leia mais

Programação I A Linguagem C. Prof. Carlos Alberto

Programação I A Linguagem C. Prof. Carlos Alberto Programação I A Linguagem C Prof. Carlos Alberto carlos.batista@facape.br carlos36_batista@yahoo.com.br 2 Origem A linguagem C foi desenvolvida em 1972, nos Laboratórios Bell, por Dennis Ritchie. Implementada

Leia mais

Programação de Computadores

Programação de Computadores Programação de Computadores Instituto de Computação UFF Departamento de Ciência da Computação Otton Teixeira da Silveira Filho Conteúdo Alguns Conceitos sobre Conceito de Algoritmo Pseudocódigo Tipos de

Leia mais

Linguagens de Programação

Linguagens de Programação Universidade Federal do Rio Grande do Norte Centro de Tecnologia Departamento de Computação e Automação Linguagens de Programação Professor Responsável: Luiz Affonso Henderson Guedes de Oliveira Prof.

Leia mais

INTRODUÇÃO AOS SISTEMAS LÓGICOS

INTRODUÇÃO AOS SISTEMAS LÓGICOS 1 INTRODUÇÃO AOS SISTEMAS LÓGICOS ÁREAS DE COMPUTAÇÃO PROF. ANDRÉ MONTEVECCHI PROFA. ANNA TOSTES 28/08/2011 Prof. André Montevecchi / Profa. Anna Tostes 2 SUMÁRIO Os Pilares da Computação Algoritmos Teoria

Leia mais

ORGANIZAÇÃO DE COMPUTADORES

ORGANIZAÇÃO DE COMPUTADORES ORGANIZAÇÃO DE COMPUTADORES AULA 03 PROFº RITIELLE SOUZA DISTRIBUIÇÃO LÓGICA DISTRIBUIÇÃO LÓGICA Arquitetura de Von Neumann Uma unidade central de processamento recebe informações através de uma unidade

Leia mais

1.1 Linguagens de Programação

1.1 Linguagens de Programação Fundamentos Procurando fazer com que haja uma melhor compreensão para o estudo e desenvolvimento utilizando linguagens de programação, este capítulo apresenta conceitos básicos sobre como um programa pode

Leia mais

Linguagens de Programação Aula 3

Linguagens de Programação Aula 3 Aula 3 Celso Olivete Júnior olivete@fct.unesp.br Na aula passada... Classificação das LPs (nível, geração e paradigma) Paradigmas Imperativo, OO, funcional, lógico e concorrente 2/33 Na aula de hoje...

Leia mais

Computadores podem ser úteis em problemas que envolvem: Grande número de dados. Grande número de cálculos. Complexidade. Precisão.

Computadores podem ser úteis em problemas que envolvem: Grande número de dados. Grande número de cálculos. Complexidade. Precisão. O uso do computador Computadores podem ser úteis em problemas que envolvem: Grande número de dados. Grande número de cálculos. Complexidade. Precisão. Exemplos: Modelos meteorológicos. Cálculo estrutural.

Leia mais

Linguagens Formais e Autômatos P. Blauth Menezes

Linguagens Formais e Autômatos P. Blauth Menezes Linguagens Formais e Autômatos P. Blauth Menezes blauth@inf.ufrgs.br Departamento de Informática Teórica Instituto de Informática / UFRGS Matemática Discreta para Ciência da Computação - P. Blauth Menezes

Leia mais

COMPUTADORES COM UM CONJUNTO REDUZIDO DE INSTRUÇÕES. Adão de Melo Neto

COMPUTADORES COM UM CONJUNTO REDUZIDO DE INSTRUÇÕES. Adão de Melo Neto COMPUTADORES COM UM CONJUNTO REDUZIDO DE INSTRUÇÕES Adão de Melo Neto 1 INTRODUÇÃO Desde 1950, houveram poucas inovações significativas nas áreas de arquitetura e organização de computadores. As principais

Leia mais

Linguagens e Compiladores

Linguagens e Compiladores Linguagens e Compiladores Aula 1: a) Critérios b) Noções de Compiladores e Interpretadores c) Usos da tecnologia de compilação d) Compiladores, filtros e pré-processadores e) Estruturação lógica de compiladores

Leia mais

Informática I. Aula 14. Aula 14-10/10/2007 1

Informática I. Aula 14.  Aula 14-10/10/2007 1 Informática I Aula 14 http://www.ic.uff.br/~bianca/informatica1/ Aula 14-10/10/2007 1 Ementa Noções Básicas de Computação (Hardware, Software e Internet) HTML e Páginas Web Internet e a Web Javascript

Leia mais

Sintaxe e Semântica. George Darmiton da Cunha Cavalcanti.

Sintaxe e Semântica. George Darmiton da Cunha Cavalcanti. Sintaxe e Semântica George Darmiton da Cunha Cavalcanti (gdcc@cin.ufpe.br) Tópicos Introdução O problema de descrever a sintaxe Métodos formais para descrever a sintaxe Gramáticas de atributos Descrevendo

Leia mais

4) Defina o que vem a ser um algoritmo, e porque, o mesmo depende do processo.

4) Defina o que vem a ser um algoritmo, e porque, o mesmo depende do processo. Lista de Exercício 1 Algoritmo e Programação 29/08/2018 (Solução) 1) Escreva conforme a premissas computacionais, o que vem a ser, lógica. R: São as premissas básicas para se executar instruções, alocadas

Leia mais

Programação I Apresentação

Programação I Apresentação Programação I Apresentação Prof. Carlos Alberto carlos.batista@facape.br carlos36_batista@yahoo.com.br Referências JUNIOR, D. P.; NAKAMITI, G. S.; ENGELBRECHT, A. de M. E.; BIANCHI, F. Algoritmos e Programação

Leia mais

Análise Sintática. Fabiano Baldo

Análise Sintática. Fabiano Baldo Compiladores Análise Sintática Fabiano Baldo Gramáticas Livre de Contexto (GLC) É utilizada na especificação formal lda sintaxe de uma linguagem de programação. É um conjunto de produções ou regras gramaticais

Leia mais

Aula 5 Oficina de Programação Introdução ao C. Profa. Elaine Faria UFU

Aula 5 Oficina de Programação Introdução ao C. Profa. Elaine Faria UFU Aula 5 Oficina de Programação Introdução ao C Profa. Elaine Faria UFU - 2017 Linguagem de Programação Para que o computador consiga ler um programa e entender o que fazer, este programa deve ser escrito

Leia mais

Prof. Antonio Almeida de Barros Jr. Prof. Antonio Almeida de Barros Junior

Prof. Antonio Almeida de Barros Jr. Prof. Antonio Almeida de Barros Junior Prof. Antonio Almeida de Barros Jr. Prof. Antonio Almeida de Barros Junior Meio pelo qual se pode indicar os passos que devem ser realizados pelo computador para resolver problemas; Através da linguagem,

Leia mais

Introdução à Programação

Introdução à Programação Introdução à Programação Aula 02 Algoritmos e Ciclo de Desenvolvimento Edirlei Soares de Lima Modelo de um Computador Linguagem de Máquina Um processador executa instruções de máquina.

Leia mais

REUSO E REUSABILIDADE

REUSO E REUSABILIDADE REUSO E REUSABILIDADE Manutenção de Software Profa. Cynthia Pinheiro Antes de mais nada... 2ª Lista de Exercícios Já está disponível no site a 2ª Lista de Exercícios Entrega: dia 03/10, no horário da aula.

Leia mais

16. Compilação no Linux

16. Compilação no Linux 16. Compilação no Linux 16.1 Compilador X Interpretador Um código fonte pode ser compilado ou interpretado. Compiladores e interpretadores tratam o código de maneira diferente. Interpretador: Lê o código

Leia mais