|
Exercíıcios referentes ao conteúdo ministrado no 1º bimestre. Lista entregue dia 06/10/2008 no início da aula da matéria.
1. Aspectos preliminares (capítulo 1)- Quais são as desvantagens de haver demasiados recursos em uma linguagem de programação?
R: Linguagem com muitos componentes básicos é mais difícil de ser aprendida do que uma linguagem com poucos componentes básicos. Os programadores tendem a aprender um subconjunto de uma linguagem grande e ignorar o resto. Além do mais, o multiplicidade de recursos pode atrapalhar o programador, quando há diversas maneiras de executar a mesma tarefa.
- O que significa um programa confiável?
R: Diz-se que um programa é confiável se ele se comportar de acordo com suas especificações sob todas as condições:
- Verificação de Tipos: testar de existe erros de tipos ou em tempo de compilação ou em tempo de execução.
- Manipulação de Exceções: é um grande auxílio para a confiabilidade. (Ada, C++, Java).
- Aliasing: em algumas linguagens, o Aliasing é usado para superar deficiências nas facilidades de abstração de dados. Outras linguagens o restrigem muito para aumentarem sua conabilidade.
- Legibilidade e Capacidade de Escrita: Quanto mais fácil é escrever um programa, mais probabilidade ele tem de ser correto. A legibilidade afeta a confiabilidade tanto nas fases de escrita como nas de manutenção no ciclo de vida.
- Qual é o nome da categoria de linguagens de programação cuja estrutura é determinada pela arquitetura de computador de Von Neumann?
R: As linguagens baseadas na arquitetura de Von Neuman são chamadas Imperativas, e tem como recurso central, graças a essa arquitetura, as variáveis, que modelam as células de memória.
- A primeira linguagem de programação de alto nível que você aprendeu foi implementada com um interpretador puro, com um sistema de implementação híbrido ou com um compilador? Diga qual foi a linguagem e justifique a sua resposta.
R: VBA: foi implementada com um sistema híbrido (o codigo VBA é compilado em P-code e aí executado pela máquina virtual Microsoft Basic).
- Escreva uma avaliação de alguma linguagem de programação que você conheça, usando os critérios descritos no capítulo 1 do livro [1]
R: Python
2. Evolução das principais linguagens de programação-
Qual era a primeira área de aplicação dos computadores na época em que o FORTRAN foi projetado? Explique como a principal área de aplicação da época influenciou o projeto da linguagem FORTRAN. R: Basicamente aplicações científicas. Não existiam metodologias e ferramentas de desenvolvimento. As máquinas eram lentas, mas ja faziam cálculos de ponto flutuante. A Eficiência da geração do código-objeto era o mais importante, por causa do elevado custo da mão de obra (hora/homem de trabalho). - Qual a linguagem foi projetada para descrever a sintaxe do Algol 60 ?
R: Foi a linguagem BNF (Backus-Naur Form). Como o ALGOL 60 foi projetado por um comitê/grupo internacional, esse formalismo se tornou necessário. -
Qual o grupo de usuários era o alvo na primeira versão do BASIC? Explique como isto influenciou o projeto da linguagem BASIC. R: O principal grupo de usuários para o Basic eram o Estudantes não-científicos eo usuário mais "doméstico". Esse foco influenciou no projeto da linguagem, pois graças a isso, buscou-se construir uma linguagem que:
- Fosse fácil de aprender
- Agradável e amigável
- Oferecer rápido retorno para o trabalho de casa
- Permitir acesso livre e privado
- Faça uma pesquisa nos sites das principais empresas, instituições de ensino, instituições de pesquisa, grupos de usuários de código aberto e enciclopédias (MIT, ACM, IBM, DARPA, SUN, Google, Wikipedia, Apache Software Foundation, Microsoft, entre outros) sobre as tendências e necessidades para novas linguagens de programação. Esboce um texto de uma página sobre o assunto. Se necessário, utilize exemplos de linguagens criadas recentemente, tais como Ruby.
R:
3. Descrevendo a sintaxe e a semântica. Nomes, vinculações, verificação de tipos e escopos (capítulos 3 e 4)- Defina Sintaxe e Semântica.
R: A sintaxe de uma linguagem é a forma como é escrita, suas expressões, instruções e unidades de programação. Semântica é o significado dessas construções.
- A quem se destina as descrições de linguagem?
R: As descrições da linguagem a princípio se destinam ao programador, pois ele saberá ali como utilizar a linguagem e quais tipos de construções tal linguagen suportará.
- Defina vinculação estática e dinâmica
R: A Vinculação é definida como estática quando acontece antes do tempo de execução, e permanece inalterada durante a execuão do programa. Se ela for definida em tempo de execução ou for alterada durante esse, é dita dinâmica.
- Defina variáveis estáticas, stack-dinâmicas, heap-dinâmicas explícitas e heap-dinâmicas implícitas. Quais são as vantagens e as desvantagens de cada uma?
R: As variáveis estáticas são aquelas que são vinculadas à memória antes do tempo de execução e permanecem inalteradas até que o programa encerre. Vantagens: sensível a história (subprogramas), eficiência (endereçamento direto) e não há overhead. Desvantagens: reduz flexibilidade (não suporta subprogramas recursivos).
Stack-dinâmicas: suas vinculações de armazenamento criam-se através das elaboração das instruções de declaração, mas com tipo estaticamente declarados. Vantagens: permite recursão útil, compartilhamento separado do espaço de memória para subprogramas. Desvantagens: overhead na alocação e desalocação e variáveis locais não podem ser sensíveis a história.
Heap dinâmicas explícitas: são celulas de memória sem nome (abstratas) alocadas e desalocadas por instruções explícitas , em tempo de execuçâo , especificadas pelo programador. Essas celulas podem ser referenciadas por variáveis de ponteiro ou referência. O heap é um conjunto de células de armazenamento altamente desorganizado devido a imprevisibilidade do seu uso. Vantagens: uso em estruturas dinâmicas: pilhas, filas, árvores. Desvantagens: o difícil uso correto e eficiência.
Heap-dinâmicas implícitas: são vinculadas ao armazenamento do heap apenas quando lhe são atribuídos valores. Todos seus atributos vinculam-se quando atribuídos. Vantagem: o maior grau de flexibilidade. Desvantagens: overhead e perda da detecção de erro pelo compilador. Exemplos: APL, algol 68 array flex.
- Defina coersão , erro de tipo, verificação de tipos e tipificação forte.
R: Coersão: quando a linguagem converte tipos autmaticamente para um operador, baseado nas regras do compilador. Erro de tipo: é a aplicação de um operador a um operando de tipo impróprio. Verificação de Tipos: é a atividade de garantir que os operandos de um perador sejam de tipos compatíveis. Tipificação forte: uma linguagem definida nessa categoria só a será se erros de tipo são sempre detectáveis.
- Quais as vantagens das constantes nomeadas?
R: Uma constante nomeada é uma variável vinculada a um valor somente no momento em que ela é vinculada a um armazenamento; seu valor não pode ser mudado pela instrução de atribuição ou por uma instrução de entrada. Assim, a vantagem de uma constante nomeada é garantir que um valor permanecerá inalterado durante toda a execução do programa.
- Algumas linguagens de programação são sem tipo. Quais são as vantagens e as desvantagens evidentes de não se ter tipos em uma linguagem?
R: Uma linguagem sem tipo permite uma maior flexibilidade, além de possibilitar construções mais arrojadas e dinâmicas (Vide Python; e Generics em Java), além de permitir que o programador não perca muito tempo fazendo verificações e conversões, em alguns casos (ganho com menos codificação). Porém, essa mesma flexibilidade pode acarretar muitos problemas detectáveis apenas em tempo de execução, mas somente quando o programa já apresentou erro. Assim, o programador teria que despender um grande tempo desenvolvendo try/catchs.
- Dado o código abaixo...
a) Se esta linguagem hipotética possuir escopo estático, qual o ambiente de referenciamento no subprograma sub2 R: Num escopo estático, o ambiente de referenciamento para a instrução Sub2 será o das variáveis definidas no ‘programa Principal’ (integer x,y) e também as variáveis definidas em Sub1 (char c).
b) Se esta linguagem hipotética possuir escopo dinâmico, qual o ambiente de referenciamento no subprograma sub2 R: O ambiente de referenciamento para a instrução Sub2 num escopo dinâmico será o das variáveis definidas no ‘programa Principal’ (integer x,y), visto que a instrução Sub2 está sendo chamada dentro dele. Porém, como Sub2 esta contido em Sub1, talvez haja um erro ao chamar Sub2 sem ter feito a chamada a Sub1. Caso tenha sido feita a chamada a Sub1, o ambiente de referenciamento também conterá as variáveis definidas em Sub1 (char c).
4. Tipos de dados (capítulo 5)- Quais são as questões de projeto relativas aos tipos string de caracteres?
R: As questões que devem ser analisadas ao projetas uma linguagem, em relação a String:
- Manipulação: As strings podem ser simplesmente um tipo especial de array de caracteres ou um tipo primitivo (sem nenhuma operação de subscrever ao estilo dos arrays)?.
- Tamanho: devem ter um tamanho estático ou dinâmico?
- Algumas operações que devem ser implementadas, e são relevantes para escolha do tipo de manipulação: Comparação, Concatenação, referenciamento de substring.
- Devem ser levadas questões de implementação também, como descritores para strings estáticas em tempo de compilação, e descritores para strings dinâicas em tempo de execução.
- Defina o que são tipos ordinais, enumeração e subfaixa.
R: Tipo ordinal é aquele cuja faixa de valores possíveis pode ser facilmente associada ao conjunto dos números inteiros positivos. Tipo enumeração é aquele em que todos os valores possíveis, os quais se tornam constantes simbólicas. Tipo subfaixa é uma subseqüência de um ordinal.
- Quais são as questões de projeto relativas aos arrays?
R: Quais tipos são legais para os subscritos? Quando as faixas de subscrito são vinculadas? Quantos subscritos são permitidos?
- Quais são os dois problemas comuns com os ponteiros?
R: Ponteiro que contêm o endereço de uma variável heap-dinâmica desalocada e uma variável alocada na heap que não está sendo apontada por ninguém.
5. Expressões e instruções de atribuição (Capítulo 6)- O que é um operador sobrecarregado?
R: Operador sobrecarregado ocorre quando um operador aritmético são usados para mais de uma finalidade.
- O que é avaliação curto-circuito?
R: Uma avaliação curto-circuito de uma expressão tem seu resultado determinado sem avaliar todos os operandos e/ou operadores. Linguagens que permitem esse tipo de avaliação se mostram superior no quesito velocidade de execução.
- Como C suporta expressões relacionais e booleanas?
R: C não tem nenhum tipo booleano e, dessa forma, nenhum valor booleano. Em vez disso, valores numéricos são usados para representá-los. Sendo zero considerado falso e todos outros valores considerados verdadeiro.
6. Estruturas de Controle no Nível da instrução (Capítulo 7)- Qual é a definição de estrutura de controle?
R: É uma instrução de controle e a coleção de comandos cuja execução ela controla.
- Qual é a definição de bloco?
R: Novos escopos estáticos definidos no meio de código executável. Essas variáveis são tipicamente stack-dinâmicas, de modo que têm seu armazenamento alocado quando a seção é introduzida, e desalocado quando ela é retirada.
- Quais as questões de projeto relativas às estruturas de seleção?
R: Qual é a forma e o tipo da expressão que controla a seleção? Pode-se selecionar uma instrução única ou um bloco? e Como o significado de seletores aninhados pode ser especificado (pela sintaxe ou por uma regra de semântica estática)?
- Quais são as questões de projeto referentes às instruções de laço controladas por contador?
R: Qual é o tipo/escopo da variável de laço? Que valor a variável de laço tem na sua finalização? Deve ser legal que a variável de laço ou os seus parâmetros sejam mudados no laço, e se assim for, a mudança afeta o seu controle e os parâmetros de laço devem ser avaliados somente uma vez para cada iteração?
- O que é uma instrução de laço pré-teste? E uma instrução de pós-teste?
R: Pré-teste quer dizer que o teste para finalização do laço ocorre antes do corpo do laço ser executado. Pós-teste significa que ele ocorre depois que o corpo do laço é executado.
- Qual é a diferença entre a instrução for do C++ e a do Java?
R: A instrução for do Java é semelhante à do C++, exceto que a expressão de controle de laço se restringe ao tipo booleano.
- Quais são as questões de projeto referentes as instruções de laço controladas logicamente?
R: O controle deverá ser de pré ou pós-teste? O laço controlado logicamente deverá ser uma forma especial de laço de contagem ou uma instrução lógica independente?
7. Subprogramas e Abstrações(capítulo 8 e capítulo 9)- O que são parâmetros formais? O que são parâmetros reais?
R: Os parâmetros reais são descritos na ordem de chamada, e os parâmetros formais são indicados no cabeçalho do subprograma.
- Quais são as vantagens e as desvantagens dos parâmetros nomeados?
R: Vantagem é a flexibilidade que ela proporciona ao programador. Desvantagens: Maior lentidão do processo em relação aos demais métodos, difícil implementação e menor legibilidade do código.
- Quais são as questões de projeto referentes aos subprogramas?
R: Qual método de passagem de parâmetro é usado, as variáveis locais são estaticamente ou dinamicamente alocadas, os tipos dos parâmetros reais são verificados em relação aos tipos dos parâmetros formais e se subprograma puderem ser passado com paramento, qual é o ambiente de referência desse subprograma.
- Quais são os três modelos semânticos de passagem de parâmetros?
R: Modo entrada (in mode), modo saída (out mode) e modo entrada/saída (inout mode).
- Quais são as construções que implementam abstração de processos, abstração de dados e abstração de processos e dados em uma única entidade?
R: Abstração de processos consiste em considerar um procedimento com uma operação bem definida como algo único, exemplo: funções, procedurese e métodos. Abstração de dados é a definição de um tipo de dado por seu comportamento e estado, exemplo: classe lista do Java e struct do C. Abstração de processos e dados união dos dois termos, exemplo: classe do Java.
8. Manipulação de exceções (capítulo 13)- Quais são as questões de projeto relativas à manipulação de exceções? Explique cada uma das questões utilizando a linguagem de programação Java como exemplo.
R: Como e onde os manipuladores de exceção são especificados? Qual é seu escopo? Como a ocorrência de uma exceção é vinculada a um manipulador de exceções? Onde a exceção continua? Se for o caso, depois que um manipulador de exceções conclui sua execução, como as exceções definidas pelo usuário são especificadas? Deve haver manipuladores de exceção padrão para programas que não fornecem seus próprios manipuladores? Exceções incorporadas podem ser explicitamente geradas? Os erros detectáveis por hardware são tratados como exceções que podem ser manipuladas? Ha exceções incorporadas? Deve ser possível desativar exceções?
9. Exercícios de Laboratório- Ponteiros são causadores...
R: a) Primeiro, na linha 4, é passado um endereço de memoria para o ponteiro t. Na linha 8, é incrementado o endereço de memória de t, por isso que ao final da execução a não recebe 10. Se comentarmos essa linha, a recebera 10 e sera alterado ao final. Se comentarmos a linha 8, No final do codigo a e t apontam para o mesmo endereço de memória.
b) Ao fazer a atribuição de d na linha 11, perdemos a referência a d
c) Ambas as variáveis estão apontando para um espaço de memória liberado pelo programa, ou seja, ele pode ser usado por qualquer outro programa e essas variáveis trarão lixo da memória. b é um ponteiro que ainda aponta para o endereço alocado em a. Não é como a referência em JAVA, mas sim um novo vinculo direto na memória
- Alias ocorre quando uma variável...
R: Em ambos os casos o valor da variável original foi alterado, mesmo que a atribuição tenha sido feita por sua 'alias'
- (Exemplo de variáveis constantes) Edite o programa seguinte, compile-o...
R: Na compilação, é exibido uma mensgaem de warning, pois esta sendo atribuído a um ponteiro de memória, uma string sem alterar o tipo da variável.
|