Buscar

sebesta 9ed_Linguagem_Programacao

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 796 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 796 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 796 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Capítulo 1
Aspectos Preliminares
Conceitos de Linguagens de Programação – Robert W. Sebesta
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 linguagens
• Categorias de linguagens
• Trade-offs no projeto de linguagens
• Métodos de implementação
• Ambientes de programação
Conceitos de Linguagens de Programação – Robert W. Sebesta
Razões para estudar conceitos 
de linguagens de programação
• Capacidade aumentada para expressar ideias
• Embasamento melhorado para escolher linguagens apropriadas
• Habilidade aumentada para aprender novas linguagens
• Melhor entendimento da importância da implementação
• Melhor uso de linguagens já conhecidas
• Avanço geral da computação
Conceitos de Linguagens de Programação – Robert W. Sebesta
Domínios de programação
• Aplicações científicas
– Grande número de computações de aritmética de ponto flutuante; uso de matrizes
– Fortran
• Aplicações empresariais
– Produz relatório, usa números decimais e caracteres
– COBOL
• Inteligência artificial
– Símbolos em vez de números manipulados; uso de listas ligadas
– LISP
• Programação de sistemas
– Precisa de eficiência por causa do uso contínuo
– C
• Software para a Web
– Eclética coleção de linguagens: de marcação (como XHTML), de scripting (como PHP), 
de propósito geral (como Java)
Conceitos de Linguagens de Programação – Robert W. Sebesta
Critérios de avaliação de linguagens
• Legibilidade: facilidade com a qual os programas podem ser lidos e 
entendidos
• Facilidade de escrita: facilidade com a qual uma linguagem pode ser 
usada para criar programas para um dado domínio
• Confiabilidade: conformidade com as especificações
• Custo: o custo total definitivo de uma linguagem
Conceitos de Linguagens de Programação – Robert W. Sebesta
Critério de avalição: legibilidade
• Simplicidade geral
– Um conjunto controlável de recursos e construções
– Mínima multiplicidade de recursos
– Mínima sobrecarga de operadores
• Ortogonalidade
– Um conjunto relativamente pequeno de construções primitivas pode ser combinado a 
um número relativamente pequeno de formas
– Cada possível combinação é legal
• Tipos de dados
– Mecanismos adequados para definir tipos de dados
• Projeto da sintaxe
– Formato dos identificadores
– Palavras especiais e métodos de formar sentenças compostas
– Forma e significado: construções autodescritivas, palavras-chave significativas
Conceitos de Linguagens de Programação – Robert W. Sebesta
Critério de avaliação: facilidade de escrita
• Simplicidade e ortogonalidade
– Poucas construções, número pequeno de primitivas e um pequeno 
conjunto de regras para combiná-las
• Suporte à abstração
– A habilidade de definir e usar estruturas ou operações complicadas de 
forma a permitir que muitos dos detalhes sejam ignorados
• Expressividade
– Um conjunto de formas relativamente convenientes de especificar as 
operações
– Força e número de operadores e funções pré-definidas 
Conceitos de Linguagens de Programação – Robert W. Sebesta
Critério de avaliação: confiabilidade
• Verificação de tipos
– Testes para detectar erros de tipos
• Tratamento de exceções
– Interceptar erros em tempo de execução e tomar medidas corretivas
• Utilização de apelidos
– Nomes distintos que podem ser usados para acessar a mesma célula de 
memória
• Legibilidade e facilidade de escrita
– Uma linguagem que não oferece maneiras naturais para expressar os 
algoritmos requeridos irá necessariamente usar abordagens não naturais, 
reduzindo a confiabilidade
Conceitos de Linguagens de Programação – Robert W. Sebesta
Critério de avaliação: custo
• Treinar programadores para usar a linguagem
• Escrever programas (proximidade com o propósito da aplicação em 
particular)
• Compilar programas
• Executar programas
• Sistema de implementação da linguagem: disponibilidade de 
compiladores gratuitos
• Confiabilidade baixa leva a custos altos
• Manter programas
Conceitos de Linguagens de Programação – Robert W. Sebesta
Critério de avaliação: outros
• Portabilidade
– A facilidade com a qual os programas podem ser movidos de uma 
implementação para outra
• Generalidade
– A aplicabilidade a uma ampla faixa de aplicações
• Bem definida
– Em relação à completude e à precisão do documento oficial que define a 
linguagem
Conceitos de Linguagens de Programação – Robert W. Sebesta
Influências no projeto de linguagens
• Arquitetura de computadores
– Linguagens são projetadas considerando a principal arquitetura de 
computadores, chamada de arquitetura de von Neumann
• Metodologias de projeto de programas
– Novas metodologias de desenvolvimento de software (por exemplo, 
desenvolvimento de software orientado a objeto) levaram a novos 
paradigmas de programação e, por extensão, a novas linguagens de 
programação
Conceitos de Linguagens de Programação – Robert W. Sebesta
Influências na arquitetura de computadores
• Principal arquitetura de computadores: von Neumann 
• Linguagens imperativas, mais populares, por causa dos computadores 
von Neumann
– Dados e programas armazenados na memória
– A memória é separada da CPU
– Instruções e dados são canalizadas a partir da memória para CPU
– Base para linguagens imperativas
• Variáveis modelam as células de memória
• Sentenças de atribuição são baseadas na operação de envio de dados 
e instruções
• Iteração é eficiente
Conceitos de Linguagens de Programação – Robert W. Sebesta
Arquitetura Von Neumann
Conceitos de Linguagens de Programação – Robert W. Sebesta
Arquitetura Von Neumann
• Ciclo de obtenção e execução (em um computador com arquitetura 
von Neumann)
inicialize o contador de programa
repita para sempre
obtenha a instrução apontada pelo contador de programa
incremente o contador de programa
decodifique a instrução
execute a instrução
fim repita
Conceitos de Linguagens de Programação – Robert W. Sebesta
Influências na metodologia de programa
• Anos 1950 e começo dos 1960: Aplicações simples; preocupação com 
a eficiência da máquina
• Final dos anos 60: Eficiência das pessoas se tornou importante; 
legibilidade, melhores estruturas de controle
– Programação estruturada
– Projeto descendente (top-down) e de refinamento passo a passo
• Final dos anos 70: Da orientação aos procedimentos para uma 
orientação aos dados 
– Abstração de dados
• Meio dos anos 80: Programação orientada a objetos
– Abstração de dados + herança + vinculação dinâmica de métodos
Conceitos de Linguagens de Programação – Robert W. Sebesta
Categorias de linguagens
• Imperativa
– Características centrais são variáveis, sentenças de atribuição e de iteração
– Inclui linguagens que suportam programação orientada a objeto
– Inclui linguagens de scripting
– Inclui as linguagens visuais
– Exemplos: C, Java, Perl, JavaScript, Visual BASIC .NET, C++
• Funcional
– Principais meios de fazer os cálculos é pela aplicação de funções para determinados 
parâmetros
– Exemplos: LISP, Scheme
• Lógica
– Baseada em regras (regras são especificadas sem uma ordem em particular)
– Example: Prolog
• De marcação/programação híbrida 
– Linguagens de marcação estendida para suportar alguma programação
– Exemplos: JSTL, XSLT
Conceitos de Linguagens de Programação – Robert W. Sebesta
Trade-Offs no projeto de linguagens
• Confiabilidade x custo de execução
– Exemplo: Java exige que todas as referências aos elementos de um vetor 
sejam verificadas para garantir que os índices estão em suas faixas legais
• Legibilidade x facilidade de escrita
– Exemplo: APL inclui um poderoso conjunto de operadores (e um grande 
número de novos símbolos), permitindo que computações complexas 
sejam escritas em um programa compacto, com o custo de baixa 
legibilidade
• Facilidade de escrita (flexibilidade) x confiabilidade
– Exemplo: Ponteiros de C++ são poderosos e flexíveis, mas não são 
confiáveis
Conceitos de Linguagens de Programação – Robert W. SebestaMétodos de implementação
• Compilação
– Programas são traduzidos para linguagem de máquina
• Interpretação pura
– Programas são interpretados por outro programa chamado interpretador
• Sistemas de implementação híbridos
– Um meio termo entre os compiladores e os interpretadores puros
Conceitos de Linguagens de Programação – Robert W. Sebesta
Visão em camadas de um computador
O Sistema operacional e as 
implementações de 
linguagem são colocados 
em camadas superiores à 
interface de linguagem de 
máquina de um 
computador
Conceitos de Linguagens de Programação – Robert W. Sebesta
Compilação
• Traduz programas (linguagem de fonte) em código de máquina 
(linguagem de máquina)
• Tradução lenta, execução rápida
• Processo de compilação tem várias fases: 
– análise léxica: agrupa os caracteres do programa fonte em unidades 
léxicas
– análise sintática: transforma unidades léxicas em árvores de análise 
sintática (parse trees), que representam a estrutura sintática do programa
– análise semântica: gera código intermediário
– geração de código: código de máquina é gerado
Conceitos de Linguagens de Programação – Robert W. Sebesta
O processo de compilação
Conceitos de Linguagens de Programação – Robert W. Sebesta
Terminologias de compilação adicionais
• Módulo de carga (imagem executável): o código de usuário e de 
sistema juntos
• Ligação e carga: o processo de coletar programas de sistema e ligá-los 
aos programas de usuário
Conceitos de Linguagens de Programação – Robert W. Sebesta
Gargalo de Von Neumann
• A velocidade de conexão entre a memória de um computador e seu 
processador determina a velocidade do computador
• Instruções de programa normalmente podem ser executadas mais 
rapidamente do que a velocidade de conexão, o que resulta em um 
gargalo
• Conhecido como gargalo de von Neumann; é o fator limitante primário 
na velocidade dos computadores
Conceitos de Linguagens de Programação – Robert W. Sebesta
Interpretação pura
• Sem tradução
• Fácil implementação de programas (mensagens de erro em tempo de 
execução podem referenciar unidades de código fonte)
• Execução mais lenta (tempo de execução de 10 a 100 vezes mais lento 
do que nos sistemas compilados)
• Geralmente requer mais espaço
• Raramente usada em linguagens de alto nível
• Volta significativa com algumas linguagens de scripting para a Web 
(como JavaScript e PHP)
Conceitos de Linguagens de Programação – Robert W. Sebesta
Processo de interpretação pura
Conceitos de Linguagens de Programação – Robert W. Sebesta
Sistemas de implementação híbridos
• Um meio termo entre os compiladores e os interpretadores puros
• Uma linguagem de alto nível é traduzida para uma linguagem 
intermediária que permite fácil interpretação
• Mais rápido do que interpretação pura
• Exemplos
– Programas em Perl eram parcialmente compilados para detectar erros 
antes da interpretação
– As primeiras implementações de Java eram todas híbridas; seu formato 
intermediário, byte code, fornece portabilidade para qualquer máquina que 
tenha um interpretador de bytecodes e um sistema de tempo de execução 
associado (juntos, são chamados de Máquina Virtual Java)
Conceitos de Linguagens de Programação – Robert W. Sebesta
Sistema de implementação híbrido
Conceitos de Linguagens de Programação – Robert W. Sebesta
Sistemas de implementação Just-in-Time
• Inicialmente traduz os programas para uma linguagem intermediária
• Então, compila os métodos da linguagem intermediária para linguagem 
de máquina quando esses são chamados
• A versão em código de máquina é mantida para chamadas 
subsequentes
• Sistemas JIT são agora usados amplamente para programas Java
• As linguagens .NET também são implementadas com um sistema JIT
Conceitos de Linguagens de Programação – Robert W. Sebesta
Pré-processadores
• As instruções de pré-processador são comumente usadas para 
especificar que o código de outro arquivo deve ser incluído
• Um pré-processador é um programa que processa um programa 
imediatamente antes de o programa ser compilado para expandir 
macros embutidos
• Um exemplo conhecido: pré-processador de C
– expande #include, #define e macros similares
Conceitos de Linguagens de Programação – Robert W. Sebesta
Ambientes de programação
• Coleção de ferramentas usadas no desenvolvimento de software
• UNIX
– Um ambiente de programação mais antigo
– Agora bastante usado por meio de uma interface gráfica com o usuário 
(GUI) que roda sobre o UNIX
• Microsoft Visual Studio .NET
– Grande e complexo
• Usado para desenvolver software em qualquer uma das cinco 
linguagens .NET
• NetBeans
– Usado primariamente para o desenvolvimento de aplicações Web usando 
Java, mas também oferece suporte a JavaScript, Ruby e PHP
Conceitos de Linguagens de Programação – Robert W. Sebesta
Resumo
• O estudo de linguagens de programação é valioso por diversas razões:
– Aumenta nossa capacidade de usar diferentes construções ao escrever 
programas
– Permite que escolhamos linguagens para os projetos de forma mais 
inteligente
– Torna mais fácil o aprendizado de novas linguagens
• Critérios mais importantes para a avaliação de linguagens:
– Legibilidade, facilidade de escrita, confiabilidade e custo geral
• As principais influências no projeto de linguagens são a arquitetura de 
máquina e as metodologias de projeto de software
• Os principais métodos de implementar linguagens de programação são 
a compilação, a interpretação pura e a implementação híbrida
Capítulo 2
Evolução das Principais 
Linguagens 
de Programação
Conceitos de Linguagens de Programação – Robert W. Sebesta
Tópicos do Capítulo 2
• Plankalkül de Zuse
• Programação de hardware mínima: pseudocódigos
• O IBM 704 e Fortran
• Programação funcional: LISP
• O primeiro passo em direção à sofisticação: ALGOL 60
• Informatizando os registros comerciais: COBOL
• O início do compartilhamento de tempo: BASIC
Conceitos de Linguagens de Programação – Robert W. Sebesta
Tópicos do Capítulo 2
• Tudo para todos: PL/I
• Duas das primeiras linguagens dinâmicas: APL e SNOBOL
• O início da abstração de dados: SIMULA 67
• Projeto ortogonal: ALGOL 68
• Alguns dos primeiros descendentes dos ALGOLs
• Programação baseada em lógica: Prolog
• O maior esforço de projeto da história: Ada
Conceitos de Linguagens de Programação – Robert W. Sebesta
Tópicos do Capítulo 2
• Programação orientada a objetos: Smalltalk
• Combinando recursos imperativos e orientados a objetos: C++
• Uma linguagem orientada a objetos baseada no paradigma imperativo: 
Java
• Linguagens de scripting
• Uma linguagem baseada em C para o novo milênio: C#
• Linguagens híbridas de marcação/programação
Conceitos de Linguagens de Programação – Robert W. Sebesta
Genealogia das principais linguagens 
de programação
Conceitos de Linguagens de Programação – Robert W. Sebesta
Plankalkül de Zuse
• Desenvolvida em 1945, mas não publicada até 1972
• Nunca foi implementada
• Estruturas de dados avançadas
– Ponto flutuante, vetores, registros
• Invariante
Conceitos de Linguagens de Programação – Robert W. Sebesta
Sintaxe de Plankalkül
• Uma sentença de atribuição que atribui o valor da expressão A[4] + 1 
para A[5]
| A + 1 => A
V | 4 5 (índices)
S | 1.n 1.n (tipos de dados)
Conceitos de Linguagens de Programação – Robert W. Sebesta
Programação de Hardware Mínima: 
Pseudocódigos
• O que estava errado ao usar código de máquina?
– Baixa legibilidade
– Modificações de programas tediosas e passíveis de erros
– Deficiências de máquina – sem indexação ou ponto-flutuante
Conceitos de Linguagens de Programação – Robert W. Sebesta
Pseudocódigos: Short Code 
• Short Code foi desenvolvida por John Mauchly em 1949 para o 
computador BINAC
– Expressões foram codificadas
– Exemplo de operações:
01 – 06 abs value 1n (n+2)nd power
02 ) 07 + 2n (n+2)nd root
03 = 08 pause 4n if <= n
04 / 09 ( 58 print and tab
Conceitos de Linguagens de Programação – RobertW. Sebesta
Pseudocódigos: Speedcoding
• Speedcoding foi desenvolvido por John Backus em 1954 para 
o IBM 701
– Pseudoinstruções para operações aritméticas e funções matemáticas
– Desvios condicionais e incondicionais
– Facilidade para incrementar os registradores de endereço 
automaticamente
– Memória usável restante após carregar o interpretador de apenas 700 
palavras
Conceitos de Linguagens de Programação – Robert W. Sebesta
Pseudocódigos: Related Systems
• O sistema de “compilação” da UNIVAC
– Devenvolvido por uma equipe liderada por Grace Hopper
– Pseudocódigo expandido em código de máquina
• David J. Wheeler (Universidade de Cambridge) 
– desenvolveu um método de usar blocos de endereços realocáveis para 
resolver parcialmente o problema do endereçamento absoluto
Conceitos de Linguagens de Programação – Robert W. Sebesta
IBM 704 e Fortran
• Fortran 0: 1954 – não implementado
• Fortran I: 1957
– Desenvolvido para o IBM 704, que tinha registros de indexação e 
hardware de ponto-flutuante
– Levou à ideia de linguagens de programação compiladas, porque não 
havia o esconderijo para o custo da interpretação
– Ambiente de desenvolvimento
• Computadores com memórias pequenas e não confiáveis
• Aplicações eram científicas
• Não havia maneiras eficientes de programar computadores
• Velocidade do código objeto era o objetivo principal
Conceitos de Linguagens de Programação – Robert W. Sebesta
Processo de projeto do Fortran
• Impacto do ambiente no processo do Fortran I
– Não há necessidade de armazenamento dinâmico
– Precisa de boa manipulação de vetores e sentenças de repetição
– Sem manipulação de cadeias, aritmética decimal ou sentenças de entrada 
e saída (para aplicações de negócios)
Conceitos de Linguagens de Programação – Robert W. Sebesta
Visão geral de Fortran I
• Primeira versão implementada do Fortran
– Nomes de variáveis podem ter até seis caracteres
– Sentença de repetição (DO)
– Formatação de entrada e saída
– Sub-rotinas definidas pelos usuários
– Sentença de seleção IF
Conceitos de Linguagens de Programação – Robert W. Sebesta
Visão geral de Fortran I
• Primeira versão implementada do FORTRAN 
– Sem compilação separada
– Compilador lançado em abril de 1957, depois de 18 anos de trabalho
– Programas com mais de 400 linhas raramente são compilados 
corretamente, especialmente devido à pouca confiabilidade do 704
– O código era muito rápido
– Rapidamente se tornou amplamente usado
Conceitos de Linguagens de Programação – Robert W. Sebesta
Fortran II
• Distribuído em 1958
– Compilação independente
– Corrigiu falhas
Conceitos de Linguagens de Programação – Robert W. Sebesta
Fortran IV
• Evoluiu entre 1960-62
– Declarações de tipo explícitas
– Sentenças de controle de laços lógicos
– Nomes de subprogramas podem ser parâmetros
– Padrão ANSI em 1966
Conceitos de Linguagens de Programação – Robert W. Sebesta
Fortran 77
• Tornou-se o novo padrão em 1978
– Manipulação de caracteres de cadeias
– Sentenças de controle de laços lógicos
– Um If com uma cláusula opcional Else
Conceitos de Linguagens de Programação – Robert W. Sebesta
Fortran 90
• Drasticamente diferente do Fortran 77
– Módulos
– Vetores dinâmicos
– Ponteiros
– Registros
– Sentença CASE
– Parâmetro de verificação de tipo
Conceitos de Linguagens de Programação – Robert W. Sebesta
Últimas versões de Fortran
• Fortran 95 – apenas algumas mudanças
• Fortran 2003 - idem
Conceitos de Linguagens de Programação – Robert W. Sebesta
Avaliação de Fortran
• Compiladores altamente otimizados (todas as versões antes de 90)
– Tipos e armazenamento para todas as variáveis são fixados antes 
da execução
• Mudou drasticamente para sempre a forma como os computadores 
são usados
• Caracterizada como a língua franca do mundo da computação
Conceitos de Linguagens de Programação – Robert W. Sebesta
Programação funcional: LISP
• List Processing Language
– Projetada no MIT por McCarthy
• Pesquisa de inteligência artificial (IA) precisava de uma linguagem para
– Processar dados em listas (em vez de vetores)
– Computação simbólica (em vez de numérica)
• Apenas dois tipos de dados: átomos e listas
• Sintaxe é baseada em lambda calculus
Conceitos de Linguagens de Programação – Robert W. Sebesta
Representação interna de duas listas 
em LISP
Representando as listas (A B C D)
e (A (B C) D (E (F G)))
Conceitos de Linguagens de Programação – Robert W. Sebesta
Avaliação de LISP
• Pioneira na programação funcional
– Sem necessidade de variáveis ou atribuição 
– Controle por recursão e expressões condicionais
• Ainda a linguagem dominante em IA
• COMMON LISP e Scheme são dialetos contemporâneos de LISP
• ML, Miranda e Haskell são linguagens relacionadas
Conceitos de Linguagens de Programação – Robert W. Sebesta
Scheme
• Desenvolvida no MIT no meio dos anos 1970
• Pequena
• Uso de escopo estático
• Funções como entidades de primeira classe
• Sintaxe simples (e tamanho pequeno) o que a torna ideal para 
aplicações educacionais
Conceitos de Linguagens de Programação – Robert W. Sebesta
COMMON LISP
• Um esforço para para combinar características de diversos dialetos de 
LISP em uma só linguagem
• Grande, complexa
Conceitos de Linguagens de Programação – Robert W. Sebesta
O Primeiro Passo em Direção à Sofisticação: 
ALGOL 60
• Ambiente de desenvolvimento
– FORTRAN chegou (apenas) para IBM 700
– Várias outras linguagens foram desenvolvidas, todas para máquinas 
específicas
– Nenhuma linguagem portátil; todas eram dependentes das máquinas
– Nenhuma linguagem universal para comunicação de algoritmos
• ALGOL 60 foi o resultado dos esforços para criar uma linguagem 
universal
Conceitos de Linguagens de Programação – Robert W. Sebesta
Processo do projeto inicial
• ACM e GAMM se reuniram por quatro dias (De 27 de maio a 1º de 
junho de 1958)
• Objetivos da linguagem
– Ser o mais próxima possível da notação padrão matemática
– Boa para a descrição de algoritmos
– Ser traduzível em código de máquina
Conceitos de Linguagens de Programação – Robert W. Sebesta
ALGOL 58
• Formalizou conceito de tipo de dados
• Identificadores podiam ter qualquer tamanho
• O limite inferior dos vetores podia ser especificado pelo programador
• Parâmetros eram separados por modo
• Sentenças de seleção aninhadas eram permitidas
• Declarações compostas (begin ... end)
• Vírgula como separador de declarações
• Operador de atribuição era :=
• if tinha uma cláusula else-if
Conceitos de Linguagens de Programação – Robert W. Sebesta
Implementação do ALGOL 58
• Não pretendia ser um produto finalizado para implementação, mas 
variações dele foram (MAD, JOVIAL)
• Embora a IBM tenha sido inicialmente entusiasta, todo o suporte foi 
descontinuado em meados de 1959
Conceitos de Linguagens de Programação – Robert W. Sebesta
Visão geral do ALGOL 60
• Modificação do ALGOL 58 em seis dias de encontros em Paris
• Novos recursos
– Estrutura de bloco (escopo local)
– Duas formas diferentes de passagem de parâmetros a subprogramas
– Procedimentos recursivos
– Vetores dinâmicos na pilha
– Ainda sem sentenças de entrada e saída e sem manipulação de cadeias
Conceitos de Linguagens de Programação – Robert W. Sebesta
Avaliação do ALGOL 60
• Sucessos
– Única maneira formal aceitável de comunicar algoritmos por mais 
de 20 anos
– Todas as linguagens de programação imperativas desde 60 são 
baseadas nela
– Primeira linguagem independente de máquina 
– Primeira linguagem cuja sintaxe foi formalmente descrita (BNF)
Conceitos de Linguagens de Programação – Robert W. Sebesta
Avaliação do ALGOL 60
• Fracassos
– Nunca atingiu uso disseminado, especialmente nos Estados Unidos
– Motivos
• Entrada e saída dependentes fizeram com que os programas tivessem uma 
portabilidade ruim
• Muito flexível – difícil de implementar
• Forte estabelecimento do Fortran
• Descrição formal de sintaxe
• Falta de apoio da IBM
Conceitos de Linguagens de Programação – Robert W. Sebesta
Informatizando os Registros Comerciais:COBOL
• Ambiente de desenvolvimento
– UNIVAC estava começando a usar FLOW-MATIC
– USAF estava começando a usar AIMACO
– IBM estava desenvolvendo COMTRAN
Conceitos de Linguagens de Programação – Robert W. Sebesta
Perspectiva história do COBOL
• Baseado em FLOW-MATIC
• Características de FLOW-MATIC 
– Nomes com mais de 12 caracteres, com hifens
– Nomes em inglês para operações aritméticas (sem expressões 
aritméticas)
– Dados e código eram completamente separados
– A primeira palavra em cada sentença era um verbo
Conceitos de Linguagens de Programação – Robert W. Sebesta
O processo do projeto do COBOL
• Primeira reunião (no Pentágono) – Maio de 1959
• Objetivos
– Utlizar o inglês o máximo possível
– Ser fácil de usar, mesmo ao custo de ser menos poderosa
– Ampliar a base de usuários de computador
– Não ser orientada pelos problemas atuais do compilador
• Membros da comissão do projeto foram de fabricantes de 
computadores e membros do Departamento de Defesa Americano 
(DoD)
• Problemas de projeto: expressões aritméticas? subscripts? Disputas 
entre os fabricantes
Conceitos de Linguagens de Programação – Robert W. Sebesta
Avaliação do COBOL
• Contribuições
– Primeira construção para macros de uma linguagem de alto nível
– Estruturas de dados hierárquicas (registros)
– Sentenças de seleção aninhadas
– Nomes longos (até 30 caracteres), com hifens
– Divisão de dados
Conceitos de Linguagens de Programação – Robert W. Sebesta
COBOL: influência do DoD
• Primeira linguagem requerida pelo DoD
– Teria falhado sem o DoD
• Ainda assim, o idioma mais utilizado em aplicações de negócios
Conceitos de Linguagens de Programação – Robert W. Sebesta
O Início do compartilhamento de tempo: BASIC
• Projetado por Kemeny e Kurtz em Dartmouth
• Objetivos:
– Ser fácil para estudantes que não são de ciências básicas aprenderem 
– Ser prazerosa e amigável
– Agilizar os deveres de casa
– Permitir acesso livre e privado
– Considerar o tempo do usuário mais importante do que o tempo 
do computador
• Dialeto popular à época: Visual BASIC 
• Primeira linguagem amplamente utilizada com o tempo de 
compartilhamento
Conceitos de Linguagens de Programação – Robert W. Sebesta
Tudo para todos: PL/I
• Desenvolvida por IBM e SHARE
• Situação da computação em 1964 (do ponto de vista da IBM)
– Aplicação científica
• Computadores IBM 1620 e 7090
• FORTRAN
• Grupo de usuário SHARE
– Aplicação de negócios
• Computadores IBM 1401 e 7080
• COBOL
• Grupo de usuário GUIDE
Conceitos de Linguagens de Programação – Robert W. Sebesta
Perspectiva histórica
• Em 1963 
– Programadores científicos passaram a precisar de recursos mais 
elaborados de entrada e saída, como COBOL tinha; as aplicações de 
negócios precisavam de dados de ponto-flutuante e vetores para sistemas 
de informação de gerenciamento
– Começou a parecer que as instalações de computação logo precisariam 
de duas equipes técnicas e de computadores diferentes 
• A solução óbvia 
– Construir um novo computador para fazer os dois tipos de aplicações
– Projetar uma nova linguagem para as aplicações
Conceitos de Linguagens de Programação – Robert W. Sebesta
O processo de projeto
• Desenvolvido em cinco meses pelo Comitê 3 x 3
– Três membros da IBM, três membros do SHARE
• Projeto inicial
– Uma extensão do Fortran IV
• Inicialmente chamado de NPL (New Programming Language - Nova 
Linguagem de Programação)
• Nome mudado para PL/I em 1965
Conceitos de Linguagens de Programação – Robert W. Sebesta
Avaliação de PL/I
• Contribuições
– Permitido aos programas criar subprogramas executados 
concorrentemente
– Possível detectar e manipular exceções
– Permitida a utilização de subprogramas recursivamente
– Ponteiros foram incluídos como um tipo de dados
– Porções de uma matriz podiam ser referenciadas
• Preocupações
– Muitos dos novos recursos foram mal concebidos
– Muito grande e muito complexo
Conceitos de Linguagens de Programação – Robert W. Sebesta
Duas das primeiras linguagens dinâmicas: APL 
e SNOBOL
• Caracterizadas por tipagem dinâmica e alocação dinâmica de 
armazenamento
• Variáveis são essencialmente não tipadas
– Uma variável adquire um tipo quando é atribuído um valor a ela
• O armazenamento é alocado a uma variável apenas quando é atribuído 
um valor a ela
Conceitos de Linguagens de Programação – Robert W. Sebesta
APL: uma linguagem de programação
• Projetada na IBM por Ken Iverson, em torno de 1960, como uma 
linguagem para descrever arquiteturas de computadores
– Alta expressividade (grande número de operadores, grande número 
de operações unitárias em vetores)
– Programas difíceis de ler
• Ainda em uso; mudanças mínimas
Conceitos de Linguagens de Programação – Robert W. Sebesta
SNOBOL
• Projetada para processamento de texto, no Bell Labs, por Farber, 
Griswold e Polensky em 1964
• Operações poderosas para o casamento de padrões de cadeias
• Mais lenta do que linguagens alternativas (e não mais usada para 
editores de texto)
• Ainda em uso para uma variedade de tarefas de processamento 
de textos 
Conceitos de Linguagens de Programação – Robert W. Sebesta
O Início da abstração de dados: SIMULA 67
• Projetada inicialmente para simulação, na Noruega, por Nygaard e Dahl
• Baseada no ALGOL 60 e no SIMULA I
• Contribuições
– Corrotinas – espécie de subprograma
– Classes, objetos e herança
Conceitos de Linguagens de Programação – Robert W. Sebesta
Projeto ortogonal: ALGOL 68
• A partir do desenvolvimento continuado do ALGOL 60
• Fonte de uma série de novas ideias (embora a própria linguagem nunca 
tenha alcançado grande uso)
• Projeto baseado no conceito de ortogonalidade
– Alguns conceitos primitivos mais o uso irrestrito de mecanismos de 
combinação
Conceitos de Linguagens de Programação – Robert W. Sebesta
Avaliação do ALGOL 68
• Contribuições
– Estruturas de dados definidas pelo usuário
– Tipos de referência
– Vetores dinâmicos (vetores flex)
• Comentários
– Menos uso do que o ALGOL 60
– Teve forte influência nas linguagens subsequentes, especialmente Pascal, 
C e Ada
Conceitos de Linguagens de Programação – Robert W. Sebesta
Pascal - 1971
• Projetada por Wirth (ex-membro do comitê do ALGOL 68)
• Projetada para ser usada como veículo educacional
• Pequena, simples, nada realmente novo
• O maior impacto foi no ensino de programação
– Do meio dos anos 1970 até o fim dos 1990, foi a linguagem mais usada 
para o ensino de programação
Conceitos de Linguagens de Programação – Robert W. Sebesta
C - 1972
• Projetada para a programação de sistemas (no Bell Labs, por Dennis 
Richie)
• Evoluída a partir de BCLP, B e ALGOL 68
• Poderoso conjunto de operadores, mas verificação de tipos pobre
• Primeira linguagem de alto padrão implementada no UNIX
• Muitas áreas de aplicação
Conceitos de Linguagens de Programação – Robert W. Sebesta
Programação baseada em lógica: Prolog
• Projetada, por Comerauer e Roussel (Universidade de Aix-Marseille), 
com ajuda de Kowalski (Universidade de Edimburgo)
• Baseada em lógica formal
• Não procedural
• Pode ser resumida como sendo um tipo de base de dados inteligente
• Altamente ineficiente, pequenas áreas de aplicação
Conceitos de Linguagens de Programação – Robert W. Sebesta
O maior esforço de projeto da história: Ada
• Enorme esforço de projeto, envolvendo centenas de pessoas, muito 
dinheiro e cerca de oito anos
– Strawman (abril de 1975)
– Woodman (agosto de 1975)
– Tinman (1976)
– Ironman (1977)
– Steelman (1978)
• Chamada de Ada em homenagem de Augusta Ada Byron, a primeira 
programadora
Conceitos de Linguagens de Programação – Robert W. Sebesta
Avaliação de Ada
• Contribuições
– Pacotes - suporte para abstração de dados
– Recursos elaborados para manipulação de exceções
– Unidades de programas genéricas
– Concorrência de unidades de programas especiais
• Comentários
– Projeto competitivo
– Agrupa a maioria dos conceitos de engenharia de software e projeto de 
linguagem do final dos anos 1970
– Primeiros compiladores eramdifíceis; apenas em 1985, quase quatro 
anos após o projeto da linguagem estar completo, compiladores usáveis 
começaram a aparecer
Conceitos de Linguagens de Programação – Robert W. Sebesta
Ada 95
• Ada 95 (começou em 1988)
– Suporte para programação orientada a objeto por meio de derivação 
de tipos
– Melhor controle de mecanismos para dados compartilhados
– Novos recursos para concorrência
• Popularidade sofreu porque o Departamento de Defesa não exigiu mais 
seu uso e por causa da popularidade de C++
Conceitos de Linguagens de Programação – Robert W. Sebesta
Programação orientada a objetos: Smalltalk
• Projetada na Xerox PARC, inicialmente por Alan Kay, depois por Adele 
Goldberg
• Primeira linguagem de programação a oferecer suporte completo à 
programação orientada a objetos
• Pioneira no design da interface gráfica do usuário
Conceitos de Linguagens de Programação – Robert W. Sebesta
Combinando recursos imperativos e 
programação orientada a objetos: C++
• Projetada no Bell Labs por Stroustrup em 1980
• Desenvolvida a partir de C e SIMULA 67 
• Facilidades para programação orientada a objetos, emprestadas 
do SIMULA 67
• Fornece manipulação de exceções
• Linguagem grande e complexa, em parte porque suporta programação 
procedural e orientada a objetos
• Cresceu rapidamente em popularidade
• Padrão ANSI aprovado em novembro de 1997
• Versão da Microsoft (lançado com .NET em 2002): Managed C++
Conceitos de Linguagens de Programação – Robert W. Sebesta
Linguagens relacionadas
• Eiffel (projetada por Bertrand Meyer - 1992)
– Não diretamente derivada de outra linguagem
– Menor e mais simples do que C++
– Não teve a popularidade de C++, porque muitos entusiastas de C++ já 
eram programadores de C
• Delphi (Borland)
– Pascal mais recursos para suporte de programação orientada a objeto
– Mais elegante e seguro do que C++
Conceitos de Linguagens de Programação – Robert W. Sebesta
Uma linguagem orientada a objetos baseada 
no paradigma imperativo: Java
• Projetada na Sun no início dos anos 1990
– C e C++ não eram satisfatórios para dispositivos eletrônicos embarcados
• Baseada em C++
– Significantemente simplificada
– Suporta apenas programação orientada a objetos
– Tem referências, mas não tem ponteiros
– Inclui forma simples de controle de concorrência
Conceitos de Linguagens de Programação – Robert W. Sebesta
Avaliação de Java
• Eliminou muitos recursos inseguros de C++
• Suporta concorrência
• Bibliotecas de classes para interfaces gráficas com o usuário, acesso a 
bases de dados e redes
• Portabilidade: Máquina Virtual Java (JVM), compiladores Just-in-Time
(JIT)
• Amplamente usado para programação Web
• Uso aumentou mais rapidamente do que qualquer linguagem anterior
• Versão mais recente, 5.0, lançada em 2004
Conceitos de Linguagens de Programação – Robert W. Sebesta
Linguagens de Scripting para Web
• Perl
– Desenvolvida por Larry Wall — lançada primeiro em 1987
– Variáveis são estaticamente tipadas e implicitamente declaradas
– Três espaços de nomes distintos para variáveis, denotados pelo primeiro caractere de nomes de variáveis
– Teve uso difundido para programação CGI na Web
– Também usado como ferramenta de administração de sistema em UNIX
• JavaScript
– Começou na Netscape, mas depois se tornou um projeto conjunto da Netscape com a Sun Microsystems
– Permitia aos documentos HTML requisitarem a execução de programas no servidor; usado na criação de 
documentos HTML dinâmicos
– Puramente interpretada
– Relacionado ao Java somente por meio de sintaxe similar
• PHP
– PHP: Hypertext Preprocessor (Processador de Hipertexto), projetado por Rasmus Lerdorf
– Linguagem de scripting do lado do servidor embutida em HTML, geralmente utilizados para processamento 
de formulários e acesso de dados pela Web
– Puramente interpretada
Conceitos de Linguagens de Programação – Robert W. Sebesta
Linguagens de Scripting para Web
• Python
– Linguagem de scripting orientada a objetos
– Com verificação de tipos, mas tipada dinamicamente
– Usada para programação em CGI e administração de sistemas
– Suporta listas, tuplas e dicionários
• Lua
– Linguagem de scripting que oferece suporte para programação procedural 
e funcional com extensibilidade como objetivo primário
– Com verificação de tipos, mas tipada dinamicamente
– Usada para programação em CGI e administração de sistemas
– Suporta listas, tuplas e dicionários, todos com a sua única estrutura de 
dados, a tabela
Conceitos de Linguagens de Programação – Robert W. Sebesta
Linguagens de Scripting para Web
• Ruby
– Projetada no Japão por Yukihiro Matsumoto (também conhecido como 
“Matz”)
– Começou como um substituto para Perl e Python
– Linguagem de scripting orientada a objetos pura
• Todos os dados são objetos
– A maioria dos operadores são implementados como métodos, que podem 
ser redefinidos pelo código do usuário
– Puramente interpretada
Conceitos de Linguagens de Programação – Robert W. Sebesta
Uma Linguagem baseada em C Para o Novo 
Milênio: C#
• Parte da nova plataforma de desenvolvimento .NET (2000)
• Baseada em C++ , Java e Delphi
• Fornece uma linguagem para o desenvolvimento de software baseado 
em componentes
• Todas as linguagens do .NET usam o chamado Common Type System 
(CTS – Sistema de Tipos Comum), que fornece uma biblioteca de 
classes comum
Conceitos de Linguagens de Programação – Robert W. Sebesta
Linguagens híbridas de marcação/programação
• XSLT
– XML (eXtensible Markup Language – Linguagem de Marcação Extensível) é uma 
linguagem de metamarcação
– XSLT (eXtensible Stylesheet Language Transformations – Transformações em 
Linguagem de Folhas de Estilo Extensível) transforma documentos XML para 
visualização
– Contrutores de programação
• JSP
– Java Server Pages: coleção de tecnologias projetadas para oferecer suporte 
a documentos Web dinâmicos 
– servlet: programa que roda no processo do servidor Web, que controla a execução 
dos servlets
– JSTL define uma coleção de elementos de ações XML que controlam 
o processamento do documento JSP no servidor Web
Conceitos de Linguagens de Programação – Robert W. Sebesta
Resumo
• Desenvolvimento, ambiente de desenvolvimento e avaliação de 
importantes linguagens de programação
• Perspectivas em relação as questões atuais do projeto de linguagens
Capítulo 3
Descrevendo Sintaxe 
e Semântica
Conceitos de Linguagens de Programação – Robert W. Sebesta
Tópicos do Capítulo 3
• Introdução
• O problema geral de descrever sintaxe
• Métodos formais para descrever sintaxe
• Gramáticas de atributos
• Descrevendo o significado de programas: semântica dinâmica
Conceitos de Linguagens de Programação – Robert W. Sebesta
Introdução
• Sintaxe: a forma de suas expressões, sentenças e unidades de 
programas
• Semântica: o significado dessas expressões, sentenças e unidades de 
programas
• Sintaxe e semântica fornecem uma definição da linguagem
– Usuários de uma definição de linguagem
• Outros desenvolvedores de linguagem
• Implementadores
• Programadores (os usuários da linguagem)
Conceitos de Linguagens de Programação – Robert W. Sebesta
O problema geral de descrever sintaxe: 
terminologia
• Uma sentença é uma cadeia de caracteres formada a partir do alfabeto 
da linguagem
• Uma linguagem é uma cadeia de sentenças
• Um lexema é a unidade sintática de mais baixo nível de uma linguagem 
(por exemplo, *, sum, begin)
• Um token é uma categoria de lexemas (por exemplo, identificador)
Conceitos de Linguagens de Programação – Robert W. Sebesta
Definição formal de linguagens
• Reconhecedores
– Um dispositivo de reconhecimento lê cadeias de caracteres a partir do 
alfabeto da linguagem e indica se a cadeia pertence ou não à linguagem
– Exemplo: parte de análise sintática de um compilador
• A discussão detalhada sobre análise sintática aparece no Capítulo 4
• Geradores
– Um dispositivo que gera sentenças de uma linguagem
– Pode determinar se a sintaxe de uma sentença em particular está 
sintaticamente corretaa comparando à estrutura do gerador
Conceitos de Linguagens de Programação – Robert W. Sebesta
BNF e gramáticas livres de contexto
• Gramáticas livres de contexto
– Desenvolvido por Noam Chomsky no meio dos anos 1950
– Geradores de linguagem, feitos para descrever a sintaxe de linguagens 
naturais
– Define uma classe de linguagens chamadas de livres de contexto
• Forma de Backus-Naur (1959)
– Inventada por John Backus para descriver Algol 58
– BNF é equivalente às gramáticas livres de contexto
Conceitos de Linguagens de Programação – Robert W. Sebesta
Fundamentos de BNF
• Em BNF, abstrações são usadas para representar classes de estruturas 
sintáticas – elas agem como variáveis sintáticas (também chamadas de 
símbolos não terminais, ou simplesmente não terminais)
• Terminais são lexemas ou tokens
• Uma regra tem um lado esquerdo (LHS), que é um não terminal, e um 
lado direito (RHS), que é uma cadeia de terminais e não terminais
– Exemplos das regras de BNF:
<ident_list> → identifier | identifier, <ident_list>
<if_stmt> → if <logic_expr> then <stmt>
• Gramática: coleção de regras
• Um símbolo inicial é um elemento especial dos não terminais de 
uma gramática
Conceitos de Linguagens de Programação – Robert W. Sebesta
Regras de BNF
• Uma abstração (ou símbolo não terminal) pode ter mais de um RHS
<stmt> → <single_stmt> 
| begin <stmt_list> end
Conceitos de Linguagens de Programação – Robert W. Sebesta
Descrevendo listas
• Listas sintáticas são descritas usando recursão
<ident_list> → ident
| ident, <ident_list>
• Uma derivação é uma aplicação de regras repetida, começando com 
um símbolo inicial e terminando com uma sentença (todos símbolos 
terminais)
Conceitos de Linguagens de Programação – Robert W. Sebesta
Um exemplo de gramática
<program> → <stmts>
<stmts> → <stmt> | <stmt> ; <stmts>
<stmt> → <var> = <expr>
<var> → a | b | c | d
<expr> → <term> + <term> | <term> - <term>
<term> → <var> | const
Conceitos de Linguagens de Programação – Robert W. Sebesta
Um exemplo de derivação
<program> => <stmts> => <stmt> 
=> <var> = <expr> 
=> a = <expr> 
=> a = <term> + <term>
=> a = <var> + <term> 
=> a = b + <term>
=> a = b + const
Conceitos de Linguagens de Programação – Robert W. Sebesta
Derivações
• Cada cadeia de símbolos em uma derivação é chamada de forma 
sentencial 
• Uma sentença é uma forma sentencial que tem apenas símbolos 
terminais
• Uma derivação mais à esquerda é uma em que o não terminal mais à 
esquerda em cada forma sentencial é expandido
• Uma derivação pode ser nem mais à esquerda nem mais à direita
Conceitos de Linguagens de Programação – Robert W. Sebesta
Árvore de análise sintática
• Representação hierárquica de uma derivação
Conceitos de Linguagens de Programação – Robert W. Sebesta
Ambiguidade em gramáticas
• Uma gramática é ambígua se gera uma forma sentencial com duas ou 
mais árvores de análise sintática distintas
Conceitos de Linguagens de Programação – Robert W. Sebesta
Uma gramática de expressão ambígua
<expr> → <expr> <op> <expr> | const
<op> → / | -
Conceitos de Linguagens de Programação – Robert W. Sebesta
Uma gramática de expressão não ambígua
• Se usarmos a árvore de análise sintática para indicar níveis de 
precedência dos operadores, não podemos ter a ambiguidade
<expr> → <expr> - <term> | <term>
<term> → <term> / const| const
Conceitos de Linguagens de Programação – Robert W. Sebesta
Associatividade de operadores
• Associatividade de um operador também pode ser indicada por uma 
gramática
<expr> -> <expr> + <expr> | const (ambígua)
<expr> -> <expr> + const | const (não ambígua)
Conceitos de Linguagens de Programação – Robert W. Sebesta
BNF estendida
• Partes opcionais são delimitadas por colchetes [ ]
<proc_call> -> ident [(<expr_list>)]
• Partes alternativas de RHSs são colocadas entre parênteses e 
separadas com barras verticais
<term> → <term> (+|-) const
• Repetições (0 ou mais) são colocadas entre chaves { }
<ident> → letter {letter|digit}
Conceitos de Linguagens de Programação – Robert W. Sebesta
BNF e EBNF
• BNF
<expr> → <expr> + <term>
| <expr> - <term>
| <term>
<term> → <term> * <factor>
| <term> / <factor>
| <factor>
• EBNF
<expr> → <term> {(+ | -) <term>}
<term> → <factor> {(* | /) <factor>}
Conceitos de Linguagens de Programação – Robert W. Sebesta
Recentes variações em EBNF
• RHSs alternativas são colocadas em linhas separadas
• Uso de dois pontos em vez de =>
• Uso de opt para partes opcionais
• Uso de oneof para escolhas
Conceitos de Linguagens de Programação – Robert W. Sebesta
Semânticas estáticas
• Não têm a ver com o significado
• Gramáticas livres de contexto (CFGs) não podem descrever todas as 
sintaxes de linguagens de programação
• Categorias de construtores que são problemas:
– Livres de contexto (por exemplo, tipos de operandos em expressões)
– Não livres de contexto (por exemplo, variáveis precisam ser declaradas 
antes de serem usadas)
Conceitos de Linguagens de Programação – Robert W. Sebesta
Gramáticas de atributos
• Uma gramática de atributos (AG) é uma extensão de uma gramática 
livre de contexto (CFG) 
• Valores primários de gramáticas de atributos:
– Especificação de semânticas estáticas
– Compilação (verificação de semânticas estáticas)
Conceitos de Linguagens de Programação – Robert W. Sebesta
Gramáticas de atributos: definição
• Def: Uma gramática de atributo é uma gramática com os seguintes 
recursos adicionais:
– Associado a cada símbolo X da gramática está um conjunto de atributos 
A (X)
– Associado a cada regra gramatical está um conjunto de funções 
semânticas e um conjunto possivelmente vazio de funções de predicado 
sobre os atributos dos símbolos na regra gramatical
Conceitos de Linguagens de Programação – Robert W. Sebesta
Gramáticas de atributos: definição
• Deixe X0 → X1 ... Xn ser uma regra
• Funções semânticas da forma S(X0) = f(A(X1), ... , A(Xn)) definem 
atributos sintetizados
• Funções da forma I(Xj) = f(A(X0), ... , A(Xn)), for i <= j <= n, definem 
atributos herdados
• Atributos intrínsecos são atributos sintetizados de nós folha cujos 
valores são determinados fora da árvore de análise sintática
Conceitos de Linguagens de Programação – Robert W. Sebesta
Gramáticas de atributos: um exemplo
• Sintaxe
<assign> -> <var> = <expr>
<expr> -> <var> + <var> | <var>
<var> A | B | C
• actual_type: sintetizado para <var> e <expr>
• expected_type: herdado para <expr>
Conceitos de Linguagens de Programação – Robert W. Sebesta
Gramática de atributos
• Regra sintática: <expr> → <var>[1] + <var>[2]
Regra semântica: 
<expr>.actual_type ← <var>[1].actual_type
Predicado: 
<var>[1].actual_type == <var>[2].actual_type
<expr>.expected_type == <expr>.actual_type
• Regra sintática : <var> → id
Regra semântica:
<var>.actual_type ← lookup (<var>.string)
Conceitos de Linguagens de Programação – Robert W. Sebesta
Gramática de atributos
• Como são computados os valores dos atributos?
– Se todos os atributos forem herdados, a árvore pode ser decorada na 
ordem decrescente.
– Se todos os atributos forem sintetizados, a árvore pode ser decorada na 
ordem crescente.
– Em muitos casos, ambos os tipos de atributos são usados, e uma 
combinação de crescente e decrescente precisa ser usada.
Conceitos de Linguagens de Programação – Robert W. Sebesta
Gramática de atributos
<expr>.expected_type ← inherited from parent
<var>[1].actual_type ← lookup (A)
<var>[2].actual_type ← lookup (B)
<var>[1].actual_type =? <var>[2].actual_type
<expr>.actual_type ← <var>[1].actual_type
<expr>.actual_type =? <expr>.expected_type
Conceitos de Linguagens de Programação – Robert W. Sebesta
Semânticas
• Não há nenhuma notação única amplamente aceitável ou formalismo 
para descrever semântica
• Diversas necessidades de uma metodologia e notação para 
a semântica
– Programadores precisam saber o que a sentença de uma linguagem 
significa
– Desenvolvedores de compiladores devem saber exatamente o queas 
construções da linguagem significam
– Geradores de compilação seriam possíveis
– Projetistas poderiam detectar ambiguidades e inconsistências
Conceitos de Linguagens de Programação – Robert W. Sebesta
Semântica operacional
• Semântica Operacional
– Descrever o significado de uma sentença ou programa pela especificação 
dos efeitos de rodá-lo em uma máquina. A mudança no estado de 
máquina (memória, registros, etc.) define o significado da sentença
• Para usar semântica operacional em uma linguagem de alto nível, é 
necessária uma máquina virtual
Conceitos de Linguagens de Programação – Robert W. Sebesta
Semântica operacional
• Um interpretador puro de hardware seria muito caro
• Um interpretador puro de software também tem problemas
– As características detalhadas de um computador em particular deixaria 
ações difíceis de entender
– Uma definição semântica seria dependente da máquina
Conceitos de Linguagens de Programação – Robert W. Sebesta
Semântica operacional
• Uma melhor alternativa: uma completa simulação
• O processo:
– Construir um interpretador (transforma código de origem em código de 
máquina de um computador idealizado)
– Construir um simulador para o computador idealizado
Conceitos de Linguagens de Programação – Robert W. Sebesta
Semânticas operacionais
• Usos de semânticas operacionais:
– Manuais de linguagem e livros-texto de programação
– Ensino de linguagens de programação
• Dois níveis diferentes de uso de uma semântica operacional:
– Semântica operacional natural
– Semântica operacional estrutural
• Avaliação
– Boa se usada informalmente
– Extremamente complexa se usada formalmente
Conceitos de Linguagens de Programação – Robert W. Sebesta
Semânticas denotacionais
• Baseada na teoria de funções recursivas
• O método de descrição semântica mais abstrato
• Originalmente desenvolvida por Scott e Strachey (1970)
Conceitos de Linguagens de Programação – Robert W. Sebesta
Semânticas denotacionais
• O processo de construir uma especificação denotacional para uma 
linguagem:
– Define um objeto matemático para cada entidade da linguagem
– Define uma função que mapeia as instâncias dessa entidade de 
linguagem para instâncias do objeto matemático correspondente
• O significado da construção de linguagem é definido apenas pelos 
valores das variáveis de programas
Conceitos de Linguagens de Programação – Robert W. Sebesta
Semânticas denotacionais: o estado de 
um programa
• O estado de um programa são os valores atuais de todas as suas 
variáveis
s = {<i1, v1>, <i2, v2>, …, <in, vn>}
• Considere VARMAP uma função que, quando dado um nome de 
variável e estado, retorna o atual valor da variável
VARMAP(ij, s) = vj
Conceitos de Linguagens de Programação – Robert W. Sebesta
Números decimais
<dec_num> → '0' | '1' | '2' | '3' | '4' | '5' | 
'6' | '7' | '8' | '9' | 
<dec_num> ('0' | '1' | '2' | '3' |
'4' | '5' | '6' | '7' | 
'8' | '9')
Mdec('0') = 0, Mdec ('1') = 1, …, Mdec ('9') = 9
Mdec (<dec_num> '0') = 10 * Mdec (<dec_num>)
Mdec (<dec_num> '1’) = 10 * Mdec (<dec_num>) + 1
…
Mdec (<dec_num> '9') = 10 * Mdec (<dec_num>) + 9
Conceitos de Linguagens de Programação – Robert W. Sebesta
Expressões
• Expressões formam o conjunto Z ∪ {error}
• Assumimos que expressões são números decimais, variáveis ou 
expressões binárias tendo um operador aritimético e dois operando, 
cada um pode ser uma expressão
Conceitos de Linguagens de Programação – Robert W. Sebesta
Expressões
Me(<expr>, s) ∆=
case <expr> of
<dec_num> => Mdec(<dec_num>, s)
<var> => 
if VARMAP(<var>, s) == undef
then error
else VARMAP(<var>, s)
<binary_expr> => 
if (Me(<binary_expr>.<left_expr>, s) == undef
OR Me(<binary_expr>.<right_expr>, s) =
undef)
then error
else
if (<binary_expr>.<operator> == '+' then
Me(<binary_expr>.<left_expr>, s) + 
Me(<binary_expr>.<right_expr>, s)
else Me(<binary_expr>.<left_expr>, s) * 
Me(<binary_expr>.<right_expr>, s)
...
Conceitos de Linguagens de Programação – Robert W. Sebesta
Sentenças de atribuição
• Funções de mapeamento mapeiam listas de sentenças e estados para 
estados ∪ {error}
Ma(x := E, s) ∆=
if Me(E, s) == error
then error
else s’ = 
{<i1,v1’>,<i2,v2’>,...,<in,vn’>},
where for j = 1, 2, ..., n,
if ij == x
then vj’ = Me(E, s) 
else vj’ = VARMAP(ij, s)
Conceitos de Linguagens de Programação – Robert W. Sebesta
Laços lógicos com pré-teste
• Funções de mapeamento mapeiam listas de sentenças e estados para 
estados U {error}
Ml(while B do L, s) ∆=
if Mb(B, s) == undef
then error
else if Mb(B, s) == false
then s
else if Msl(L, s) == error
then error
else Ml(while B do L, Msl(L, s))
Conceitos de Linguagens de Programação – Robert W. Sebesta
Significado do laço
• O significado do laço é o valor das variáveis do programa após as 
sentenças no laço terem sido executadas o número de vezes 
necessário, assumindo que não ocorreram erros 
• Essencialmente, o laço foi convertido de iteração para recursão, onde o 
controle da recursão é definido matematicamente por outras funções 
recursivas de mapeamento de estado
– A recursão é mais fácil de descrever com rigor matemático do que 
a iteração
Conceitos de Linguagens de Programação – Robert W. Sebesta
Avaliação de semântica denotacional
• Pode ser usada para provar a corretude de programas
• Sugere uma maneira rigorosa para pensar nos programas
• Pode ser uma ajuda ao projeto de linguagem
• Tem sido usada em sistemas de geração de compilador
• Devido a sua complexidade, é de pouco uso para usuários de 
linguagem
Conceitos de Linguagens de Programação – Robert W. Sebesta
Semântica axiomática
• Baseada em lógica matemática
• Propósito original: verificação de programas
• Axiomas ou regras de inferência são definidas para cada tipo de 
sentença da linguagem (a fim de permitir transformações de expressões 
de lógica em expressões de lógica mais formais)
• As expressões lógicas são chamadas de asserções
Conceitos de Linguagens de Programação – Robert W. Sebesta
Semântica axiomática
• Uma asserção que precede imediatamente uma sentença (uma 
pré-condição) descreve as restrições nas variáveis do programa 
naquele ponto.
• Uma asserção imediatamente após uma sentença é uma pós-condição
• Uma pré-condição mais fraca é a menos restritiva que garantirá 
a validade da pós-condição associada
Conceitos de Linguagens de Programação – Robert W. Sebesta
Forma da semântica axiomática
• Forma sentencial: {P} statement {Q}
• Um exemplo
– a = b + 1 {a > 1}
– Uma pré-condição possível: {b > 10}
– Pré-condição mais fraca: {b > 0}
Conceitos de Linguagens de Programação – Robert W. Sebesta
Provas de programas
• A pós-condição para o programa completo é o resultado desejado
– Volte até a primeira sentença do programa. Se a pré-condição na primeira 
sentença é a mesma da especificação do programa, ele está correto.
Conceitos de Linguagens de Programação – Robert W. Sebesta
Semântica axiomática: axiomas
• Um axioma para sentença de atribuição 
(x = E): {Qx->E} x = E {Q}
• A Regra de Consequência:
Conceitos de Linguagens de Programação – Robert W. Sebesta
Semântica axiomática: axiomas
• Uma regra de inferência para sequências da forma S1; S2
{P1} S1 {P2}
{P2} S2 {P3}
Conceitos de Linguagens de Programação – Robert W. Sebesta
Semântica axiomática: axiomas
• Uma regra de inferência para um laço de repetição
{P} while B do S end {Q}
onde I é a invariante de laço de repetição
Conceitos de Linguagens de Programação – Robert W. Sebesta
Semântica axiomática: axiomas
• Características da invariante de laço de repetição: I deve satisfazer os 
seguintes requisitos:
– P => I -- a invariante de repetição precisa ser verdadeira inicialmente 
– {I} B {I} -- avaliação de B não pode mudar a validade de I
– {I and B} S {I} -- I não é mudado pela execução do corpo da repetição
– (I and (not B)) => Q -- se I é verdadeiro e B é falso, Q é incluído
– A repetição termina -- pode ser difícil de provar
Conceitos de Linguagensde Programação – Robert W. Sebesta
Invariante de repetição
• A invariante de repetição é uma versão enfraquecida da pós-condição 
de repetição e é também uma pré-condição.
• I deve ser fraco o suficiente para estar preenchido antes do início do 
ciclo, mas quando for combinado com a condição de saída do laço deve 
ser suficientemente forte para forçar a verdade da pós-condição
Conceitos de Linguagens de Programação – Robert W. Sebesta
Avaliação da semântica axiomática
• Desenvolver axiomas ou regras de inferência para todas as sentenças 
de uma linguagem é difícil
• É uma boa ferramenta para provas de corretude, mas não é útil para 
usuários de linguagens e escritores de compiladores
Conceitos de Linguagens de Programação – Robert W. Sebesta
Semântica denotacional × semântica 
operacional
• Na semântica operacional, as mudanças de estado são definidas por 
algoritmos codificados
• Na semântica denotacional, as mudanças de estado são definidas por 
funções matemáticas rigorosas
Conceitos de Linguagens de Programação – Robert W. Sebesta
Resumo
• BNF e gramáticas livres de contexto são metalinguagens equivalentes
– Bastante adequadas para a tarefa de descrever a sintaxe de linguagens 
de programação
• Uma gramática de atributos e um formalismo descritivo que pode 
descrever tanto a sintaxe quanto a semântica estática de uma 
linguagem
• Três métodos principais de descrição semântica
– Operacional, denotacional e axiomática
Capítulo 4
Análise Léxica 
e Sintática
Conceitos de Linguagens de Programação – Robert W. Sebesta
Tópicos do Capítulo 4
• Introdução
• Análise léxica
• O problema da análise sintática
• Análise sintática descendente recursiva
• Análise sintática ascendente
Conceitos de Linguagens de Programação – Robert W. Sebesta
Introdução
• Sistemas de implementação de linguagem devem analisar o código 
de origem, independentemente da abordagem de implementação 
específica
• Quase todas as análises sintáticas são baseadas em uma descrição 
formal da sintaxe da linguagem de origem (BNF)
Conceitos de Linguagens de Programação – Robert W. Sebesta
Análise sintática
• A porção de análise sintática de um processador de linguagem quase 
sempre consiste em duas partes:
– O analisador léxico (construções de linguagem de pequena escala, como 
nomes e literais numéricos)
– O analisador sinático, ou parser (construções de larga escala como 
expressões, sentenças e unidades de programas)
Conceitos de Linguagens de Programação – Robert W. Sebesta
Vantagens de usar BNF para descrever 
uma sintaxe
• Fornece uma descrição da sintaxe clara e concisa, tanto para humanos 
quanto para os sistemas de software
• Pode ser usada como a base direta para o analisador sintático
• Implementações baseadas em BNF são relativamente fáceis de manter
Conceitos de Linguagens de Programação – Robert W. Sebesta
Razões para separar análises léxica e sintática
• Simplicidade - técnicas para análise léxica são menos complexas do 
que aquelas para análise sintática; o processo pode ser mais simples se 
for realizado separadamente
• Eficiência – separação permite otimização do analisador léxico
• Portabilidade - partes do analisador léxico podem não ser portáteis, mas 
o analisador sintático sempre é
Conceitos de Linguagens de Programação – Robert W. Sebesta
Análise léxica
• Um analisador léxico é essencialmente um casador de padrões para 
cadeias de caracteres
• Um analisador léxico serve como o passo inicial de um analisador 
sintático
• Coleta caracteres e os agrupa logicamente, atribuindo códigos internos 
de acordo com sua estrutura - lexemas
– Lexema casa um padrão de caracteres, que é associado à categoria 
léxica chamada token
– sum é um lexema; seu token pode ser IDENT
Conceitos de Linguagens de Programação – Robert W. Sebesta
Análise léxica
• O analisador léxico é normalmente uma função chamada pelo 
analisador sintático quando esse precisa de um token
• Três abordagens para construir um analisador léxico:
– Escrever uma descrição formal dos tokens e usar uma ferramenta de 
software que constrói analisadores léxicos dirigidos por tabela que 
recebem essa descrição
– Projetar um diagrama de transições de estado que descreva os padrões 
de tokens da linguagem e escrever um programa que implemente o 
diagrama
– Descrever um diagrama de transições de estado que descreva os padrões 
de tokens da linguagem e construir manualmente uma implementação 
dirigida por tabela do diagrama de estados
Conceitos de Linguagens de Programação – Robert W. Sebesta
Diagrama de estados
• Um diagrama de transição de estados, ou apenas diagrama de estados, 
é um grafo dirigido 
• Os nós de um diagrama de estados são rotulados com nomes de 
estados 
• Os arcos são rotulados com os caracteres de entrada que causam as 
transições entre os estados
• Um arco pode também incluir ações que o analisador léxico deve 
realizar quando a transição ocorrer
Conceitos de Linguagens de Programação – Robert W. Sebesta
Análise léxica
• Em muitos casos, transições podem ser combinadas para simplificar o 
diagrama de estado
– Ao reconhecer um identificador, todas as letras maiúsculas e minúsculas 
são equivalentes
• Use uma classe de caracteres que inclui todas as letras
– Ao reconhecer um literal inteiro, todos os dígitos são equivalentes - usar 
uma classe dígitos
Conceitos de Linguagens de Programação – Robert W. Sebesta
Análise léxica
• As palavras reservadas e identificadores podem ser reconhecidos 
juntos (em vez de haver uma parte do diagrama para cada palavra 
reservada)
– Use uma tabela para determinar se um possível identificador é uma 
palavra reservada
Conceitos de Linguagens de Programação – Robert W. Sebesta
Análise léxica
• Subprogramas utilitários:
– getChar - obtém o próximo caractere de entrada do programa de entrada 
e o coloca na variável nextChar, determina a classe do caractere de 
entrada e a coloca na variável charClass
– addChar – coloca o caractere de nextChar no lugar em que o lexema 
está sendo acumulado, lexeme
– lookup – determina se a sequência de caracteres lexeme é uma palavra 
reservada
Conceitos de Linguagens de Programação – Robert W. Sebesta
Diagrama de estados
Conceitos de Linguagens de Programação – Robert W. Sebesta
Analisador léxico
Implementação: 
 Mostrar front.c (pp. 195-199)
– A seguir, temos a saída do analisador léxico de
front.c quando usado com (sum + 47) / total
Next token is: 25 Next lexeme is (
Next token is: 11 Next lexeme is sum
Next token is: 21 Next lexeme is +
Next token is: 10 Next lexeme is 47
Next token is: 26 Next lexeme is )
Next token is: 24 Next lexeme is /
Next token is: 11 Next lexeme is total
Next token is: -1 Next lexeme is EOF
Conceitos de Linguagens de Programação – Robert W. Sebesta
O problema da análise sintática
• Objetivos da análise sintática:
– Encontrar erros de sintaxe; para cada um, produzir uma mensagem de 
diagnóstico e se recuperar
– Produzir uma árvore de análise sintática completa, ou ao menos percorrer 
a estrutura da árvore, para uma entrada sintaticamente correta
Conceitos de Linguagens de Programação – Robert W. Sebesta
O problema da análise sintática
• Duas categorias de análise sintática
– Descendente – constrói a árvore a partir da raiz em direção às folhas
– Ascendente – constrói a árvore a partir das folhas em direção à raiz
Conceitos de Linguagens de Programação – Robert W. Sebesta
O problema da análise sintática
• Analisadores sintáticos descendentes
– Dada uma forma sentencial, xAα , a análise sintática precisa escolher 
a regra sentencial correta para obter a próxima forma sentencial em 
uma derivação mais à esquerda, usando apenas o primeiro token
produzido por A
• Os algoritmos de análise sintática mais comuns:
– Descendente recursivo - implementação codificada
– Algoritmos LL- implementação dirigida por tabela
Conceitos de Linguagens de Programação – Robert W. Sebesta
O problema da análise sintática
• Analisadores sintáticosascendentes
– Dada uma forma sentencial direita α, o analisador sintático deve 
determinar que subcadeia de α e a RHS da regra na gramática que deve 
ser reduzida para seu LHS para produzir a forma sentencial anterior na 
derivação mais à direita
– Os algoritmos mais comuns de análise sintática ascendente estão na
família LR
Conceitos de Linguagens de Programação – Robert W. Sebesta
O problema da análise sintática
• A complexidade da análise sintática
– Os algoritmos de análise sintática que trabalham para qualquer gramática 
não ambígua são complicados e ineficientes (O(n3), onde n é o 
comprimento da entrada)
– Compiladores usam análises sintáticas que trabalham para apenas um 
subconjunto de todas as gramáticas possíveis (O(n), onde n é o 
comprimento da entrada)
Conceitos de Linguagens de Programação – Robert W. Sebesta
Análise sintática descendente recursiva 
• Um analisador sintático descendente recursivo é chamado assim 
porque consiste em uma coleção de subprogramas, muitos dos quais 
são recursivos, e produz uma árvore de análise sintática em uma ordem 
descendente 
• A EBNF é idealmente adequada para analisadores sintáticos 
descendentes recursivos
Conceitos de Linguagens de Programação – Robert W. Sebesta
Análise sintática descendente recursiva 
• Uma gramática para expressões simples:
<expr> → <term> {(+ | -) <term>}
<term> → <factor> {(* | /) <factor>}
<factor> → id | int_constant | ( <expr> )
Conceitos de Linguagens de Programação – Robert W. Sebesta
Análise sintática descendente recursiva 
• Assume que temos um analisador léxico chamado lex, que coloca seu 
código de token na variável global nextToken
• O processo de código quando há apenas um RHS:
– Para cada símbolo terminal na RHS, o símbolo terminal é comparado com 
nextToken; se eles casam, o analisador léxico é chamado para obter o 
próximo token de entrada
– Para cada não terminal, o subprograma de análise sintática para o não 
terminal é chamado
Conceitos de Linguagens de Programação – Robert W. Sebesta
Análise sintática descendente recursiva 
/* Função expr 
Analisa sintaticamente cadeias na linguagem gerada pela regra:
<expr> → <term> {(+ | -) <term>}
*/
void expr() {
/* Analisa sintaticamente o primeiro termo */
term(); 
/* Desde que o próximo token seja + ou -, obtenha 
o próximo token e analise sintaticamente o próximo termo */
while (nextToken == ADD_OP || 
nextToken == SUB_OP){
lex();
term(); 
}
}
Conceitos de Linguagens de Programação – Robert W. Sebesta
Análise sintática descendente recursiva 
• Essa rotina em particular não detecta erros
• Convenção: Cada rotina de análise sintática deixa o próximo token de entrada 
em nextToken
Conceitos de Linguagens de Programação – Robert W. Sebesta
Análise sintática descendente recursiva 
• Um não terminal que tenha mais de uma RHS requer um processo 
inicial para determinar qual RHS deve analisar
– A RHS correta é escolhida com base no próximo token da entrada
– O próximo token é comparado com o primeiro token que pode ser gerado 
por cada RHS
– Se eles não casam, é um erro sintático
Conceitos de Linguagens de Programação – Robert W. Sebesta
Análise sintática descendente recursiva 
/* term
Analisa sintaticamente cadeias na linguagem gerada pela regra:
<term> -> <factor> {(* | /) <factor>)
*/
void term() {
printf("Enter <term>\n");
/* Analisa sintaticamente o primeiro termo */
factor();
/* Desde que o próximo token seja * ou /,
obtenha o próximo token e analise sintaticamente o próximo termo */
while (nextToken == MULT_OP || nextToken == DIV_OP) {
lex();
factor();
}
printf("Exit <term>\n");
} /* Fim da função term */
Conceitos de Linguagens de Programação – Robert W. Sebesta
Análise sintática descendente recursiva 
/* Função factor
Analisa sintaticamente cadeias na linguagem
gerada pela regra: 
<factor> -> id | (<expr>) */
void factor() {
/* Determina qual RHS */
if (nextToken) == ID_CODE || nextToken == INT_CODE)
/* Para o id de RHS id, chama lex */
lex();
/* Se a RHS is (<expr>) – chame lex para passar o parêntese esquerdo, 
chame expr e verifique pelo parêntese direito */
else if (nextToken == LP_CODE) {
lex();
expr();
if (nextToken == RP_CODE)
lex();
else
error();
} /* Fim do else if (nextToken == ... */
else error(); /* Neither RHS matches */
}
Conceitos de Linguagens de Programação – Robert W. Sebesta
Análise sintática descendente recursiva 
- Saída da análise sintática da expressão de exemplo(sum + 47) / total 
Next token is: 25 Next lexeme is ( Next token is: 11 Next lexeme is total
Enter <expr> Enter <factor> 
Enter <term> Next token is: -1 Next lexeme is EOF
Enter <factor> Exit <factor>
Next token is: 11 Next lexeme is sum Exit <term>
Enter <expr> Exit <expr>
Enter <term>
Enter <factor>
Next token is: 21 Next lexeme is +
Exit <factor>
Exit <term>
Next token is: 10 Next lexeme is 47
Enter <term>
Enter <factor>
Next token is: 26 Next lexeme is )
Exit <factor>
Exit <term>
Exit <expr>
Next token is: 24 Next lexeme is /
Exit <factor>
Conceitos de Linguagens de Programação – Robert W. Sebesta
Análise sintática descendente recursiva 
• A classe de gramáticas LL
– O Problema da Recursão à Esquerda
• Se uma gramática tem recursão à esquerda, ela não pode ser a base para 
uma análise sintática descendente
– Uma gramática pode ser modificada para remover a recusão à esquerda
Para cada não terminal, A, 
1. Agrupe as regras-A como A → Aα1 | … | Aαm | β1 | β2 | … | βn
onde nenhum dos β’s começa com A
2. Substitua as regras-A originais por
A → β1A’ | β2A’ | … | βnA’
A’ → α1A’ | α2A’ | … | αmA’ | ε
Conceitos de Linguagens de Programação – Robert W. Sebesta
Análise sintática descendente recursiva 
• Outra característica da gramática que desabilita a análise sintática 
descendente é o teste de disjunção par a par
– A incapacidade de determinar o RHS correto na base de um token
– Definição: FIRST(α) = {a | α =>* aβ }
(Se α =>* ε, ε está em FIRST(α))
Conceitos de Linguagens de Programação – Robert W. Sebesta
Análise sintática descendente recursiva 
• Teste de Disjunção Par a Par:
– Para cada não terminal, A, na gramática que tem mais de uma RHS, para 
cada par de regras, A → αi e A → αj, deve ser verdadeiro que
FIRST(αi) ⋂ FIRST(αj) = φ
• Exemplos:
A → a | bB | cAb
A → a | aB
Conceitos de Linguagens de Programação – Robert W. Sebesta
Análise sintática descendente recursiva 
• Fatoração à esquerda pode resolver o problema
As duas regras podem ser substituídas por 
<variable> → identifier | identifier [<expression>]
com
<variable> → identifier <new>
<new> → ε | [<expression>]
ou
<variable> → identifier [[<expression>]]
Conceitos de Linguagens de Programação – Robert W. Sebesta
Análise sintática ascendente
• O problema da análise sintática é encontrar a RHS correta em uma 
forma sentencial à direita para obter a forma sentencial anterior na 
derivação
Conceitos de Linguagens de Programação – Robert W. Sebesta
Análise sintática ascendente
• Intuição acerca dos manipuladores:
– Definição: β e o manipulador da forma sentencial direita γ = αβw se, e 
somente se, S =>*rm αAw =>rm αβw
– Definição: β e uma frase da forma sentencial a direita γ se, e somente se, 
S =>* γ = α1Aα2 =>+ α1βα2
– Definição: β é uma frase simples da forma sentencial à direita γ se, e 
somente se, S =>* γ = α1Aα2 => α1βα2
Conceitos de Linguagens de Programação – Robert W. Sebesta
Análise sintática ascendente
• Intuição acerca dos manipuladores:
– O manipulador de uma forma sentencial mais à direita é sua frase 
sentencial mais à esquerda
– Dada uma árvore de análise sintática, é fácil encontrar o manipulador
Conceitos de Linguagens de Programação – Robert W. Sebesta
Análise sintática ascendente
• Algoritmos de deslocamento e redução
– Uma ação de redução (reduce) substitui uma RHS (o manipulador) no 
topo da pilha do analisador sintático por sua LHS correspondente
– A ação deslocar (shift) move o próximo símbolo de entrada para a pilha do 
analisador sintáticoConceitos de Linguagens de Programação – Robert W. Sebesta
Análise sintática ascendente
• Vantagens dos analisadores sintáticos LR:
– Eles podem ser construídos para todas as linguagens de programação.
– Eles podem detectar erros de sintaxes o mais cedo possível em uma 
varredura da esquerda para a direita.
– A classe de gramáticas LR é um superconjunto da classe analisável 
sintaticamente por analisadores LL (por exemplo, muitas gramáticas 
recursivas à esquerda são LR, mas nenhuma é LL).
Conceitos de Linguagens de Programação – Robert W. Sebesta
Análise sintática ascendente
• Analisadores sintáticos LR precisam ser construídos com uma 
ferramenta
• Descoberta de Knuth: uma análise sintática ascendente pode usar sua 
história inteira, até o ponto atual, para fazer tomar decisões de análise
– Havia apenas um número relativamente pequeno de situações diferentes, 
então a história poderia ser registrada por um estado, em uma pilha de 
análise
Conceitos de Linguagens de Programação – Robert W. Sebesta
Análise sintática ascendente
• Uma configuração de um analisador sintático LR é um par de cadeias 
(pilha, entrada), com a forma detalhada
(S0X1S1X2S2…XmSm, aiai+1…an$)
Conceitos de Linguagens de Programação – Robert W. Sebesta
Análise sintática ascendente
• Uma tabela de análise sintática LR tem duas partes, ACTION e GOTO
– A parte ACTION especifica a maioria das ações do analisador sintático
• Rótulos de linhas são símbolos de estado; rótulos das colunas são símbolos 
terminais
– A parte GOTO indica qual símbolo de estado deve ser inserido na pilha da 
análise sintática após uma redução ser completada
• Rótulos são símbolos de estado; rótulos de coluna são não terminais
Conceitos de Linguagens de Programação – Robert W. Sebesta
A estrutura de um analisador sintático LR
Conceitos de Linguagens de Programação – Robert W. Sebesta
Análise sintática ascendente
• Configuração inicial: (S0, a1…an$)
• Ações do analisador sintático:
– Se ACTION[Sm, ai] = Deslocar S, a próxima configuração é: 
(S0X1S1X2S2…XmSmaiS, ai+1…an$)
– Se ACTION[Sm, ai] = Reduzir A → β e S = GOTO[Sm-r, A], onde r = 
tamanho de β, a próxima configuração é
(S0X1S1X2S2…Xm-rSm-rAS, aiai+1…an$)
Conceitos de Linguagens de Programação – Robert W. Sebesta
Análise sintática ascendente
• Ações do analisador sintático:
– Se ACTION[Sm, ai] = Aceita, a análise sintática está completa e nenhum 
erro foi encontrado.
– Se ACTION[Sm, ai] = Erro, o analisador sintático chama uma rotina de 
tratamento de erros.
Conceitos de Linguagens de Programação – Robert W. Sebesta
Tabela de análise sintática LR
Conceitos de Linguagens de Programação – Robert W. Sebesta
Análise sintática ascendente
• Tabelas de análise sintática LR podem ser facilmente construídas 
usando uma ferramenta de software como o yacc
Conceitos de Linguagens de Programação – Robert W. Sebesta
Resumo
• A análise sintática é uma parte comum da implementação de linguagens
• Um analisador léxico é um casador de padrões que isola as partes de 
pequena escala de um programa
– Detecta erros sintáticos
– Contrói uma árvore de análise sintática
• Um analisador sintático descendente recursivo é um analisador 
sintático LL
– EBNF
• Problema da análise sintática para analisadores sintáticos ascendentes: 
achar a subcadeia da forma sentencial atual
• A família LR de analisadores sintáticos de deslocamento e redução é 
a abordagem de análise sintática ascendente mais usada
Capítulo 5
Nomes, Vinculações 
e Escopos
Conceitos de Linguagens de Programação – Robert W. Sebesta
Tópicos do Capítulo 5
• Introdução
• Nomes
• Variáveis
• O conceito de vinculação
• Escopo
• Escopo e tempo de vida
• Ambientes de referenciamento
• Constantes nomeadas
Conceitos de Linguagens de Programação – Robert W. Sebesta
Introdução
• As linguagens de programação imperativas são abstrações da 
arquitetura de computadores subjacente de von Neumann
– Memória
– Processador
• Variáveis caracterizadas por atributos
– Para projetar um tipo, deve-se considerar escopo, tempo de vida das 
variáveis, inicialização e compatibilidade
Conceitos de Linguagens de Programação – Robert W. Sebesta
Nomes
• Questões de projeto primárias para nomes:
– Os nomes são sensíveis a capitalização?
– As palavras especiais da linguagem são palavras reservadas ou 
palavras-chave?
Conceitos de Linguagens de Programação – Robert W. Sebesta
Nomes
• Formato
– Se for muito pequeno, não pode ser conotativo
– Exemplos:
• FORTRAN 95: máximo de 31
• C99: sem limitação, mas apenas os 63 são significativos; nomes externos são 
restritos a 31 caracteres
• C#, Ada e Java: sem limite e todos os caracteres são significativos
• C++: sem limite, mas os implementadores às vezes o impõem
Conceitos de Linguagens de Programação – Robert W. Sebesta
Nomes
• Caracteres especiais
– PHP: todos os nomes de variáveis devem começar com cifrão ($)
– Perl: todos os nomes de variáveis começam com caracteres especiais, 
que especificam o seu tipo
– Ruby: nomes de variáveis que começam com @ são variáveis de 
instância; as que começam com @@ são variáveis de classe
Conceitos de Linguagens de Programação – Robert W. Sebesta
Nomes
• Sensibilidade à capitalização
– Desvantagem: legibilidade (nomes que são parecidos, mas são diferentes)
• Nomes em linguagens baseadas com C são sensíveis à capitalização
• Nomes em outras não são
• Em C++, Java e C#, o problema não pode ser evitado porque muitos dos 
nomes pré-definidos incluem tanto letras maiúsculas quanto minúsculas
(por exemplo, IndexOutOfBoundsException)
Conceitos de Linguagens de Programação – Robert W. Sebesta
Nomes
• Palavras especiais
– São usadas para tornar os programas mais legíveis ao nomearem as 
ações a serem realizadas
• Uma palavra-chave é uma palavra especial apenas em alguns contextos – por 
exemplo, em Fortran
– Real VarName (Real é um tipo de dado acompanhado de um nome, portanto 
Real é uma palavra-chave)
– Real = 3.4 (Real é uma variável)
– Uma palavra reservada é uma palavra especial que não pode ser usada 
como um nome
– Problema em potencial com as palavras reservadas: se houver muitas, 
o usuário tem dificuldade para inventar nomes (por exemplo, COBOL tem 
300 palavras reservadas!)
Conceitos de Linguagens de Programação – Robert W. Sebesta
Variáveis
• Uma variável é uma abstração de uma célula de memória
• Uma variável pode ser caracterizada como um conjunto de 
seis atributos:
– Nome
– Endereço
– Valor
– Tipo
– Tempo de vida
– Escopo
Conceitos de Linguagens de Programação – Robert W. Sebesta
Atributos de variáveis
• Nome – nem todas as variáveis têm
• Endereço - é o endereço de memória de máquina ao qual ela está 
associada
– Uma variável pode ter diferentes endereços em diferentes momentos 
durante a execução
– Uma variável pode ter diferentes endereços em diferentes lugares em um 
programa
– Quando dois nomes de variáveis podem ser usados para acessar a 
mesma posição de memória, elas são chamadas de apelidos (aliases)
– Apelidos são criados por ponteiros, variáveis de referência, tipos de união 
C e C++
– Apelidos são um problema para a legibilidade (um leitor do programa deve 
sempre se lembrar de todos eles) 
Conceitos de Linguagens de Programação – Robert W. Sebesta
Atributos de variáveis
• Tipo - determina a faixa de valores que a variável pode armazenar e o 
conjunto de operações definidas para valores do tipo
• Valor - é o conteúdo da(s) célula(s) de memória associada(s) a ela 
– O lado esquerdo (l-value) de uma variável é seu endereço
– O lado direito (r-value) de variável é seu valor
• Célula abstrata de memória – célula física ou coleção de células 
associadas a uma variável
Conceitos de Linguagens de Programação – Robert W. Sebesta
O conceito de vinculação
• Uma vinculação é uma associação, como entre um atributo e uma 
entidade ou entre uma operação e um símbolo
• Tempo de vinculação é o momento no qual uma vinculação ocorre
Conceitos de Linguagens de Programação

Outros materiais