Semântica de Linguagens de Programação Centro de Informática, UFPE Recife, Brasil
Objetivo e Motivação introduzir conceitos de semântica de linguagens de programação ênfase em aspectos importantes para uma compreensão mais precisa sobre programas e linguagens
Qual a semântica do seguinte programa? rode = program simples = var x : int := 3 in x := x + 5 end. ?
Aplicações importante para projetistas, implementadores e usuários (programadores) um padrão preciso para implementação documentação útil para o usuário uma ferramenta para projeto e análise de linguagens geração de compiladores
baseado em especificações formais 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 métodos de especificação semântica: semântica operacional semântica denotacional semântica axiomática
Sintaxe define a forma e estrutura de uma lp significado (semântica) para programas sintaticamente corretos símbolos, palavras, frases e sentenças (estruturas) BNF (Backus-Naur Form) é uma notação para expressar a estrutura sintática de uma linguagem
Sintaxe Concreta x Sintaxe Abstrata como construir árvores sintáticas de forma única (parse trees) z := x; x := y; y := z i := e, assign e to i, i = e, etc sintaxe abstrata estrutura de frases da linguagem independente de sinais de pontuação e disambiguação atribuição: i e
A Linguagem While (Nielson&Nielson‘92) Notação Sintática n será usada para representar numerais, Num x será usada para representar variáveis, Var a será usada para representar expressões aritméticas, ExpA b será usada para representar expressões booleanas, ExpB c será usada para representar comandos, Com
Sintaxe Abstrata de While a ::= n | x | a1 + a2 | a1 * a2 | a1 - a2 b ::= true | false | a1 = a2 | a1 < a2 | ~b | b1 and b2 c ::= x := a | skip | c1 ; c2 | if b then c1 else c2 | while b do c
Semântica Denotacional
Semântica Denotacional denotação (significado) são entidades matemáticas: números, funções, etc. estrutura básica de uma especificação: sintaxe abstrata domínios semânticos (álgebras semânticas) funções semânticas (funções de avaliação)
Semântica Denotacional (cont.) a função semântica mapeia as estruturas sintáticas de uma linguagem em significados a partir dos domínios semânticos. definida estruturalmente: o significado de uma frase (árvore de derivação) é determinado a partir do significado de suas subfrases (sub-árvores de derivação).
Semântica para Numerais Binários Sintaxe Abstrata n ::= 0 | 1 | n 0 | n 1 Domínios Semânticos N 0 : N, 1 : N, 2 : N, ... + : (N, N) -> N * : (N, N) -> N Funções Semânticas N : Num -> N N [[ 0 ]] = 0 N [[ 1 ]] = 1 N [[ n 0 ]] = 2 * N [[ n ]] N [[ n 1 ]] = 2 * N [[ n ]] + 1
Qual o valor do numeral 101? O valor de 101 é N [[ 101 ]]! N [[ 101 ]] = 2 * N [[ 10 ]] + 1 = 2 * (2 * N [[ 1 ]]) + 1 = 2 * (2 * 1) + 1 = 5
Semântica Denotacional para While Booleanos (B) Identificadores (Id) Números Inteiros (Z) Estado (Memória) e : Estado = Id -> Z e ( x ) (projeção) e [ v / x ] (atualização) Representando o estado através de tabelas Representando o estado através de uma mapeamento
Semântica para Expressões Aritméticas de While A : ExpA -> (Estado -> Z) A [[ n ]] e = N [[ n ]] A [[ x ]] e = e (x) A [[ a1 + a2 ]] e = A [[ a1 ]] e + A [[ a2 ]] e A [[ a1 * a2 ]] e = A [[ a1 ]] e * A [[ a2 ]] e A [[ a1 - a2 ]] e = A [[ a1 ]] e - A [[ a2 ]] e
Exemplo. Qual a semântica de x + 1? Suponha que s (x) = 3. Então: A [[ x + 1 ]] s = A [[ x ]] s + A [[ 1 ]] s = s (x) + N [[ 1 ]] = 3 + 1 = 4 Note que 1 é um numeral (entre colchetes sintáticos) enquanto que 1 é um número.
Semântica para Comandos de While C : Com -> (Estado ~> Estado) C [[ x := a ]] e = let v = A [[ a ]] e in e [v/x] C [[ skip ]] e = e C [[ c1 ; c2 ]] e = C [[c2]] (C [[ c1 ]] e) C [[ if b then c1 else c2 ]] e = B [[ b ]] e -> C [[ c1 ]] e | C [[ c2 ]] e C [[ while b do c ]] = ...
Semântica Operacional
Semântica Operacional foco em “como” programas são executados e não nos resultados da execução como os “estados” são modificados duas abordagens: semântica natural: descreve como o resultado global de execuções é obtido semântica operacional estrutural: descreve como os passos individuais das computações ocorrem
Semântica Natural para While sistema de transição (regras de inferência) <c, e> representa que o comando c deve ser executado a partir do estado e e representa o estado final <c, e> -> e’ (transição) regra <c1, e1> -> e1’ ... <cn, en> -> en’ if ... <c, e> -> e’
Semântica Natural para While <x := a, e> -> e [x |->A [[a]] e] (atr) <skip, s> -> s (skip) <c1, e> -> e’ <c2, e’> -> e’’ <c1 ; c2, e> -> e’’ (comp) <c1,e> -> e’ <if b then c1 else c2, e> -> e’ if B [[b]] e = true (if-true) <c2, e> -> e’ <if b then c1 else c2, e> -> e’ if B [[b]] e = false (if-false)
Semântica Natural para While (cont.) <c,e> -> e’ <while b do c, e’> -> e’’ <while b do c, e> -> e’’ if B[[b]] e = true (while-true) <while b do c, e> -> e if B[[b]] e = false (while-false)
Resumo sintaxe, semântica e pragmática sintaxe concreta x sintaxe abstrata vários formalismos para especificação de lp semântica denotacional semântica natural
Algumas Referências Semantics with Applications, A Formal Introduction. H. R. Nielson e F. Nielson. Wiley 1992. Denotational Semantics, A Methodology for Language Development. D. A. Schmidt. Allyn and Bacon, 1986. Natural Semantics. Gilles Khan. LNCS #247, 1987.
Semântica de Linguagens de Programação Centro de Informática, UFPE Recife, Brasil