semÂntica - ppgsc.ufrn.brrogerio/material_auxiliar/clp20122_semantica.pdf · introdução •dessa...
TRANSCRIPT
Roteiro
• Introdução
• Sintaxe
• Semântica
• Dinâmica (Métodos formais)
• Operacional
• Axiomática
• Denotacional
• Estática
• Conclusão
• Referências
2
Introdução
• A tarefa de apresentar uma descrição concisa e inteligível de uma linguagem de programação (LP) é difícil, porém fundamental para o sucesso dela.
• Exemplos:
• ALGOL 60
• ALGOL 68
• Ambas concisas, mas as descrições eram de difícil entendimento e ineficiente implementação. Os níveis de aceitação de ambas as linguagens acima citadas sofreram em consequência disso.
• O grande objetivo de implementadores de LP’s é determinar clara e precisamente a descrição de uma linguagem. 3
Introdução
• Dessa forma, usuários devem ser capazes de codificar sistemas consultando manuais de referência da linguagem, normalmente única fonte de informação impressa autorizada sobre uma linguagem.
• O estudo da descrição de LP’s pode ser dividido em exames da sintaxe e da semântica.
• A sintaxe de uma LP é a forma de suas expressões, de suas instruções e de suas unidades de programa.
• A semântica por sua vez, é o significado destas três.
• Em uma LP, a semântica deve seguir-se diretamente da sintaxe.
• Descrever uma sintaxe é mais fácil que a semântica. 4
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
5
Sintaxe
• É a forma como as instruções de uma linguagem são escritas, mas sem atender ao seu significado.
• Exemplo em C:
while (<expressão>)
{
<instrução>
}
• Exemplo em Pascal:
while <expressão> do
begin
<instrução>
end;
7
Sintaxe
• O método mais usado para descrever formalmente a sintaxe das linguagens de programação é o BNF(Backus-Naur form).
• Definida por Peter Naur e melhorada por John Backus, daí o nome Backus-Naur form.
8
Semântica
• É a área de estudo de ciência da computação que se preocupa em especificar o significado (ou comportamento) de programas de computador e partes de hardware.
• Um dos objetivos é analisar um programa a partir somente da sintaxe da linguagem, sem necessariamente ter que executá-la.
• Exemplo:
while (<expressão>)
{
<instrução>
}
• Significado: enquanto o valor atual de <expressão> for verdadeiro executa <instrução>.
10
Semântica
• Algumas das razões para descrever semântica:
• Saber precisamente o que as instruções de uma linguagem fazem.
• As provas de exatidão do programa recorrem a descrição formal da semântica da linguagem.
• Ao contrário de sintaxe, não existe uma notação, ou um formalismo, amplamente aceito para descrever semântica.
• Porém, existem alguns métodos usados:
• Operacional, denotacional, axiomática, algébrica, de ações...
11
Semântica
• As regras semânticas são classificadas em:
• Semântica Dinâmica (Operacional, denotacional, axiomática)
• As regras semânticas são checadas em tempo de execução, descrevendo os resultados da execução do programa.
• Exemplo:
• O índice de um array está dentro do limite correto
• Divisão por zero
• Semântica Estática (algébrica, de ações)
• As regras semânticas são checadas em tempo de compilação, descrevendo as características de uma programa válido.
• Exemplo:
• Todo identificador deve ser declarado antes de ser usado
• Os parâmetros utilizados na chamada de uma função têm o tipo correto
12
Semântica Dinâmica Operacional
• O objetivo é descrever o significado de um programa ao executar as instruções em uma máquina, seja ela real ou simulada.
• As mudanças no estado da máquina (memória, registradores, etc.) definem o significado da instrução.
• Para entender o conceito considere uma instrução de linguagem de máquina. Digamos que o estado de um computador sejam os valores de todos os seus registradores e de suas localizações de memória, inclusive códigos de condição e registro de status. Ao se registrar o estado do computador, executar uma determinada instrução e depois examinar o novo estado da máquina, a semântica será clara: ela é representada pela mudança no estado do computador, causada pela execução da instrução.
14
Semântica Dinâmica Operacional
• Para usar a semântica operacional em linguagens de alto nível, uma máquina virtual é necessária • Definição de hardware...
• Construção de um interpretador puro...
• Semântica PODE ser descrita usando um interpretador puro para a linguagem.
• Problemáticas: • Complexidade hardware e do SO
• Computadores diferentes??
• Depende de algoritmos, não da matemática.
• Avaliação: • Bom se usado informalmente (manuais da linguagem, etc.)
• Extremamente complexa se usada formalmente (Ex. VDL)
15
Semântica Dinâmica Axiomática
• A semântica axiomática foi definida em conjunto com o desenvolvimento de um método para provar a exatidão dos programas que mostra a computação descrita por sua especificação, quando pode ser construída. Em uma prova, cada instrução de um programa tanto é precedida como seguida de uma expressão lógica (asserções) que especifica restrições a variáveis.
• Asserções que precedem uma instrução é chamada de pré-condição.
• Asserções que seguem imediatamente uma instrução é chamada de pós-condição.
17
Semântica Dinâmica Axiomática
• A pré-condição mais fraca é aquela que menos restringe a garantia da validade de uma pós-condição associada.
• Exemplo:
• soma = 2*x + 1; {soma > 1}
• A pré-condição mais fraca neste caso é {x > 0}.
• O exemplo acima é fruto da aplicação de um axioma para Instruções de Atribuição.
• P = Q𝑥→𝐸
• Onde P (pré-condição) é computado como Q (pós-condição) com todas as instâncias de x substituídas por E.
18
Semântica Dinâmica Axiomática
• A pré-condição mais fraca de uma sequência de instruções não pode ser descrita por meio de um axioma porque depende dos tipos particulares de instruções da sequência.
• Neste caso, a pré-condição somente pode ser descrita com uma regra de inferência.
• P = Q1𝑥→𝐸
• Q1 = Q2𝑦→𝐹
• Onde Q1 (pré-condição) é computado como Q2 (pós-condição) com todas as instâncias de y substituídas por F e P (pré-condição) é computado como Q1 (pós-condição) com todas as instâncias de x substituídas por E.
19
Semântica Dinâmica Axiomática
• Exemplo:
• 1) y = 3 * x + 1
• 2) x = y + 3
• {x < 10}
• A pré-condição da segunda atribuição é y < 7
• Essa será a pós-condição para a primeira. A pré-condição para a primeira instrução de atribuição agora poderá ser calculada.
• 3 * x + 1 < 7
• x<2
20
Semântica Dinâmica Axiomática
• Consideremos em seguida a regra de inferência para instruções de seleção. Consideremos somente as seleções que incluem cláusulas else.
• Essa regra indica que as instruções de seleção devem ser provadas para ambos os casos. A primeira instrução lógica acima da linha é a cláusula then; a segunda é a clausula else.
• Exemplo: • if ( x > 0) then
• y = y -1
• else y = y + 1
• Suponhamos que a pós-condição para essa instrução de seleção seja {y > 0}. Podemos usar o axioma para a atribuição na cláusula then.
• y = y -1 {y > 0} 21
Semântica Dinâmica Axiomática
• Isso produzirá {y -1 > 0} ou simplesmente {y > 1}.
• Aplicaremos agora à cláusula else
• y = y + 1 {y > 0}
• Isso Produzirá a pré-condição {y + 1 > 0} ou
• {y > -1}. Uma vez que {y > 1} => {y > -1}, a regra de consequência, nos permite usar {y > 1} para a pré-condição da instrução de seleção.
• Outra construção fundamental de uma linguagem de programação imperativa é o laço de pré-teste lógico, ou laço while. Computar a pré-condição mais fraca para um laço while é inerentemente mais difícil do que uma sequência, pois o número de iterações não pode ser previamente determinado em todos os casos. Em casos que esse número é conhecido, o laço pode ser tratado como uma sequência. 22
Semântica Dinâmica Axiomática
• O problema de computar a pré-condição mais fraca para laços é similar ao problema de provar um teorema sobre todos os números inteiros.
• O passo principal será encontrar uma hipótese
• O passo correspondente na semântica axiomática de um laço while é encontrar uma asserção chamada invariante de laço.
• A pré-condição mais fraca para o while deve garantir a verdade da invariante do laço.
• Assim, deve garantir a veracidade da pós-condição após a finalização do laço.
• Durante a execução do laço, a veracidade da invariante do laço não deve ser afetada pela avaliação da expressão booleana que controla o laço.
23
Semântica Dinâmica Axiomática
• Como encontrar o invariante?
• Usamos a pós-condição de laço Q para computar pré-condições para diversos números de iterações do corpo do laço, iniciando com nenhum.
• A seguinte função deve ser utilizada:
• wp(instrução, pós-condição) = pré-condição.
• Exemplo:
• while y < x do
y = y+1
• end
• {y = x}
• A pré-condição mais fraca é {y = x} 24
Semântica Dinâmica Axiomática
• Para uma iteração
• wp(y = y + 1, {y = x} )= {y + 1 = x} , ou {y = x - 1}
• Para duas iterações
• wp(y = y + 1, {y = x-1} )= {y + 1 = x-1} , ou {y = x - 2}
• Para três iterações
• wp(y = y + 1, {y = x-2} )= {y + 1 = x-2} , ou {y = x - 3}
• Basta {y<x} para uma ou mais iterações ou simplesmente {y<=x}
• Devemos assegurar que nossa escolha satisfaça a 5 critérios:
• A pré-condição deve ser o invariante;
• O invariante é a pré-condição e pós-condição para a condição verdadeira do while;
• O invariante e a condição verdadeira do while são pré-condições para a instrução do while e o invariante é a pós-condição;
25
Semântica Dinâmica Axiomática
• O invariante e a condição negada do while são pós-condição;
• E que o laço encerra-se.
• Terceiro critério:
• {y <=x and y<>x} y = y +1 {y <=x}
• y = y + 1 {y <= x}
• {y+1<=x} que é equivalente a {y < x}
• Quarto critério:
• {(y<=x) and (not(y<>x))} => {y = x}
• {(y<=x) and (y=x)} => {y=x}
• {y=x} => {y=x}
• A finalização do laço
• {y <= x} while y<x do y = y + 1 end{y=x} 26
Semântica Dinâmica Denotacional
• É o método mais rigoroso, bastante conhecido para descrever o significado de programas.
• O método mais abstrato de descrição da semântica.
• Baseia-se solidamente na teoria de funções recursivas.
• O processo de construção da especificação denotacional para uma linguagem define um objeto matemático para cada entidade da linguagem
• Define uma função que mapeia instâncias das entidades da linguagem em instâncias dos correspondentes objetos matemáticos;
• Nome é DENOTACIONAL pois os objetos matemáticos denotam o significado de suas entidades sintáticas correspondentes.
28
Semântica Dinâmica Denotacional
• Exemplo:
• A função semântica Mbin, relaciona os objetos sintáticos com valores decimais
• <num_bin> → 0 | 1 | <num_bin> 0 | <num_bin> 1
• Definindo Mbin: • Mbin(‘0’) = 0 • Mbin(‘1’) = 1 • Mbin(<num_bin> ‘0’) = 2*Mbin(<num_bin>) • Mbin(<num_bin> ‘1’) = 2*Mbin(<num_bin>) + 1
• Por exemplo: • Mbin(‘1010’) = 2*Mbin(‘101’) = 2*(2*Mbin(‘10’)+1)= 2*(2*(2*Mbin(‘1’))+1)= 2*(2*(2*(1))+1)= 10 29
Semântica Dinâmica Denotacional
• Operacional vs Denotacional:
• Na semântica operacional, as mudanças de estados são definidas por algoritmos codificados;
• Na semântica denotacional, as mudanças de estados são definidas por funções matemáticas.
30
Semântica Estática
• Em resumo pode-se entender Semântica Estática como o conjunto de restrições que determinam se programas sintaticamente corretos são válidos.
• Compreende checagem de tipos, análise de escopo de declarações, checagem de número e tipo de parâmetros de funções/procedimentos, ou seja, checagem em tempo de compilação.
• Exemplo:
• Todo identificador deve ser declarado antes de ser usado.
• Os parâmetros utilizados na chamada de uma função têm o tipo correto.
32
Conclusão
• Existem três métodos principais de descrição das regras semânticas dinâmicas: operacional, axiomático e denotacional. A semântica operacional é um método para descrever o significado de construções de linguagem em termos de seus efeitos sobre uma máquina ideal. A semântica axiomática, que se baseia na lógica formal, foi idealizada como uma ferramenta para provar a exatidão de programas. Na semântica denotacional, objetos matemáticos são usados para representar os significados das construções de linguagem. As entidades de linguagem são convertidas nesses objetos matemáticos com funções recursivas.
• Dessa forma mesmo não sendo notações universais, podemos contar com esses métodos para descrever bem a semântica, evitando assim ambiguidades na definição da linguagem e outros problemas que podem surgir ao se utilizar uma Linguagem de programação.
33