690 likes | 909 Views
Semântica de Linguagens de Programação. Centro de Informática, UFPE Luis Carlos (lcsm@cin.ufpe.br) Hermano Moura (hermano@cin.ufpe.br). Objetivo. Introduzir conceitos de semântica formal de linguagens de programação. =. Motivação: Qual o significado do seguinte programa?. program simples =
E N D
Semântica de Linguagens de Programação Centro de Informática, UFPE Luis Carlos (lcsm@cin.ufpe.br) Hermano Moura (hermano@cin.ufpe.br)
Objetivo Introduzir conceitos de semântica formal de linguagens de programação
= Motivação: Qual o significado do seguinte programa? programsimples= varx:int :=3 in x:=x+5 end. ?
Motivação • estudo de linguagens de programação requer que possamos descrever linguagens de programação de forma precisa e de fácil compreensão • Utilização de descrições informais: • Frases de significado duvidoso • Geração de manuais imprecisos • Não existe técnicas que auxiliem a implementação (erros de codificação) • Solução: Utilização de métodos formais
Métodos Formais • Técnica utilizada para desenvolvimento de sistema • Utiliza notações bem-definidas • Significado descrito matematicamente • Evita a existência de ambigüidades • Permite a utilização de técnicas de verificação de erros e implementação automática
Aplicações em Linguagens de Programação • Interface entre projetistas, implementadores e usuários • Projetista: • Define precisamente a linguagem desejada • Permite a identificação precoce de erros • Implementador: • Possibilita a utilização de geradores (semi-)automáticos • Dificulta o aparecimento de erros • Usuários: Produção de bons manuais da linguagem
Ciclo de vida de LP baseado em especificações formais projeto especificação formal protótipos compiladores manuais, livros
Introdução • características principais de uma lp: • sintaxe • semântica • pragmática
Sintaxe • Define a forma e estrutura de uma linguagem • Símbolos, palavras, frases e sentenças (estruturas) • Principal formalismo: • Gramáticas Livres de Contexto e Expressões Regulares • Notação mais utilizada: BNF (Backus-Naur Form)
Gramáticas Livres de Contexto • Estrutura principal: Comando <-- [[ “if” Expressão “then” Comando “else” Comando ]] • Significado: • Um Comando da linguagem definida pode ser formado pela palavra chave “if” seguida de uma Expressão da linguagem, da palavra chave “then”, de um Comando da linguagem, da palavra chave “else”, e de um outro Comando da linguagem.
Sintaxe Concreta x Sintaxe Abstrata • Sintaxe concreta: Descreve a estrutura da linguagem com todos os detalhes. • Considera elementos “estéticos” como comentários, palavras reservadas, precedência de operadores, e outros “açucares sintáticos”. • Utilizado para construir reconhecedores para programas. • Sintaxe abstrata: Descreve apenas os elementos relevantes da linguagem de programação. • Ignora comentários e outros elementos que não contribuem para a semântica do programa • Utilizada para representar programas internamente no compilador
Ferramentas de Implementação • Disponíveis ferramentas que geram implementações eficientes: • lex+yacc, javacc, etc. • O desenvolvedor não utiliza linguagens de uso geral para implementação da linguagem. • Mais detalhes: Disciplina de compiladores
Introdução • características principais de uma lp: • sintaxe • semântica • pragmática
Semântica • Objetivo: • Descrever o significados das estruturas do programa expressos na sua sintaxe • Tipos de semântica • Semântica estática: Descreve as características de uma programa válido • Semântica dinâmica: Descreve os resultados da execução do programa
Formalismos Utilizados • Ao contrário da sintaxe, não existe ainda um formalismo aceito globalmente para descrever a semântica da linguagem • Exemplos de formalismos: • Semântica Operacional Estrutural, Máquinas de Estado Abstratas, Semântica Denotacional, Semântica de Ações, Montages, etc.
Abordagens para Descrição Semântica • A especificação semântica de uma linguagem pode: 1 - Definir um mapeamento entre a sintaxe do programa e seu significado. Ex.: Semântica Denotacional, Semântica de Ações, Semântica Algébrica, etc. 2 - Definir uma máquina que executa programas da linguagem. Ex.: Semântica Natural, Máquinas de Estado Abstratas.
Exemplo da 1a. Abordagem Semântica de [[ Exp1 “+” Exp2 ]] = Semântica de Exp1 Semântica de Exp2 Sum • A semântica traduz o programa em operadores de uma linguagem com significado conhecido
Exemplo 2a. Abordagem if (execute(x)=c1 and execute(y)= c2) then execute (x “+” y) = (c1+c2) • A semântica define como executar um programa diretamente, sem traduzi-lo para uma outra notação intermediária.
Semântica De Ações • Formalismo para definição de linguagens de programação. • Define um mapeamento da sintaxe do programa para o seu significado. • Significado de programa é dado através da notação de ações.
Notação de Ações • Biblioteca que descreve os principais conceitos encontrados em linguagens de programação que foram estudados nesse curso (valores, bindings, memória, etc.) • Durante essa aula e a próxima estudaremos os operadores que implementam cada conceito estudado. • Operadores que manipulam os mesmos conceitos são agrupados em facetas.
Definição de Ações • Uma ação é uma entidade que pode ser executada. • Quando uma ação é executada ela pode: • Terminar com sucesso • Terminar com um erro • Gerar uma exceção (escape) • Não-terminar (executar para sempre) • Durante a execução de uma ação ela produz e consome vários tipos de informação: (transientes, bindings, memória, etc.)
Definição • A faceta básica define operadores que não manipulam nenhum tipo de informação apenas controlam o fluxo do programa
Principais Operadores • complete -- Executa com sucesso sem produzir nenhuma informação. • fail -- Produz uma falha na execução da ação • a and then b -- Executa as ações a e bsequêncialmente • aorb -- Executa uma das ações e se esta falhar a outra ação será executada.
Principais Operadores (cont.) • unfolding a -- executa a ação a. • unfold -- Desvia o fluxo da execução para a última ação unfolding executada.
Exemplos de Ações: | complete |complete and then or | complete | fail | complete unfolding and then | | complete | fail | and then | | unfold
Exemplo de Descrições • Comandos vazio • Sintaxe: • Comando --> [[ “;” ]] • Semântica: • execute _ :: Comando --> action. • execute [[ “;” ]] = complete.
Exemplo de Descrições • Sequência de Comandos: • Sintaxe: • Comando --> [[ Comando Comando ]] • Semântica: • execute _ :: Comando --> action. • execute [[ c1 c2 ]] = | execute c1 and then | execute c2.
Definição • A faceta funcional define ações que manipulam valores temporários (transitórios) produzidos pela execução de um programa. • Utilização principal: Modelagem da avaliação de expressões em um programa.
Principais Operadores Funcionais • givee -- produz o valor resultante da avaliação da expressão e. • xthen y -- Executa as ações x e y seqüencialmente, os valores transitórios produzidos por x serão repassados para a ação y. • the given t # n -- Expressão (produtor) que recupera o n-ésimo valor passado para essa ação e verifica se este é do tipo t.
Exemplos de Ações give 10 | give 20 then | give sum(2,the given integer#1)
Exemplos de Ações(cont.) | | give 1 | and then | | give 2 then | give product(the given integer#1, | the given integer # 2)
Exemplo de Descrição • Linguagens de Expressões • 1 + 2 • 4 • 5 * 2
Exemplo de descrição • Constantes Numéricas. • Sintaxe: Expressão <-- [[ Integer ]]. • Semântica: avalie _ :: Expressão --> action. avalie [[ x : Integer ]] = give valuation of x.
Exemplo de descrição • Soma de Expressões. • Sintaxe: Expressão <-- [[ Expressão “+” Expressão ]]. • Semântica: avalie _ :: Expressão --> action. avalie [[ x “+” y ]] = |avalie x and then avalie y then | give sum(the given integer#1, the given integer#2).
Utilização • Qual a semântica de: 1 + 2
Utilização • Qual a semântica de “1 + 2” ? 1o Passo: Analise Sintática: 1 + 2 ==> [[ [[ “1” ]] “+” [[ “2” ]] ]]
Utilização • Qual a semântica de “1 + 2” ? 2o Passo: Executar Função Semântica: avalie [[ [[ “1” ]] “+” [[ “2” ]] ]]
Utilização • Qual a semântica de “1 + 2” ? 2o Passo: Executar Função Semântica: | | avalie [[ “1” ]] | and then | | avalie [[ “2” ]] then | give sum | (the given integer#1, the given integer # 2)
Utilização • Qual a semântica de “1 + 2” ? 2o Passo: Executar Função Semântica: | | give valuation of “1” | and then | | give valuation of “2” then | give sum | (the given integer#1, the given integer # 2)
Utilização • Qual a semântica de “1 + 2” ? 2o Passo: Executar Função Semântica: | | give 1 | and then | | give 2 then | give sum | (the given integer#1, the given integer # 2)
Definição • A faceta declarativa define ações que controlam os bindings de um programa (mapeamento de identificadores e seus significados) • Utilização em LP: Modelagem de Declarações em um programa.
Principais Operadores Declarativos • bind n to b -- Associa o identificador “n” ao significado “b”. • a hence b -- Executa as ações “a” e “b” seqüencialmente, os bindings produzidos pela ação “a” serão repassados para a ação “b” • the tboundto n -- Produtor que recupera o valor associado ao identificador “n” e testa se ele é do tipo “t”
Exemplos de Ações bind “x” to 10 | | bind “x” to 20 | and then | | bind “y” to 1 hence | give sum(the value bound to “x”, | the value bound to “y”)
Outros Operadores Declarativos • furthermore a -- Executa a ação “a” e produz a união entre os bindings recebidos pela ação os produzidos por “a”. • x moreover y -- Executa as ações “x” e “y” sendo que os bindings produzidos por “y” tem prioridade aos bindings produzidos por “x”. • x before y -- Executa a ação “x”, os bindings produzidos pela ação “x” são adicionados aos recebidos pela ação combinada e fornecidos para a ação “y”.
Exemplos: | bind “x” to 1 | bind “x” to 2 moreover before | bind “x” to 2 | bind “y” to the | integer bound to “x” | bind “x” to 1 hence | furthermore bind “y” to 2
Exemplo de Descrição • Linguagens com declarações: • let x = 1 in x + 2 • let x = 1 in let y = 3 in x * y + 1