Lista de Linguagens de Programação 7

Documentos relacionados
Primeira Prova de Linguagens de Programação - DCC024 - Sistemas de Informação

Primeira Prova de Linguagens de Programação - DCC024W - Sistemas de Informação

Primeira Prova de Linguagens de Programação - DCC024 - Sistemas de Informação

Exame Especial de Linguagens de Programação - DCC024 -

Primeira Prova de Linguagens de Programação - DCC024B -

Lista de Linguagens de Programação 16

Primeira Prova de Linguagens de Programação - DCC024 -

Introdução à Programação em C

Programação: Vetores

Primeira Prova de Linguagens de Programação - DCC024B -

Introdução à Programação

ESTRUTURA DE DADOS (TCC )

... Subprogramas Após fazer as tarefas previstas o nosso programa devolve o comando ao sistema operativo. Isto está numa hierarquia onde o nosso progr

ALGORITMOS AULA 01. Baseado nas aulas do Prof. Jorgiano Vidal

INSTITUTO FEDERAL DE! EDUCAÇÃO, CIÊNCIA E TECNOLOGIA RIO GRANDE DO NORTE

Exame Especial de Linguagens de Programação - DCC024 -

Linguagens de Programação Conceitos e Técnicas. Amarrações Prof. Tiago Alves de Oliveira

Programação imperativa. 10. Pilha de execução

Introdução à Programação Aula 16. Prof. Max Santana Rolemberg Farias Colegiado de Engenharia de Computação

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

TÉCNICAS DE LINGUAGEM DE PROGRAMAÇÃO

Compiladores Ambiente de Execução

Prova Final de Linguagens de Programação - DCC024B -

Algoritmos e Programação

#include <stdio.h> void Swap (int *a,int *b) { int temp; temp=*a; *a=*b; *b=temp; } main () {

Tipos Básicos. Operadores de Incremento e Decremento. Operador Sizeof. Estruturas de Dados Aula 2: Estruturas Estáticas

Subprogramas. Prof. Carlos Lopes

PROGRAMAÇÃO INSTRUÇÕES DA LINGUAGEM C

Estruturas de Dados Aula 2: Estruturas Estáticas. Tipos Básicos. Quantos valores distintos podemos representar com o tipo char?

Estruturas de Dados Aula 2: Estruturas Estáticas 02/03/2011

Paradigmas de Linguagens de Programação. Expressões e Instruções de Atribuição

Primeira Prova de Linguagens de Programação - DCC024B -

Primeira Prova de Linguagens de Programação - DCC024B -

Tipos Abstratos de Dados. Estrutura de Dados

Essencialmente, um ponteiro nada mais é do que uma variável que ao invés de conter um valor, contém um endereço de memória.

Programação 5374 : Engenharia Informática 6638 : Tecnologias e Sistemas de Informação. Cap. 7 Arrays. Arrays

Primeira Prova de Linguagens de Programação - DCC024B -

ao paradigma imperativo

SERVIÇO PÚBLICO FEDERAL MINISTÉRIO DA EDUCAÇÃO E DO DESPORTO CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DE MINAS GERAIS CEFET-MG UNIDADE DE ENSINO

Suponha um conjunto habitacional, com várias famílias... imagina se todas elas morassem em uma única casa?

Métodos Computacionais em Física

Programação de Computadores II. Cap. 5 Vetores

Programação de Computadores II

Linguagens de Programação Funcional

Estrutura de Dados Conceitos Iniciais

Primeira Prova de Linguagens de Programação - DCC024B -

Trabalho Linguagem e Programação de Compiladores

Aula 03: Introdução a C

MC-102 Aula 13. Instituto de Computação Unicamp. 29 de Setembro de 2016

Variáveis e Operadores em C

MAC2166 Introdução à Computação para Engenharia Escola Politécnica Primeira Prova 05 de abril de 2010

Estruturas de Dados. Módulo 4 Funções. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

Prova Final de Linguagens de Programação - DCC024 - Sistemas de Informação

Instituto de Física Segundo Semestre de Diurno. Prova Substitutiva 15/12/2000

Prova Final de Linguagens de Programação - DCC024B -

Aula 25: Alocação Dinâmica

Nomes, vinculações e escopos

Linguagens de Programação Aula 11

Aula 3: Algoritmos: Formalização e Construção

USP - ICMC - SSC SSC o. Semestre 2010 Disciplina de Introdução à Ciência da Computação ICC 1 - Teoria

Introdução à Programação em C (II)

Organização de Computadores

PROGRAMAÇÃO INSTRUÇÕES DA LINGUAGEM C

3. Linguagem de Programação C

facilita o trabalho em equipe, com diferentes grupos trabalhando em cada módulo independente.

FUNÇÕES EM C Material adaptado da profa Silvana Maria Affonso de Lara

Conhecendo a Linguagem de Programação C

Linguagem Haskell. Universidade Estadual Santa Cruz Conceitos de Linguagens de Programação. Tiago Carneiro 19 Agosto 2013

Programação Imperativa. Lição n.º 16 A pilha de execução

Nomes, vinculações e escopos

Princípios de Desenvolvimento de Algoritmos MAC122

Programação I Aula 3 Primeiros programas

Programação Estruturada

INF 1007 Programação II

Linguagem C Princípios Básicos (parte 1)

Computação para Informática - Prof. Adriano Joaquim de Oliveira Cruz Segunda Aula Prática - 29 de agosto de 2008

Algoritmos e Estruturas de Dados I (DCC/003) Introdução à Programação de Computadores. Aula - Tópico 1

Introdução à Programação / Programação I

Introdução à Programação

Linguagem C: funções e ponteiros. Prof. Críston Algoritmos e Programação

Linguagem C: diretivas, compilação separada. Prof. Críston Algoritmos e Programação

Introdução à Programação

PROGRAMAS BÁSICOS EM C++ Disciplina: Introdução à Ciência da Computação Prof. Modesto Antonio Chaves Universidade estadual do Sudoeste da Bahia

Apontadores/ponteiros

Linguagem C. Linguagem artificial e formal usada para comunicar instruções ao computador. Proposta por Dennis Ritchie entre 1969 e 1973.

INF1005: Programação 1. Repetições. 08/03/10 (c) Paula Rodrigues 1

Introdução à Programação Aula 3 Primeiros programas

Modulo 10 : Tipos especiais de dados: união, enumeração e...

Suponha um conjunto habitacional, com várias famílias... imagina se todas elas morassem em uma única casa?

3) A função de Fibonacci, F: N N, no conjunto dos naturais, é definida recursivamente por F(0) = 0, F(1) = 1, e F(n) = F(n-1) + F(n-2) para n > 1

Fundamentos de Programação

Primeiros programas.

#include <stdio.h> main() { int i; // Cabeçalho for (i = 1; i <=20; i++) putchar( * ); putchar( \n ); puts( Numeros entre 1 e 5 );

Recursão. Aula 1. Liana Duenha. Faculdade de Computação Universidade Federal de Mato Grosso do Sul

Linguagens de Programação Conceitos e Técnicas. Amarrações

Guia Rápido: GCC, Makefile e Valgrind.

Principais paradigmas de programação. Programação imperativa Programação funcional Programação lógica Programação OO

Compiladores Ambiente de Execução

Sub-rotinas David Déharbe

Transcrição:

Lista de Linguagens de Programação 7 Nome: Matrícula: 1. Dizemos que uma linguagem é segura quando esta linguagem não permite que operações sejam aplicadas a argumentos que não possuam os tipos previstos por estas operações. C e C++ são linguagens inseguras, pois muitas vezes valores armazenados em memória são utilizados sem qualquer fiscalização de seus tipos. (a) Escreva um programa em C ou C++ que evidencie o caráter inseguro de uma destas linguagens. (b) Existem linguagens mais antigas que C ou C++ que são consideradas seguras, logo, a possibilidade de uso inseguro de tipos não é devido à ignorância sobre os perigos desta abordagem. ML, por exemplo, já havia sido definida dez anos antes de C++, porém enquanto ML é uma linguagem considerada segura, C++ não é. Cite um fator que motivou o desenho inseguro de C++. 1

2. Essa questão refere-se ao programa abaixo, escrito na linguagem C. Esse programa foi compilado com gcc 4.2, e testado em um sistema operacional Mac OS X 10.5.8: 1 include <stdio.h> 2 void function() { 3 int buffer[1]; 4 buffer[4] += 3; 5 } 6 int main() { int x; x = 13; function(); x++; printf("%d\n",x); } (a) Compile e execute esse programa. O que será impresso? (b) Comente a linha 4 do código fonte de nosso programa, compile-o novamente e re-execute. O que será impresso? (c) Compile esse programa com informações de depuração usando o comando gcc -g f.c, e o execute com o depurador gdb, via o comando gdb a.out. No terminal do depurador, execute os seguintes comandos: (gdb) b function (gdb) run (gdb) print buffer[4] $1 = 8156 // <--- provavelmente voce obterah outro valor (gdb) x 8152 // aqui. Adapte sua saida de acordo. (gdb) disassemble main O que é o valor armazenado em buffer[4]? (d) Qual o efeito da atribuição buffer[4] += 3? (e) Esse exercício ilustra uma vulnerabilidade de programas escritos na linguagem C, chamada buffer overrun. Por que essa vulnerabilidade não ocorre em linguagens fortemente tipadas? 2

3. Uma linguagem é estaticamente tipada quando o tipo de cada expressão pode ser resolvido em tempo de compilação. Uma linguagem é dinamicamente tipada quando o tipo da variável é resolvido em tempo de execução. Neste exercício reforçaremos estes conceitos. (a) Dê um exemplo de uma linguagem estaticamente tipada. Como o compilador consegue descobrir o tipo das variáveis, no caso desta linguagem? (b) Dê um exemplo de uma linguagem dinamicamente tipada. Escreva um programa, muito simples, que evidencie o caráter dinâmico desta linguagem. (c) Cite uma vantagem da tipagem estática sobre a tipagem dinâmica. (d) Agora, cite uma vantagem da tipagem dinâmica sobre a tipagem estática. 3

4. O objetivo deste exercício é completar a função abaixo, que computa o Crivo de Erastótenes: fun filternonprimes _ nil = 0 filternonprimes limit (h::t) = if h * h <= limit then h + filternonprimes limit (filter (fn e => (e mod h) <> 0) t) else h + sum t fun sieve n = filternonprimes n (inv (range n) nil) (a) Escreva a função sum, de tipo int list -> int, que calcula a soma de uma lista de inteiros. (b) Escreva a função range, de tipo int -> int list, que produza listas de inteiros em ordem descrescente, isto é, range 4 = [4,3,2]. (c) Escreva a função inv, de tipo a list -> a list -> a list, que receba duas listas: l 1 e l 2. A função deve inverter a lista l 1, usando a lista l 2 como um acumulador da lista invertida. Isto é, inv [4,3,2] nil = [2,3,4] e inv [5, 4, 3] [8, 9, 10] = [3, 4, 5, 8, 9, 10]. Note que o propósito do parâmetro l 2 é tornar a implementação da função mais eficiente. 4

5. O autor de ML, Robin Milner, ganhou um prêmio Turing. Uma de suas maiores contribuições à ciência da computação foi um algoritmo para a inferência de tipos. ML é uma linguagem estaticamente tipada, porém o desenvolvedor em geral não precisa escrever o tipo durante a declaração de expressões. Os tipos são inferidos automaticamente pelo programador. O objetivo deste exercício é fazer com que você pense como um compilador, quando este realiza a inferência de tipos. Tente descobrir o tipo de cada uma das funções abaixo. Assim que achar que tem uma resposta, escreva a função em SML, e verifique se a resposta está correta. Escreva o tipo de cada função. (a) f(x) = 1 (b) f(x, y) = 1 (c) f(x) = x (d) f(x, y) = x (e) f(g) = g(1) (f) f(g, x) = g(x) (g) f(g, x, y) = g(x, y) (h) f(g, h, x) = g(h(x)) (i) f(g, x) = g(g(x)) 5

6. Essa questão refere-se à seção de Python abaixo, em que se define e usa-se uma função fatorial. ~/fernando$ python Python 2.5.1 (r251:54863, May 5 2011, 18:37:34) >>> def fact(n):... if n > 1:... return n * fact(n-1)... else:... return 1... >>> type(fact(10)) <type int > >>> type(fact(100)) <type long > >>> (a) Quando o tipo de fact(10) é conhecido? As duas opções são: (i) em tempo de compilação da função fact, quando sua declaração passa a ser conhecida, ou, (ii) durante a execução do programa, quando a chamada fact(10) é feita. (b) Por que o tipo de fact(10) é diferente do tipo de fact(100)? (c) Considere a função abaixo, escrita na linguagem C. Qual é, nesse caso, o tipo das variáveis x e y? int fact(int n) { return n > 1? n * fact(n-1) : 1; } void main() { int x = fact(10); int y = fact(100); printf("%d, %d\n", x, y); } (d) Do ponto de vista de facilidade de programação, qual forma de tipagem torna o programador mais produtivo? 6