Avaliação de Linguagens de Programação

Curso: Engenharia de Computação
Período: 5º
Duração: 1h40min
Valor Total: 35 pontos

Questões

  1. (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);
    }
  2. (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();  
    }
  3. (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
  4. (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
  5. (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

Back to top