CONCEITOS DE LINGUAGENS DE PROGRAMAÇÃO NONA EDIÇÃO R O B E R T W. S E B E S TA ROBERT W. SEBESTA Tradução técnica: Eduardo Kessler Piveta Doutor em Ciência da Computação – UFRGS Professor Adjunto da Universidade Federal de Santa Maria – UFSM Versão impressa desta obra: 2011 2011 Obra originalmente publicada sob o título Concepts of Programming Languages, 9th Edition ISBN 9780136073475 Authorized translation from the English language edition, entitled CONCEPTS OF PROGRAMMING LANGUAGES, 9th Edition, by ROBERT SEBESTA, published by Pearson Education,Inc., publishing as Addison-Wesley, Copyright © 2010. All rights reserved. No part of this book may be reproduced or trans- mitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from Pearson Education,Inc. Portuguese language edition published by Bookman Companhia Editora Ltda, a Division of Artmed Editora SA, Copyright © 2010 Tradução autorizada a partir do original em língua inglesa da obra intitulada CONCEPTS OF PROGRAM- MING LANGUAGES, 9ª Edição, autoria de ROBERT SEBESTA, publicado por Pearson Education, Inc., sob o selo Addison-Wesley, Copyright © 2010. Todos os direitos reservados. Este livro não poderá ser re- produzido nem em parte nem na íntegra, nem ter partes ou sua íntegra armazenado em qualquer meio, seja mecânico ou eletrônico, inclusive fotoreprografação, sem permissão da Pearson Education,Inc. A edição em língua portuguesa desta obra é publicada por Bookman Companhia Editora Ltda, uma divisão da Artmed Editora SA, Copyright © 2010 Capa: Rogério Grilho, arte sobre capa original Leitura fi nal: Mirella Nascimento Editora Sênior: Denise Weber Nowaczyk Editora responsável por esta obra: Elisa Viali Projeto e editoração: Techbooks Reservados todos os direitos de publicação, em língua portuguesa, à ARTMED® EDITORA S. A. (BOOKMAN® COMPANHIA EDITORA é uma divisão da ARTMED® EDITORA S.A.) Av. Jerônimo de Ornelas, 670 - Santana 90040-340 Porto Alegre RS Fone (51) 3027-7000 Fax (51) 3027-7070 É proibida a duplicação ou reprodução deste volume, no todo ou em parte, sob quaisquer formas ou por quaisquer meios (eletrônico, mecânico, gravação, fotocópia, distribuição na Web e outros), sem permissão expressa da Editora. SÃO PAULO Av. Embaixador Macedo Soares, 10.735 - Pavilhão 5 - Cond. Espace Center Vila Anastácio 05095-035 São Paulo SP Fone (11) 3665-1100 Fax (11) 3667-1333 SAC 0800 703-3444 IMPRESSO NO BRASIL PRINTED IN BRAZIL O AUTOR Robert Sebesta é Professor Associado Emérito no Departamento de Ciência da Computação da Universidade do Colorado – Colorado Springs. Tem bacharelado em Matemática Aplicada pela Universidade de Colorado em Boulder e mestrado e doutorado (PhD) em Ciência da Computação pela Universidade Estadual da Pensilvânia. Ele ensina ciência da computação há mais de 38 anos. Seus interesses profissionais são o projeto e a avaliação de linguagens de programação, projeto de compiladores e métodos e ferramentas de testes de software. S443c Sebesta, Robert W. Conceitos de linguagens de programação [recurso eletrônico] / Robert W. Sebesta; tradução técnica: Eduardo Kessler Piveta. – 9. ed. – Dados eletrônicos. – Porto Alegre : Bookman, 2011. Editado também como livro impresso em 2011. ISBN 978-85-7780-862-5 1. Ciência da computação. 2. Linguagens de programação de computador. I. Título. CDU 004.43 Catalogação na publicação: Ana Paula M. Magnus – CRB 10/2052 Prefácio MUDANÇAS PARA A NONA EDIÇÃO Os objetivos, a estrutura geral e a abordagem desta nona edição de Conceitos de Linguagens de Programação permanecem as mesmas das oito anteriores. Os objetivos principais são introduzir as construções mais importantes das lin- guagens de programação contemporâneas e fornecer ao leitor as ferramen- tas necessárias para a avaliação crítica de linguagens existentes e futuras. Um objetivo adicional é preparar o leitor para o estudo de projeto de compilado- res, apresentando um método formal de descrição de sintaxe e introduzindo abordagens para as análises sintática e léxica. Para manter a atualidade do conteúdo, algumas das discussões acerca de linguagens de programação mais antigas foram substituídas por material de linguagens mais recentes na nona edição. Por exemplo, no Capítulo 6, foram adicionadas discussões acerca dos tipos tabela em Lua, das tuplas e das compreensões de lista de Python, e das fatias em Ruby. Algum material mais antigo foi removido do Capítulo 7, diminuindo-o em duas páginas. A seção sobre o modelo de objetos de JavaScript foi removida do Capítulo 11. Em alguns casos, o material foi movido. Por exemplo, três seções do Capítulo 5 foram para o Capítulo 6, cujo tópico trata de tipos de dados. Em algumas seções, o material foi expandido. No Capítulo 4, por exemplo, o código do analisador léxico foi expandido para um programa completo, e uma saída real dele foi incluída. A seção sobre escopo no Capítulo 5 foi expandida com subseções sobre escopo global e ordem de declaração. A discussão dos tipos de dados abstratos no Capítulo 11 foi revisada e au- mentada. No Capítulo 15, uma seção sobre recursão em cauda em Scheme foi adicionada. No Capítulo 3, a introdução à semântica foi revisada e as subseções foram reordenadas. Além disso, pequenas mudanças foram feitas em diversas seções do livro, principalmente para melhorar a clareza. Por fim, mais de 50 problemas e exercícios de programação, além de mais de cem questões de revisão, foram adicionados à obra. A VISÃO Este livro descreve os conceitos fundamentais de linguagens de programação ao discutir as questões de projeto de diversas construções de linguagens, exa- minando as escolhas para essas construções em algumas das linguagens mais comuns e comparando criticamente alternativas de projeto. vi Prefácio Qualquer estudo sério sobre linguagens de programação requer um exa- me de alguns tópicos relacionados, dentre os quais estão os métodos de des- crição de sintaxe e de semântica, tratados no Capítulo 3. Além disso, técnicas de implementação para várias construções de linguagem devem ser conside- radas: as análises léxica e sintática são discutidas no Capítulo 4, e a implemen- tação da ligação de subprogramas é assunto do Capítulo 10. A implementação de outras construções de linguagem é discutida em outras partes do livro. Os parágrafos a seguir descrevem o conteúdo da nona edição. DESCRIÇÃO DOS CAPÍTULOS O Capítulo 1 começa com uma discussão sobre por que estudar linguagens de programação. Ele então discute os critérios usados para avaliar linguagens e construções de linguagem. A influência primária no projeto de linguagens, alguns compromissos comuns de projeto e as abordagens básicas para a imple- mentação também são examinadas. O Capítulo 2 descreve a evolução da maioria das linguagens impor- tantes discutidas neste livro. Apesar de nenhuma delas ser descrita comple- tamente, as origens, os propósitos e as contribuições de cada uma são discu- tidos. Essa visão histórica é valiosa, porque fornece o conhecimento neces- sário para entender as bases teóricas e práticas do projeto contemporâneo de linguagens. Também motiva o estudo adicional do projeto e da avaliação de linguagens. E, já que nenhum dos capítulos restantes depende do Capítulo 2, ele pode ser lido independentemente. O Capítulo 3 mostra o modelo formal primário para descrever a sintaxe de linguagens de programação – BNF. Esse é seguido por uma apresentação das gramáticas de atributos, que descrevem tanto a sintaxe quanto a semântica estática de linguagens. A difícil tarefa da descrição semântica é então explora- da, incluindo breves introduções para os três métodos mais comuns: semânti- ca operacional, denotacional e axiomática. O Capítulo 4 introduz as análises léxica e sintática. Esse capítulo é volta- do para as faculdades que não mais requerem um curso de projeto de compila- dores em seu currículo. Como o Capítulo 2, pode ser lido independentemente do restante do livro. Os Capítulos 5 a 14 descrevem em detalhes as questões de projeto para as construções primárias das linguagens imperativas. Em cada um dos casos, as escolhas de projeto para diversas linguagens de exemplo são apresentadas e avaliadas. Especificamente, o Capítulo 5 cobre as muitas características das variáveis, o Capítulo 6 mostra os tipos de dados, e o Capítulo 7 explica as ex- pressões e as sentenças de atribuição. O Capítulo 8 descreve as sentenças de controle, e os Capítulos 9 e 10 discutem os subprogramas e suas implementa- ções. O Capítulo 11 examina os recursos de abstração de dados. O Capítulo 12 fornece uma discussão aprofundada dos recursos de lin- guagem que suportam a programação orientada a objetos (herança e vincu- lação dinâmica de métodos), o Capítulo 13 discute as unidades de programa Prefácio vii concorrentes, e o Capítulo 14 fala sobre o tratamento de exceções, com uma breve discussão sobre o tratamento de eventos. Os dois últimos capítulos (15 e 16) descrevem dois dos paradigmas de programação mais importantes: a programação funcional e a programação ló- gica. O Capítulo 15 apresenta uma introdução à linguagem Scheme, incluindo descrições de algumas de suas funções primitivas, formas especiais e formas funcionais, além de alguns exemplos de funções simples escritas em Scheme. Introduções breves a ML e a Haskell são dadas para ilustrar alguns tipos dife- rentes de linguagens funcionais. O Capítulo 16 introduz a programação lógica e a linguagem Prolog. PARA O INSTRUTOR No curso inicial de linguagens de programação na Universidade do Colorado, em Colorado Springs, o livro é usado da seguinte forma: cobrimos os Capítulos 1 e 3 em detalhes, e – apesar de os estudantes acharem interessante e de leitura benéfica – o Capítulo 2 recebe pouco tempo de aula devido à falta de conteúdo altamente técnico. Como nenhum material nos capítulos subsequentes depende do Capítulo 2, ele pode ser ignorado completamente. E, já que requeremos um curso de projeto de compiladores, o Capítulo 4 não é tratado. Os Capítulos 5 a 9 devem ser relativamente fáceis para estudantes com extensa experiência em programação em C++, Java ou C#. Os Capítulos 10 a 14 são mais desafiadores e requerem aulas mais detalhadas. Os Capítulos 15 e 16 são inteiramente novos para a maioria dos estu- dantes principiantes. Idealmente, processadores de linguagem para Scheme e Prolog devem estar disponíveis para que os estudantes possam aprender o material nesses capítulos. É incluído material suficiente para permitir que os estudantes lidem com alguns programas simples. Cursos de graduação provavelmente não serão capazes de cobrir todo o conteúdo dos últimos dois capítulos. Cursos de pós-graduação, entretanto, devem conseguir discutir completamente o material pulando partes dos pri- meiros capítulos acerca de linguagens imperativas. MATERIAIS SUPLEMENTARES Os seguintes suplementos estão disponíveis para os leitores deste livro em www.bookman.com.br. • Um conjunto de slides (em português) com notas de aulas. Slides em Power Point estão disponíveis para cada um dos capítulos do livro. • Slides em Power Point contendo todas as figuras do livro (em português). Para acessar os recursos, procure pelo livro no site www.bookman.com.br e clique em Conteúdo Online. viii Prefácio Soluções para muitos dos conjuntos de problemas (em inglês) estão dis- poníveis para instrutores qualificados na nossa Área do Professor. Para aces- sar os materiais procure pelo livro em www.bookman.com.br e clique em Material para professores. Faça o seu cadastro de professor no site, caso ainda não tenha, para receber uma senha de acesso ao material. Disponibilidade de processador de linguagem Processadores e informações acerca de algumas das linguagens de programa- ção discutidas neste livro podem ser encontrados nestes sites: C, C++, Fortran e Ada gcc.gnu.org C# microsoft.com Java java.sun.com Haskell haskell.org Lua www.lua.org Scheme www.plt-scheme.org/software/drscheme Perl www.perl.com Python www.python.org Ruby www.ruby-lang.org JavaScript está inclusa em praticamente todos os navegadores; PHP está in- cluso em praticamente todos os servidores Web. Todas essas informações também estão incluídas no site do livro, em www.aw-bc.com/sebesta. AGRADECIMENTOS As sugestões de revisores magníficos contribuíram muito para a forma atual deste livro. Em ordem alfabética de sobrenomes, são eles: I-ping Chu Universidade DePaul Amer Diwan Universidade do Colorado Stephen Edwards Virginia Tech Nigel Gwee Southern University – Baton Rouge K. N. King Universidade Estadual da Geórgia Donald Kraft Universidade Estadual da Louisiana Simon H. Lin Universidade Estadual da Califórnia – Northridge Mark Llewellyn Universidade da Flórida Central Bruce R. Maxim Universidade de Michigan – Dearborn Gloria Melara U niversidade Estadual da Califórnia – Northridge Frank J. Mitropoulos Nova Universidade de Southeastern Euripides Montagne Universidade da Flórida Central Bob Neufeld Universidade Estadual de Wichita Amar Raheja Universidade Politécnica do Estado da Califórnia – Pomona Hossein Saiedian Universidade de Kansas Neelam Soundarajan Universidade Estadual de Ohio