Instituto Federal de Educação, Ciência e Tecnologia Curso: Bacharelado em Ciência da Computação Disciplina: Paradigmas de Linguagens Professores: Walace de Almeida Rodrigues/Mário Luiz Rodrigues Oliveira Atividade: 3ª Lista de Exercícios Formiga, MG, 6 de abril de 2014 INSTRUÇÕES 1. Esta lista de exercícios poderá ser resolvida em grupo com no máximo 3 integrantes. 2. Caso você ache que falta algum detalhe nas especificações, você deverá fazer as suposições que julgar necessárias e escrevê-las com as suas respostas. Pode acontecer também de algum enunciado conter dados e/ou especificações supérfluas para a solução de alguma pergunta específica. Utilize sua capacidade de julgamento para separar o supérfluo do necessário. 3. Entregue apenas uma resolução por grupo. 4. A data final para entrega desta lista de exercícios é o dia 11/04/2014, no início da aula. 5. Listas plagiadas serão desconsideradas, sendo atribuída nota 0 (zero) a todos os envolvidos. EXERCÍCIOS 1) Uma diferença significativa entre a definição de tipos primitivos em C e JAVA se refere ao intervalo de valores de cada tipo. Enquanto na linguagem de programação JAVA os intervalos foram fixados na definição da linguagem; na linguagem de programação C é a implementação do compilador que define esses intervalos. Compare estas duas abordagens, justificando a opção de cada uma dessas linguagens. 2) Muito embora a linguagem de programação JAVA seja fortemente influenciada pela linguagem C, os projetistas de JAVA resolveram incluir o tipo boolean, o qual não existe em C. Apresente vantagens e desvantagens da postura tomada pela linguagem C. Faça o mesmo em relação a linguagem JAVA. 3) A cardinalidade do tipo lógico (boolean) é dois. Sendo assim, é necessário apenas e tão somente um único bit para representá-lo. No entanto, geralmente ele é armazenado numa posição de memória que consome um byte ou até mesmo uma palavra de 4 bytes. Justifique essas escolhas. 4) Apresente funções que utilizem passagem de parâmetro por cópia (considere as 3 formas de implementação: in, out e in-out) e passagem de parâmetro por definição. Em seguida compare esses dois modos de passagem de parâmetros quanto à legibilidade, eficiência e facilidade de implementação (para o projeto de um compilador). Instituto Federal de Educação, Ciência e Tecnologia Curso: Bacharelado em Ciência da Computação Disciplina: Paradigmas de Linguagens Professores: Walace de Almeida Rodrigues/Mário Luiz Rodrigues Oliveira Atividade: 3ª Lista de Exercícios Formiga, MG, 6 de abril de 2014 5) Algumas linguagens não exigem declaração de tipos de variáveis. Quais as vantagens e desvantagens dessa abordagem. 6) Algumas linguagens de programação, tais como: Pascal, Java e C++ exigem que uma variável seja declarada antes de ser usada. Adicionalmente exigem que ao declarar uma variável seja associado à mesma um tipo. Cite ao menos 2 argumentos que justifiquem essa exigência de tornar explícito o tipo de uma variável no momento de sua declaração. 7) A linguagem de programação C considera a operação de atribuição como sendo uma expressão. Apresente vantagens e desvantagens dessa abordagem. 8) Compare, em termos de legibilidade, as opções das linguagens de programação C e Pascal relativas à localização das definições e declarações de variáveis. 9) Diferencie e exemplifique os 2 tipos de equivalência de tipos: por nome e estrutural. 10) Por que a verificação de tipos dos parâmetros de um subprograma é importante? 11) Responda V para as sentenças verdadeiras e F para sentenças falsas. Justifique suas respostas. ( ) Devemos evitar a passagem de parâmetro por valor para estruturas de dados compostas porque isso pode tornar o programa ineficiente. ( ) É desejável que uma linguagem de programação elimine toda possibilidade de efeito colateral na implementação das suas construções que introduzem abstrações. ( ) Projetistas de linguagens de programação costumam implementar somente a ordem de avaliação normal para as chamadas de função, pois os outros esquemas de avaliação são mais complicados e dificultam a legibilidade. ( ) Na linguagem de programação C é possível fazer tomada de decisão utilizando comando ou utilizando expressão, o que representa um ganho na capacidade de escrita. ( ) As linguagens orientadas a expressão perdem em legibilidade porque permitem efeitos colaterais na codificação das expressões. ( ) Na linguagem de programação C, durante a execução da expressão c = b, a variável c será amarrada à variável b no escopo de avaliação do comando em que essa expressão faz parte. ( ) Só podemos implementar estruturas de dados que fazem uso de alocação de memória dinâmica em linguagens de programação que trabalham com esquemas de escopo dinâmico. ( ) As linguagens de programação modernas usualmente combinam esquemas de amarração dinâmica com esquemas de tipagem estática para atender as demandas dos programadores. ( ) Nas chamadas de funções recursivas os compiladores deixam de fazer novas amarrações, já que o nome dos parâmetros será sempre o mesmo se a função chamada for sempre a mesma. Instituto Federal de Educação, Ciência e Tecnologia Curso: Bacharelado em Ciência da Computação Disciplina: Paradigmas de Linguagens Professores: Walace de Almeida Rodrigues/Mário Luiz Rodrigues Oliveira Atividade: 3ª Lista de Exercícios Formiga, MG, 6 de abril de 2014 12) Em uma linguagem de programação, a ordem de avaliação dos parâmetros reais, durante a passagem de parâmetros, pode ser: prévia, normal ou tardia. Considere o código na linguagem de programação C abaixo e explique os resultados obtidos ao executá-lo considerando separadamente as 3 ordens de avaliação dos parâmetros. Unicamente para fins de resolução desse exercício, suponha que a linguagem de programação C implemente as 3 ordens de avaliação citadas. 1. void avalia ( int c) 2. { 3. int i; 4. for ( i=0; i < 3; i++) 5. { 6. 7. printf (“%d\n”; c); } 8. } 9. void main () 10. { 11. int j=0; 12. avalia (j++); 13. } 13) Indique qual o valor será escrito pelo trecho de código seguinte considerando: a) a linguagem de programação adotada usa amarração estática b) a linguagem de programação adotada usa amarração dinâmica c) cite e explique os problemas de legibilidade desse trecho de código quando se adota amarração dinâmica e quando é adotada amarração estática No código que se segue, considere os símbolos := como operador de atribuição. Suponha que a execução do código inicie pelo procedimento comecar(). 1. inteiro x := 5; 2. inteiro y := 10; 3. inteiro z := 15; 4. 5. procedimento sub1() 6. { 7. escreva (x); 8. escreva (y); 9. escreva (z); 10. escreva (“mais”); 11. } 12. procedimento sub2() Instituto Federal de Educação, Ciência e Tecnologia Curso: Bacharelado em Ciência da Computação Disciplina: Paradigmas de Linguagens Professores: Walace de Almeida Rodrigues/Mário Luiz Rodrigues Oliveira Atividade: 3ª Lista de Exercícios Formiga, MG, 6 de abril de 2014 13. { 14. inteiro x := 10; 15. z := z – y; 16. sub1(); 17. } 18. 19. procedimento sub3() 20. { 21. inteiro y := 20; 22. sub2(); 23. } 24. 25. procedimento comecar() 26. { 27. inteiro x := 10; 28. inteiro y := 15; 29. inteiro z := 5; 30. sub1(); 31. sub2(); 32. sub3(); 33. } MATÉRIA DA PROVA: Critérios de avaliação de linguagens de programação, amarrações, valores e tipos de dados, variáveis, comandos, expressões e abstrações. Estudar o capítulo 1 (seção 1.3), capítulo 5 e o capítulo 6 do livro SEBESTA, ROBERT. Conceitos de linguagens de programação. 9ª edição. Bookman, 2011. Estudar os capítulos 1, 2, 3, 4, 5 e 6 do livro VAREJÃO, Flávio. Linguagens de programação: conceitos e técnicas. Campus, 2004. Estudar, também, pelo material (transparências) disponibilizado no portal MeuIfmg. REFERENCIAS: SEBESTA, ROBERT. Conceitos de linguagens de programação. 9ª edição. Bookman, 2011. VAREJÃO, Flávio. Linguagens de programação: conceitos e técnicas. Campus, 2004.