Aula 05: Expressões Regulares e Scanners
Objetivos
- Compreender a compilação dinâmica (JIT).
- Otimização guiada por perfil (PGO).
Conteúdo
Linguagens como Java, JavaScript e C# compilam para bytecode (portável) e usam um JIT (Just-In-Time) na VM para compilar trechos “quentes” para código nativo em tempo de execução, combinando portabilidade com desempenho.
flowchart LR
Bytecode[Bytecode] --> Interp[Intérprete]
Interp --> Perfil[Perfil]
Perfil --> JIT[JIT compila]
JIT --> Nativo[Código nativo]
Nativo --> Exec[Execução]
Motivação
JITs e otimizações guiadas por perfil são essenciais em:
- Navegadores modernos (V8, SpiderMonkey) que executam grandes aplicações JavaScript.
- JVMs e VMs de linguagens gerenciadas que precisam equilibrar tempo de startup com performance sustentada.
- Runtimes de linguagens usadas em sistemas de alta disponibilidade, onde reotimizar "em tempo real" vale o custo.
Como funciona uma JVM HotSpot
- Interpretação: Começa interpretando o bytecode (lento, mas start rápido).
- Profiling: A VM conta quantas vezes cada função é chamada (“quente”).
- Compilação JIT (C1): Se a função ficar “morna”, o compilador C1 gera código nativo rápido (poucas otimizações).
- Compilação Otimizada (C2): Se ficar “muito quente”, o compilador C2 (lento, poderoso) gera código nativo pesadamente otimizado.
Especulação e Deotimização
O JIT faz apostas perigosas. Ex: “Este ‘if’ nunca foi tomado nas últimas 10 mil vezes, vou assumir que nunca será e remover o código”. Se a aposta falhar (o if for tomado), o JIT faz deotimização: descarta o código nativo e retorna ao intérprete (ou a uma versão menos otimizada).
Resumo
- JIT: compila em tempo de execução trechos frequentemente executados; perfil guia quais trechos compilar. Especulação (ex.: assumir tipo ou branch) permite otimizações agressivas; deotimização corrige quando a especulação falha.
- Modelo dominante em VMs modernas (HotSpot, V8, .NET).
Referências
- Aho et al. (2006); Cooper & Torczon (2011).
Materiais da aula
Última atualização: 08/03/2026