Pragmática das Linguagens de Programação 2004/2005



Documentos relacionados
Tabela de Símbolos. Análise Semântica A Tabela de Símbolos. Principais Operações. Estrutura da Tabela de Símbolos. Declarações 11/6/2008

Introdução à Programação. Interface, Polimorfismo e Dynamic Binding

Programação Estruturada. Programação Estruturada. Idéias Básicas da Programação Estruturada

Análise de complexidade

Linguagens de Programação Aula 10

5. Generics, Iterators e Comparable em Java. Tipos de Dados Abstractos Generics em Java

Conceitos básicos de programação

3 Classes e instanciação de objectos (em Java)

Unidade IV: Ponteiros, Referências e Arrays

Programação Engenharia Informática (11543) 1º ano, 1º semestre Tecnologias e Sistemas de Informação (6619) 1º ano, 1º semestre

Hugo Pedro Proença, 2007

JAVA 1.5 na plataforma J2SE 5.0 Tiger Novas Construções, Sintaxe, Tipos e Polimorfismo

Geração de código intermediário. Novembro 2006

PHP. Hypertext Pre-Processor

Curso: Ciência da Computação Disciplina: Construção de Compiladores Período: Prof. Dr. Raimundo Moura

Introdução à Lógica de Programação

Sintaxe e Semântica. Fases da Compilação. programa fonte

Esta dissertação apresentou duas abordagens para integração entre a linguagem Lua e o Common Language Runtime. O objetivo principal da integração foi

ARRAYS. Um array é um OBJETO que referencia (aponta) mais de um objeto ou armazena mais de um dado primitivo.

Informática II Cap. 3

Introdução à Programação com Classes em C++

Universidade da Beira Interior Cursos: Matemática /Informática e Ensino da Informática

Instituto Superior Politécnico de VISEU. Escola Superior de Tecnologia

Pragmática das Linguagens de

Tarefa Orientada 18 Procedimentos armazenados

Síntese. Compiladores. Geração de código intermediário. Linguagens Intermediárias. Modelo Clássico. Linguagens Intermediárias. Código intermediário

Laboratório de Programação. Aula 13 Java 5COP088. Aula 13 Genéricos e Conjuntos Java Prof. Dr. Sylvio Barbon Junior. Sylvio Barbon Jr barbon@uel.

Interpretação e Compilação de Linguagens de Programação Sintaxe e Semântica

LP II Estrutura de Dados. Introdução e Linguagem C. Prof. José Honorato F. Nunes honorato.nunes@ifbaiano.bonfim.edu.br

Pesquisa: localização de um Registo num Ficheiro (para aceder ao registo: ler/alterar informação) R. P. António Viera, 23. R. Carlos Seixas, 9, 6º

Module Introduction. Programação. Cap. 10 Estruturas (Structs)

BUSCA EM LISTAS LISTAS SEQÜENCIAIS, LISTAS SIMPLESMENTE E DUPLAMENTE ENCADEADAS E LISTAS CIRCULARES

Tabelas (arrays) (vetores, matrizes, etc) Algoritmos de pesquisa Algoritmos de ordenação

Estrutura de Dados Básica

Grupo I [6v] Considere o seguinte extracto de um programa de definição de uma calculadora apenas com a função soma de dois valores reais

Índice. Capítulo 2 Estrutura de Dados sequencial com armazenamento sequencial

Computabilidade 2012/2013. Sabine Broda Departamento de Ciência de Computadores Faculdade de Ciências da Universidade do Porto

Javascript 101. Parte 2

Estruturas de Dados I

Metodos de Programação

Computadores de Programação (MAB353)

2ª Lista de Exercícios

Paradigmas da Programação PPROG. Linguagem JAVA. Interfaces. (Livro Big Java, Late Objects Capítulo 9) Nelson Freire (ISEP DEI-PPROG 2013/14) 1/33

INTRODUÇÃO ÀS LINGUAGENS DE PROGRAMAÇÃO

Estruturas de Dados. Prof. Gustavo Willam Pereira Créditos: Profa. Juliana Pinheiro Campos

Estruturas de Dados. Parte dos slides a seguir são adaptações, extensões e traduções para C dos originais:

Minicurso de Python Aula 1. Raphael Lupchinski Marcelo Millani

Programação com Objectos Teste Teórico 04 de Janeiro de 2010, 09:00 (120 minutos)

O que é o JavaScript?

Laboratório 4. Base de Dados II 2008/2009

Geração de código. Ivan Ricarte INTRODUÇÃO À COMPILAÇÃO

Curso de PHP. FATEC - Jundiaí. A programação orientada a objetos (object-oriented oriented programming

PADI 2015/16. Aula 1 Introdução à Plataforma.NET

Programação por Objectos. Java

Orientação a Objetos

Universidade da Beira Interior Cursos: Engenharia Informática, Matemática /Informática e Ensino da Informática

EAD Árvore árvore binária

Pesquisa Sequencial e Binária

TIC Unidade 2 Base de Dados. Informação é todo o conjunto de dados devidamente ordenados e organizados de forma a terem significado.

Java. Marcio de Carvalho Victorino

Java 2 Standard Edition Como criar classes e objetos

Curso Adonai QUESTÕES Disciplina Linguagem JAVA

Um compilador é um programa que lê um programa escrito numa dada linguagem, a linguagem objecto (fonte), e a traduz num programa equivalente

Curso Técnico em Redes

Engenharia Informática

2 echo "PHP e outros.";

Flash MX ActionScript

Introdução a POO. Introdução a Linguagem C++ e POO

Lista de Contas: Assinatura. Lista de Contas. Listas de Contas: Descrição. Listas de Contas: Descrição. Listas de Contas: Descrição

AMBIENTE PARA AUXILIAR O DESENVOLVIMENTO DE PROGRAMAS MONOLÍTICOS

Algoritmos e Programação Estruturada

Grupo I [7v] 1. [1,0] Apresente o conteúdo do IDL relativo a este programa. Assuma PROGRAM=62015 e VERSION=1.

FBV - Linguagem de Programação II. Um pouco sobre Java

Introdução a Java. Hélder Nunes

Programação III / Estruturas de Dados. Enunciado do Trabalho Prático

5. Métodos ágeis de desenvolvimento de software

Possui como idéia central a divisão de um universo de dados a ser organizado em subconjuntos mais gerenciáveis.

Programação Concorrente em java - Exercícios Práticos Abril 2004

Árvores Binárias de Busca

Orientação a Objetos com Java

Algoritmos e Estruturas de Dados

Resumo da última aula. Compiladores. Tipos. Regras semânticas. Expressões de tipos. Análise Semântica e checagem de tipos.

DEPARTAMENTO DE ENGENHARIA INFORMÁTICA FACULDADE DE CIÊNCIAS E TECNOLOGIA DA UNIVERSIDADE DE COIMBRA

1 Máquina URM, comandos e programas URM

Estruturas de Repetição. Programação em Java Estruturas de Repetição

Programas simples em C

Técnicas de Programação II

1.6. Tratamento de Exceções

Algoritmos e Estrutura de Dados. Introdução a Linguagem Python (Parte I) Prof. Tiago A. E. Ferreira

Capítulo VI CORBA. Common Object Request Broker Architecture. [Cardoso2008] Programação de Sistemas Distribuídos em Java, Jorge Cardoso, FCA, 2008.

UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA INFORMÁTICA APLICADA

Análise semântica. Análise Semântica. Estrutura de um compilador. Anotação da árvore sintática. Tipos de comunicação de atributos?

Projeto de Banco de Dados

Conceito de classe em C++

Sistemas Informáticos

Noções sobre Objetos e Classes

Programação de Computadores

Métodos de Pesquisa 472

Transcrição:

Instituto Superior Técnico Pragmática das Linguagens de Programação 2004/2005 Segundo Exame 11/2/2005 Número: Turma: Nome: Escreva o seu número em todas as folhas do teste. O tamanho das respostas deve ser limitado ao espaço fornecido para cada pergunta. Pode usar os versos das folhas para rascunho. O exame tem 7 páginas e a duração é de 2.0 horas. A cotação de cada questão encontra-se indicada entre parêntesis. Boa sorte. 1. (2.0) Todos os fragmentos de programas que se apresentam em seguida estão escritos na linguagem. Para cada fragmento, assinale (usando os códigos seguintes), se se trata de um erro léxico (L), sintático (S), semântico estático (SE), semântico dinâmico (SD) ou, pelo contrário, trata-se de código correcto (). (a) (0.2) { int x; int x; } SE (b) (0.2) int y = 0; *y = 7; SE (c) (0.2) it s_money++ L (d) (0.2) int f() { int p; return p; } (e) (0.2) struct { int x; } p; p.y; SE

Número: 2 (f) (0.2) printf("%d\n", x, y, z); (g) (0.2) x = (((int)x)-*0))); S (parêntesis a mais) (h) (0.2) int x; struct x { int x; } y; (i) (0.2) { int x; { int x; } } (j) (0.2) if (x == 2) {return 1;}; else {return 2;}; S 2. (1.0) A linguagem (e seus descendentes) providenciam operadores para incremento (e decremento) que podem ser usados de forma prefixa ou posfixa. A expressão (prefixa) ++i é apenas açúcar sintático para a expressão equivalente i += 1 ou i = i + 1. onsegue arranjar traduções equivalentes para a expressão (posfixa) i++? Explique. A semântica da expressão i++ é devolver o valor de i antes de incrementar a variável. Isto implica que em qualquer forma equivalente terá de ser necessário declarar outra variável para guardar o valor anterior da variável i, realizar o incremento e retornar o valor guardado. Infelizmente, é impossível em declarar variáveis numa expressão e, consequemente, não é possível encontrar uma tradução equivalente que seja ainda uma expressão.

Número: 3 3. (1.0) Discuta as vantagens e desvantagens dos algoritmos de recolha de lixo (garbage collection) por contagem de referências (reference counting) ou de marcar e varrer (mark & sweep). 4. (2.0) onsidere o seguinte programa escrito na linguagem imaginária +/-. declare x = 2; sub f() { print x; } sub g() { declare x = 5; f(); print x; } g(); print x; (a) (1.0) Se admitirmos que a linguagem +/- possui âmbito léxico, qual é o output do programa? Explique. 2 5 2 (b) (1.0) Se admitirmos que a linguagem +/- possui âmbito dinâmico, qual é o output do programa? Explique. 5 5 2

Número: 4 5. (2.0) A linguagem não especifica se utiliza deep binding ou shallow binding. Porquê? A distinção entre deep binding e shallow binding só faz sentido quando a linguagem é de âmbito dinâmico e permite a criação de funções dentro de âmbitos mais estritos que o global. omo a linguagem é de âmbito léxico e apenas permite a criação de funções de âmbito global, essa distinção não é relevante. 6. (2.0) A linguagem imaginária +/- permite a definição de tipos estrutura usando uma sintaxe em tudo idêntica à da linguagem ++. onsidere o seguinte exemplo: struct A {B* x; int y;}; struct B {A* x; int y;}; Admita que a linguagem +/- emprega equivalência estrutural para tipos e admita que está a compilar uma atribuição do valor de uma variável do tipo struct A a uma variável do tipo struct B. Qual o problema que irá encontrar? Explique. A equivalência estrutural de tipos implica que os tipos têm de ser comparados até se atingirem os seus subtipos mais simples. Ora como quer a estrutura A, quer a a estrutura B se referem de forma recursiva, o processo que determinaria a equivalência estrutural não conseguiria atingir os seus tipos mais simples. 7. (4.0) onsidere o seguinte programa escrito na linguagem imaginária +/-: x = 2; array y = [1, 2, 3]; sub f(a, b) {b--; a = x - 1;} f(y[x], x); print x, y;

Número: 5 Admitindo que os arrays em +/- são indexados começando em zero, explique o que é que é escrito pelo programa anterior se: (a) (1.0) A linguagem empregar passagem por valor (call by value). 2 [1,2,3] Na passagem por valor, as alterações aos parâmetros não afectam os argumentos e, portanto, são invisíveis no exterior. (b) (1.0) A linguagem empregar passagem por referência (call by reference). 1 [1,2,0] O decremento de b muda o valor de x de 2 para 1 e é o valor 1-1 que é usado para actualizar a que se refere à posição y[2]. (c) (1.0) A linguagem empregar passagem por valor/resultado (call by value/result). 1 [1,2,1] Na passagem por valor/resultado o valor de x só é alterado quando a subrotina termina. Dentro desta, x continua a valer 2. (d) (1.0) A linguagem empregar passagem por nome (call by name). 1 [1,0,3] Na passagem por nome, x muda em simultâneo com o decremento b--, passando a valer 1. Por sua vez, o parâmetro a refere-se a y[x], i.e., a y[1] que é modificado para passar a ter o valor x - 1, i.e., 0. 8. (2.0) As linguagens ++ e Java consideram que os construtores de uma classe se distinguem apenas pela sequência de tipos dos parâmetros. Que problemas é que esta abordagem causa? Impossibilidade de ter dois construtores que recebem o mesmo tipo de argumentos. onstructor madness.

Número: 6 9. (2.0) É usual, na linguagem Java, empregar iteradores que enumeram os elementos das estruturas de dados. Estes iteradores obedecem à seguinte interface (simplificada): public interface Iterator { boolean hasnext(); Object next(); } Por exemplo, para enumerar os elementos de um Vector v podemos fazer: for (Iterator it = v.iterator(); it.hasnext(); )...it.next()... } onsidere agora o problema da enumeração das folhas de uma árvore binária. Discuta os problemas de implementação em Java de um iterador para essas folhas (que obedeça à interface Iterator) versus o que é possível (e usual) fazer-se em linguagens como lu ou Icon. O problema é que a enumeração das folhas de uma árvore é feita facilmente empregando recursão mas não é possível empregar recursão para implementar o iterador pois este, a cada elemento produzido, tem de passar o controle para o consumidor dos elementos. A alternativa é transformar a recursão em iteração através da utilização de um stack auxiliar que regista o caminho até à folha actual da árvore. Este stack fará parte do estado que é necessário guardar entre invocações do iterador. Em linguagens como lu e Icon, o processo de iteração é implementado por intermédio de corrotinas que vão passando o controle entre o iterador e o consumidor, sem necessitarem de estruturas intermédias para preservar o estado da iteração. ontudo, isto implica que não é possível utilizar o stack da máquina para implementar as invocações e retorno de subrotinas pois estas não estão ordenadas.

Número: 7 10. (1.0) O que é uma classe abstracta? Para que serve? 11. (1.0) Na linguagem ++, se foo é uma classe abstracta então não é possível declarar variáveis do tipo foo. ontudo, é permitido declarar variáveis do tipo foo*. Explique.