Published

26/06/2026

Modified

16/06/2026

Aqui está o gabarito (chave de correção) detalhado e estruturado para a Prova 1 de Conceitos de Linguagens de Programação (CLP) de 2026-1.

Preparei os critérios de correção para facilitar a atribuição dos pontos em cada questão.


Gabarito Oficial – Avaliação 1 de Linguagens de Programação

Questão 1. Estudo de Caso: Arquitetura de Tradução (7 pts)

  • Gabarito Esperado: O argumento do Júnior é completamente incorreto. A premissa I é Falsa, pois interpretadores puros traduzem linha a linha em tempo real; se gerassem código Assembly nativo antecipadamente, estariam agindo como compiladores. A premissa II é Verdadeira, o despache de instruções da VM é justamente o maior gargalo para renderização gráfica em tempo real. A premissa III é Falsa, pois a Máquina Virtual precisa ser carregada na RAM juntamente com o código-fonte, aumentando significativamente o consumo de memória. A premissa IV é Verdadeira, o modelo AOT não possui o custo de tradução em tempo de execução, entregando 100% da performance da CPU ao jogo. Por fim, a premissa V é Verdadeira, o JIT é a evolução natural que monitora a execução e compila para código de máquina apenas os trechos que gargalam a CPU.

Questão 2. Auditoria Técnica: Amarrações e Escopo (5 pts)

  • Resposta: Falsa.
  • Justificativa Técnica: O escopo nativo de C e Java é Léxico (Estático), e não dinâmico. O erro arquitetural é afirmar que a funcao_B pode acessar o escopo local de funcao_A, pois seus registros de ativação na pilha são isolados e não compartilham variáveis locais.

Questão 3. Auditoria de Código: Passagem de Referências (7 pts)

  • a) O objeto real reside no Heap, enquanto as variáveis (ponteiros disfarçados) residem na Pilha. Ao chamar alterarTotal, a cópia do endereço ainda aponta para o objeto original no Heap; assim, acessar os seus atributos modifica o objeto original com sucesso.
  • b) Java utiliza passagem do valor da referência. A função zerarCarrinho recebe apenas uma cópia do endereço original na Pilha. Ao fazer c = new Carrinho(), apenas a cópia local é reatribuída para apontar para um novo objeto recém-criado, deixando a referência meuCarrinho da main() intacta apontando para o objeto antigo.
  • c) O valor impresso será 10.

Questão 4. Estudo de Caso: Arquitetura e Gargalo de Memória (6 pts)

  • a) (3 pts) Em Java, as strings comuns são estritamente imutáveis. Cada concatenação cria um novo objeto String abandonando o anterior no Heap, deixando um lixo massivo que sobrecarrega o GC. Em C++, a string é mutável, permitindo o redimensionamento direto do buffer de memória existente e evitando alocações excessivas.
  • b) (2 pts) Cada chamada recursiva empilha um novo Registro de Ativação na Pilha (Stack). Sendo um número massivo de iterações, a Pilha (que tem tamanho pré-fixado menor que o Heap) esgotará rapidamente, gerando um erro fatal de Stack Overflow.

Questão 5. Post-Mortem: Tipagem e Coerção (5 pts)

  • a) (2 pts) A característica responsável por isso é a Coerção Implícita (também associada à Tipagem Fraca), onde a linguagem converte automaticamente tipos incompatíveis (neste caso, int para string) para realizar a operação.
  • b) (3 pts) Tipagem Dinâmica significa que a checagem e amarração do tipo da variável ocorre apenas em tempo de execução. Coerção (Tipagem Fraca) é a conversão implícita de um tipo em outro, que pode ocorrer mesmo em linguagens estaticamente tipadas (como C, num cast implícito de int para float).

Questão 6. Auditoria de Arquitetura: Conceitos Transversais (4 pts)

  • Ortogonalidade: [ F ] A descrição cita exceções à regra (primitivos vs objetos), o que se refere a uma linguagem com baixa (ou falta de) ortogonalidade. Alta ortogonalidade significa poucas exceções e combinações livres e independentes de recursos.
  • Portabilidade de Tipos: [ F ] Java amarra o tamanho dos tipos de forma rígida (sempre 32 bits) independente da máquina, justamente para garantir a sua famosa portabilidade estrita. A variação pelo hardware é característica de C/C++.
  • Tempo de Amarração (Binding Time): [ F ] Elas utilizam a amarração tardia (late binding / execução), o que justamente favorece a flexibilidade máxima e a metaprogramação, mas penaliza fortemente o desempenho.
  • Persistência Ortogonal: [ F ] Ocorre o inverso: a persistência ortogonal sofre um alto risco estrutural de quebrar a desserialização de dados de produção caso o código (esquema) da classe seja modificado posteriormente.

Questão 7. Trabalho Prático: Sistema de Recomendação Colaborativo (4 pts)

  • a) (2 pts) O problema é a complexidade \(\mathcal{O}(U \times A^2)\): para cada usuário, compara-se todas as suas avaliações com todas as do alvo (loops internos). Com a base grande, isso gera milhões de comparações e causa Time Limit Exceeded.
  • b) (3 pts) Respostas esperadas variam, mas devem mencionar indexação com acesso \(\mathcal{O}(1)\). Ex: usar um HashSet<Integer> com os IDs de filmes do alvo (nota \(\ge\) 4) e verificar via contains(), ou um HashMap<Integer, List<Avaliacao>> indexando avaliações por usuário. Aceitar também menções a Streams com filter/collect desde que justificadas.
Back to top