Exercícios Conceituais sobre Linguagens de Programação
Capítulo 1 - Introdução
- Explique como as propriedades de legibilidade e redigibilidade podem entrar em conflito em linguagens de programação. Dê exemplos concretos.
- Legibilidade: Facilidade de entender o código por humanos
- Redigibilidade: Facilidade de escrever o código
- Conflito: Linguagens muito concisas (como Perl) podem ser difíceis de ler
- Exemplo: Operadores ternários vs if-else
- Compare os métodos de implementação de linguagens por compilação, interpretação e híbrido em termos de:
- Eficiência de execução: Compilação > Híbrido > Interpretação
- Portabilidade: Interpretação > Híbrido > Compilação
- Facilidade de depuração: Interpretação > Híbrido > Compilação
- Analise criticamente a evolução das linguagens de programação, identificando como as necessidades do mercado influenciaram seu desenvolvimento.
- Era do Mainframe: Fortran, COBOL
- Era do PC: C, Pascal
- Era da Web: JavaScript, PHP
- Era Mobile: Swift, Kotlin
- Era Cloud: Go, Rust
- Discuta por que a ortogonalidade é uma propriedade desejável em linguagens de programação e como sua ausência pode afetar o aprendizado.
- Ortogonalidade: Independência entre características da linguagem
- Vantagens: Menos exceções, mais previsibilidade
- Exemplo: Python vs C++ em termos de ortogonalidade
Capítulo 2 - Amarrações
- Compare o escopo estático e dinâmico, analisando:
- Impacto na legibilidade: Escopo estático é mais previsível
- Eficiência de execução: Escopo estático é mais eficiente
- Facilidade de manutenção: Escopo estático facilita a manutenção
- Explique como diferentes tempos de amarração afetam:
- Flexibilidade da linguagem: Amarração tardia = mais flexibilidade
- Eficiência de execução: Amarração antecipada = mais eficiência
- Detecção de erros: Amarração antecipada = erros detectados mais cedo
- Discuta as vantagens e desvantagens de permitir definições e declarações em qualquer ponto do bloco versus exigir que sejam feitas no início.
- Vantagens: Flexibilidade, código mais natural
- Desvantagens: Pode dificultar a leitura, possibilidade de erros
- Analise o impacto das diferentes estruturas de blocos (monolítica, não aninhada e aninhada) na modularização de programas.
- Monolítica: C, mais simples mas menos flexível
- Não aninhada: Python, mais clara e previsível
- Aninhada: JavaScript, mais flexível mas pode ser confusa
Capítulo 3 - Valores e Tipos de Dados
- Compare as abordagens de C/C++ e Java quanto à definição dos intervalos de tipos primitivos. Discuta implicações para:
- Portabilidade: Java é mais portável (tamanhos fixos)
- Eficiência: C/C++ pode ser mais eficiente (otimizado para hardware)
- Facilidade de uso: Java é mais seguro e previsível
- Analise os diferentes tipos de implementação de strings:
- Estática: Tamanho fixo (C), eficiente mas limitado
- Dinâmica limitada: Tamanho variável com limite (Pascal)
- Dinâmica: Tamanho totalmente variável (Python, Java)
- Casos de uso: Estática para buffers fixos, dinâmica para texto geral
- Discuta os problemas potenciais do uso de ponteiros e como diferentes linguagens lidam com eles:
- Objetos pendentes: Referências a memória liberada
- Referências pendentes: Ponteiros inválidos
- Violação do sistema de tipos: Type casting inseguro
- Soluções: Garbage collection, smart pointers, referências seguras
- Compare as abordagens de diferentes linguagens para tipos compostos em termos de:
- Flexibilidade: Estruturas vs Classes vs Records
- Segurança: Verificação de tipos em tempo de compilação
- Eficiência: Layout de memória e otimizações
Capítulo 4 - Variáveis e Constantes
- Compare as diferentes abordagens para gerenciamento de memória:
- Gerenciamento manual (C/C++):
- Vantagens: Controle total, eficiência
- Desvantagens: Erros comuns, complexidade
- Coleta de lixo automática (Java):
- Vantagens: Segurança, simplicidade
- Desvantagens: Overhead, imprevisibilidade
- Discuta as implicações de diferentes modelos de persistência de dados:
- Arquivos: Simples, mas limitado
- Interfaces com banco de dados: Robusto, mas complexo
- Persistência ortogonal: Transparente, mas pode ser ineficiente
- Analise como diferentes linguagens implementam a pilha de registros de ativação e suas implicações para:
- Recursão: Profundidade máxima da pilha
- Escopo de variáveis: Acesso a variáveis locais
- Eficiência: Custo de chamadas de função
- Compare diferentes abordagens para serialização de objetos em termos de:
- Facilidade de uso: APIs intuitivas vs complexas
- Portabilidade: Formato independente de plataforma
- Manutenção: Compatibilidade com versões anteriores
Back to top