Paradigmas de Linguagens de Programação Linguagem Imperativa 1 Augusto Sampaio e Paulo Borba Centro de Informática Universidade Federal de Pernambuco Explorando Conceitos • Variáveis e memória, variáveis compostas, arrays, alocação dinâmica de memória, persistência • Comandos de atribuição, composição colateral e paralela, comandos condicionais, comandos iterativos, expressões com efeitos colaterais Variáveis e Memória • Uma memória é uma coleção de células, onde cada célula tem – status: alocada ou não – conteúdo: um valor armazenável ou undefined • Uma variável – contém um valor, o qual pode ser inspecionado e atualizado – é implementada por uma ou mais células Variáveis e Memória • Memória abstrata: – {x 5 , y 9, z ‘a’} (Id Valor) • Memória concreta: – Associações: {x 13 , y 72, z 00} (Id Ref) – Memória: {00 ‘a’, ..., 13 5, ..., (Ref Valor) 72 9, ..., 99 undefined} Variáveis e Memória • A avaliação de variáveis é feita de forma diferente de acordo com a sua posição no comando de atribuição: – L-value • o endereço da célula de memória que implementa a variável (referência) – R-value • o valor armazenado na célula de memória que implementa a variável (conteúdo) Variáveis Compostas • Agrupamentos de variáveis componentes: – record de Pascal, struct de C – arrays • Atualização – seletiva – total Arrays • Alternativas para a definição dos limites de um array: – estático, determinado em tempo de compilação – dinâmico, determinado no momento da criação (inicialização) da variável – flexível, não é determinado em nenhum momento Alocação Dinâmica de Memória • Variáveis criadas por declarações: – locais, existem durante às execuções do bloco – globais e estáticas, existem durante a execução do programa • Variáveis da heap, criadas por comandos: – criadas e destruídas em qualquer parte do programa, por comandos especiais – anônimas, acessadas via ponteiros – referências pendentes Persistência • Arquivos são valores compostos como outros quaisquer • Qualquer variável deveria poder ser – transitória – persistente • Linguagens normalmente dividem os tipos em transitório e persistente • Type completness principle – todos os tipos de uma linguagem devem ser disponíveis tanto para variáveis transitórias quanto persistentes Comandos • Construção que, quando executada, atualiza variáveis • Um ponto de entrada, um ponto de saída • Múltiplos pontos de entrada, múltiplos pontos de saída: – goto (de C), throw (de Java), continue e break (de C e Java) Atribuição • Forma geral – AcessoVariável := Expressão • Atribuições múltiplas – AV := AV’ := AV’’ := Expressão • Atribuições simultâneas – AV, AV’ := Expressão, Expressão’ Composição Colateral e Paralela • Colateral: Comando , Comando’ – os dois comandos são executados, em uma ordem qualquer – não determinismo • Paralela: Comando || Comando’ – os dois comandos são executados, de maneira concorrente – concorrência e não determinismo – Composição seqüencial e colateral são casos especiais Comandos Condicionais • Não-determinísticos: – if Expressão1 then Comando1 | Expressão2 then Comando2 ... | ExpressãoN then ComandoN end if • Baseados em valores não booleanos: – case (de Pascal), switch (de C) Comandos Iterativos • Variam de acordo com o número de iterações: – definido, com variável e seqüência de controle, for (de Pascal e C) – indefinido, while (de Pascal e C) • A seqüência de controle não tem que ser uma progressão aritmética, definida por constantes Expressões com Efeitos Colaterais • Expressões comandos: retornam valores e alteram os valores de variáveis – funções (de Pascal e C) – o.m() + o.m() diferente de 2 * o.m() • Linguagens orientadas a expressões: – nenhuma distinção entre expressões e comandos (Algol 68, ML, C) – AV := (AV := Expressão) Leitura • Programming Language Concepts and Paradigms – Capítulo 3 (exceto a Seção 3.5.3) Exercícios e Projetos • Estenda a Linguagem Imperativa 1 com os seguintes recursos: – declaração de variável em qualquer ponto de um bloco, como em Java – comandos continue e goto de C – arrays e records de Pascal – ponteiros de Pascal – tratamento de exceções como em Java, mas passando para o throw uma string, não um objeto