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_Bpode acessar o escopo local defuncao_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
zerarCarrinhorecebe apenas uma cópia do endereço original na Pilha. Ao fazerc = new Carrinho(), apenas a cópia local é reatribuída para apontar para um novo objeto recém-criado, deixando a referênciameuCarrinhodamain()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
Stringabandonando 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 viacontains(), ou umHashMap<Integer, List<Avaliacao>>indexando avaliações por usuário. Aceitar também menções a Streams comfilter/collectdesde que justificadas.