1 Semântica de Linguagens de Programação Centro de Informática, UFPE Luis Carlos...

Post on 19-Apr-2015

107 views 0 download

Transcript of 1 Semântica de Linguagens de Programação Centro de Informática, UFPE Luis Carlos...

1

Semântica de Linguagens de Programação

Centro de Informática, UFPE

Luis Carlos (lcsm@cin.ufpe.br)Hermano Moura (hermano@cin.ufpe.br)

2

Objetivo

Introduzir conceitos de semântica formal de linguagens

de programação

program simples =var x : int := 3

inx := x + 5

end.

=

Motivação: Qual o significado do seguinte programa?

?

4

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

5

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

6

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

projeto

compiladoresmanuais,livros

protótipos

especificaçãoformal

Ciclo de vida de LPbaseado em especificaçõesformais

8

Introdução características principais de uma lp:

sintaxe semântica pragmática

9

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)

10

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.

11

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

12

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

13

Introdução características principais de uma lp:

sintaxe semântica pragmática

14

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

15

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.

16

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.

17

Exemplo da 1a. Abordagem

Semântica de [[ Exp1 “+” Exp2 ]] =Semântica de Exp1Semântica de Exp2Sum

A semântica traduz o programa em operadores de uma linguagem com significado conhecido

18

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.

19

Semântica De Ações

20

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.

21

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.

22

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.)

23

Semântica de Ações - Faceta Básica

24

Definição A faceta básica define operadores que

não manipulam nenhum tipo de informação apenas controlam o fluxo do programa

25

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 b

sequêncialmente a or b -- Executa uma das ações e se

esta falhar a outra ação será executada.

26

Principais Operadores (cont.) unfolding a -- executa a ação a. unfold -- Desvia o fluxo da execução

para a última ação unfolding executada.

27

Exemplos de Ações:

| complete |completeand then or| complete | fail

| complete unfoldingand then | | complete| fail | and then

| | unfold

28

Exemplo de Descrições Comandos vazio Sintaxe:

Comando --> [[ “;” ]] Semântica:

execute _ :: Comando --> action. execute [[ “;” ]] = complete.

29

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.

30

Semântica de Ações - Faceta Funcional

31

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.

32

Principais Operadores Funcionais give e -- produz o valor resultante da

avaliação da expressão e. x then 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.

33

Exemplos de Ações

give 10

| give 20then| give sum(2,the given integer#1)

34

Exemplos de Ações(cont.)

| | give 1| and then| | give 2then| give product(the given integer#1, | the given integer # 2)

35

Exemplo de Descrição Linguagens de Expressões

1 + 2 4 5 * 2

36

Exemplo de descrição Constantes Numéricas. Sintaxe:

Expressão <-- [[ Integer ]]. Semântica:

avalie _ :: Expressão --> action.avalie [[ x : Integer ]] = give valuation of

x.

37

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).

38

Utilização Qual a semântica de: 1 + 2

39

Utilização Qual a semântica de “1 + 2” ?1o Passo: Analise Sintática:

1 + 2 ==> [[ [[ “1” ]] “+” [[ “2” ]] ]]

40

Utilização Qual a semântica de “1 + 2” ?2o Passo: Executar Função Semântica:

avalie [[ [[ “1” ]] “+” [[ “2” ]] ]]

41

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)

42

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)

43

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)

44

Semântica de Ações: Faceta Declarativa

45

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.

46

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 t bound to n -- Produtor que recupera o valor associado ao identificador “n” e testa se ele é do tipo “t”

47

Exemplos de Ações

bind “x” to 10

| | bind “x” to 20| and then| | bind “y” to 1hence| give sum(the value bound to “x”, | the value bound to “y”)

48

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”.

49

Exemplos:| bind “x” to 1 | bind “x” to 2moreover before| bind “x” to 2 | bind “y” to the

| integer bound to “x”

| bind “x” to 1hence| furthermore bind “y” to 2

50

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

51

Exemplo de descrição Declaração de Constantes. Sintaxe:

Expressão <--[[ “let” Identifier “=“ Expressão “in” Expressão ]].

Semântica:avalie _ :: Expressão --> action.elabore [[ “let” i “=“ x “in” y ]] = | furthermore | | avalie x then bind token of i to the given value hence | avalie y.

52

Exemplo de descrição Expressões de Constantes. Sintaxe:

Expressão<--[[ Identifier ]]. Semântica:

avalie _ :: Expressão --> action.avalie [[i : Identifier]] = give the value bound “i”.

53

Semântica de Ações:Faceta Imperativa

54

Definição A faceta imperativa define ações que

manipulam a memória do programa Utilizada principalmente na

declaração de variáveis

55

Principais Ações allocate a cell -- reserva uma posição de

memória livre e retorna o valor alocado como valor transitório

deallocate c -- libera a posição de memória “c”

store x in c -- armazena o valor “x” na célula de memória “c”.

the t stored in c -- Expressão que recupera o valor armazenado na posição de memória c.

56

Exemplos de Ações

| allocate a cellthen| | store 10 in the given cell| and then| | store 20 in the given cell| and then| | give the integer stored in the given cell.

57

Exemplo de Descrição Linguagem com declarações e

variáveis e comandos imperativos:int x;int y;x = 1;y = x + 1;

58

Exemplo de Descrição Declaração de Variáveis Sintaxe:

Declaração <-- [[ “int” Identifier ]] . Semântica:

elabore _ :: Declaração --> action. elabore [[ “int” i ]] =

| allocate a cellthen| bind token of i to the given cell.

59

Exemplo de Descrição Comando de Atribuição Sintaxe:

Comando <-- [[ Identifier “=” Expressão]] . Semântica:

execute _ :: comando --> action. execute [[ c “=” e ]] =

| avalie ethen| store the given value in the cell bound to token to c.

60

Exemplo de Descrição Comandos com declarações locais de

variáveis Sintaxe:

Comando <-- [[ Declaração Comando ]] . Semântica:

execute _ :: Comando --> action. execute [[ d:Declaração c:Comando ]] =

| furthermore elaborate dhence| execute c.

61

Exemplo de Descrição Comando While Sintaxe:

Comando <-- [[ “while” Expressão “do” Commando “endwhile” ]] Semântica:

execute [[ “while” e “do” c “endwhile” ]] = unfolding| | avalie e| then| | | check the given value is true and then | | | execute c and then unfold| | or| | | check the given value is false.

62

Notação de Ações:Faceta Reflexiva

63

Descrição A Faceta Reflexiva define operadores

capazes de encapsular ações na forma de abstrações.

Utilizada principalmente na modelagem de procedimentos e funções.

64

Principais Operadores abstraction of a -- Expressão que retorna uma

abstração que incorpora a computação definida por “a” enact e -- Avalia a expressão “e” e se ela retornar uma

abstração executa-a. Caso contrário gera uma mensagem de erro.

closure a -- modifica a abstração “a” de forma a incorporar os bindings correntes durante a avaliação de “a”.

application of a to v -- define uma abstração semelhante a abstração “a” mas que quando for executada receberá “v” como valores transitórios.

65

Exemplos| give abstraction of | | bind “a” to 5| | give 10 | hencethen | | give closure abstraction of | enact the given abstraction. | | | give the integer bound to

“a”then

| give abstraction of | enact the given abstraction| | give the given integerthen| enact application the given| abstraction to 5

66

Exemplos de Descrição Declaração de Procedimentos Sintaxe:

Declaração <-- [[ “proc” Identifier “is” Commando “end” ]].

Semântica: elabore [[ “proc” i “is” c “end” ]] =

bind token of i to closure abstraction of| execute c.

67

Exemplos de Descrição Chamada a procedimento Sintaxe:

Comando <-- [[ Identifier “()” ]] . Semântica:

execute [[ i “()” ]] =enact the abstraction bound to i.

68

Pratica

69

Baixe os Seguintes Arquivos http://www.cin.ufpe.br/~rat/download/abaco-beta230.zip http://www.cin.ufpe.br/~if686/laboratorio.prj

Descompacte o arquivo Zip em um diretório de trabalho. Execute o arquivo abaco2.30.jar.