Avaliação de Linguagens de Programação
Curso: Engenharia de Computação
Período: 5º
Duração: 1h40min
Valor Total: 35 pontos
Questões
(8 pontos) Linguagens de Programação
Contexto: A implementação de linguagens de programação pode seguir diferentes abordagens, cada uma com suas características específicas. Por exemplo, enquanto C e C++ são tradicionalmente compilados para código de máquina, Python e JavaScript são interpretados. Java, por sua vez, utiliza uma abordagem híbrida com compilação para bytecode e interpretação pela JVM. Estas diferentes abordagens têm implicações significativas no desenvolvimento de software, afetando desde a performance até a portabilidade do código.
Questão: Compare as abordagens de implementação por compilação e interpretação em linguagens de programação, discutindo:
- Eficiência de execução
- Portabilidade
- Facilidade de depuração
- Uso de recursos do sistema
- Justifique por que certas linguagens escolhem uma abordagem específica
Exemplo Prático: Considere o seguinte código que implementa o cálculo do fatorial em duas linguagens diferentes:
# Python (interpretado) def calcular_fatorial(n): if n <= 1: return 1 return n * calcular_fatorial(n-1)// C (compilado) int calcular_fatorial(int n) { if (n <= 1) return 1; return n * calcular_fatorial(n-1); }(7 pontos) Amarrações e Escopo
Contexto: O escopo de variáveis é um conceito fundamental em linguagens de programação que determina onde e como as variáveis podem ser acessadas. Enquanto o escopo estático (também chamado de léxico) é determinado pela estrutura do código fonte, o escopo dinâmico é determinado pela sequência de chamadas durante a execução do programa. Esta diferença fundamental afeta diretamente como os programas se comportam e como os desenvolvedores precisam pensar sobre o fluxo de dados em suas aplicações.
Questão: Explique o conceito de escopo estático versus dinâmico em linguagens de programação. Forneça um exemplo de código que produziria resultados diferentes em cada tipo de escopo e justifique.
- Analise o impacto na manutenibilidade do código
- Explique passo a passo como o mesmo código seria executado em cada tipo de escopo
- Discuta as vantagens e desvantagens de cada abordagem
- Que tipo de escopo você se sente mais familizarizado
Exemplo Prático: O código abaixo demonstra como o mesmo conceito pode ter comportamentos diferentes dependendo do tipo de escopo utilizado:
# Exemplo de escopo em Python x = 10 def funcao1(): print(x) def funcao2(): x = 20 funcao1()// Exemplo de escopo em JavaScript var x = 10; function funcao1() { console.log(x); } function funcao2() { var x = 20; funcao1(); } // Exemplo de escopo em JavaScript moderno const x = 10; function funcao1() { console.log(x); } function funcao2() { const x = 20; funcao1(); }(7 pontos) Valores e Tipos de Dados
Contexto: O gerenciamento de memória e tipos de dados é crucial em programação. Diferentes linguagens adotam diferentes abordagens para lidar com estes aspectos, desde o gerenciamento manual em C até a coleta de lixo automática em Java.
Questão: Considere o seguinte trecho de código em C:
void f(int *p) { int *q = (int*)malloc(sizeof(int)); *q = 10; p = q; } int main() { int *x = NULL; f(x); printf("%d", *x); return 0; }Identifique e explique:
- Os possíveis problemas de gerenciamento de memória
- Como este código poderia ser corrigido
- Como diferentes linguagens (Java, por exemplo) tratariam esta situação
- Compare as abordagens de tipagem estática vs dinâmica
(6 pontos) Variáveis e Constantes
Contexto: A persistência de dados é um aspecto fundamental em aplicações modernas. Diferentes abordagens existem para manter dados entre execuções do programa, cada uma com suas vantagens e desvantagens.
Questão: Discuta como a persistência de dados é implementada em linguagens de programação modernas, comparando:
- Serialização de objetos
- Arquivos tradicionais
- Persistência ortogonal
- Constantes vs variáveis em diferentes contextos
- Impacto na performance e manutenibilidade
(7 pontos) Linguagens e Paradigmas
Contexto: O paradigma orientado a objetos é um dos mais utilizados no desenvolvimento de software moderno, oferecendo mecanismos poderosos para organização e reuso de código.
Questão: Explique como o paradigma orientado a objetos contribui para:
- Reusabilidade de código
- Manutenibilidade
- Encapsulamento Forneça exemplos práticos para ilustrar cada ponto.
Gabarito e Pontuação
Questão 1 (8 pontos)
Distribuição dos pontos:
- Explicação clara da compilação (2 pontos)
- Explicação clara da interpretação (2 pontos)
- Comparação adequada dos aspectos solicitados (2 pontos)
- Exemplos ou casos de uso apropriados (2 pontos)
Resposta esperada:
O aluno deve abordar: - Compilação: tradução completa para código de máquina, execução mais rápida, menor portabilidade - Interpretação: execução linha a linha, maior portabilidade, execução mais lenta - Trade-offs entre as abordagens - Casos de uso ideais para cada abordagem
Questão 2 (7 pontos)
Distribuição dos pontos:
- Definição clara de escopo estático (2 pontos)
- Definição clara de escopo dinâmico (2 pontos)
- Exemplo de código correto (2 pontos)
- Explicação das diferenças no resultado (1 ponto)
Resposta esperada:
O aluno deve: - Explicar que escopo estático é determinado pela estrutura do código - Explicar que escopo dinâmico é determinado pela sequência de chamadas - Fornecer exemplo que demonstre as diferenças - Explicar como o mesmo código produziria resultados diferentes
Questão 3 (7 pontos)
Distribuição dos pontos:
- Identificação do vazamento de memória (2 pontos)
- Identificação do problema de passagem por valor do ponteiro (2 pontos)
- Solução correta proposta (2 pontos)
- Comparação com outras linguagens (1 ponto)
Resposta esperada:
O aluno deve identificar: - Vazamento de memória por falta de free() - Problema da passagem por valor do ponteiro p - Propor correção usando ponteiro para ponteiro ou retorno - Explicar como garbage collection evitaria estes problemas
Questão 4 (6 pontos)
Distribuição dos pontos:
- Explicação de serialização (2 pontos)
- Explicação de arquivos tradicionais (2 pontos)
- Explicação de persistência ortogonal (2 pontos)
Resposta esperada:
O aluno deve abordar: - Mecanismos de serialização e suas vantagens - Uso tradicional de arquivos e suas limitações - Conceito de persistência ortogonal e seus benefícios - Comparação entre as abordagens
Questão 5 (7 pontos)
Distribuição dos pontos:
- Explicação de reusabilidade (2 pontos)
- Explicação de manutenibilidade (2 pontos)
- Explicação de encapsulamento (2 pontos)
- Exemplos práticos (1 ponto)
Resposta esperada:
O aluno deve: - Explicar como herança e polimorfismo promovem reuso - Discutir como encapsulamento facilita manutenção - Demonstrar compreensão de ocultamento de informação - Fornecer exemplos práticos relevantes
Observações gerais para correção: - Clareza e organização das respostas - Uso correto de terminologia técnica - Demonstração de compreensão conceitual - Capacidade de relacionar conceitos - Qualidade dos exemplos fornecidos