semÂntica - ppgsc.ufrn.brrogerio/material_auxiliar/clp20122_semantica.pdf · introdução •dessa...

34
SEMÂNTICA Rogério Rocha program simples = var x : int := 3 in x := x + 5 end. rode = ?

Upload: tranthu

Post on 09-Mar-2018

218 views

Category:

Documents


2 download

TRANSCRIPT

SEMÂNTICA

Rogério Rocha

program simples =

var x : int := 3

in

x := x + 5

end.

rode = ?

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

6

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

9

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

13

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

16

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

27

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

31

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

Referência

• SEBESTA, ROBERT W. Conceitos de Linguagens de programação. 5ª ed. Editora Bookman. 2006. 635 p.

34