Este repositório documenta um experimento comparando duas estratégias de dispatch para interpretadores de bytecode:
switch dispatchdirect threading
A conclusão final do trabalho é deliberadamente equilibrada:
- o
direct threadingreduz o número estrutural de branches no ponto de dispatch; - no benchmark em C deste host, ele também foi mais rápido;
- ainda assim, a análise visual e estrutural mostra que o
switchpermanece a escolha mais defensável para uma JVM acadêmica pequena, por simplicidade, rastreabilidade, portabilidade e facilidade de manutenção.
Em outras palavras, o experimento não tenta negar a vantagem estrutural do threading. Ele mostra por que, mesmo reconhecendo essa vantagem, ainda faz sentido escolher switch dispatch em uma implementação didática.
| Fonte | Resultado principal |
|---|---|
DrMIPS, vídeo do switch |
fluxo linear, previsível, fácil de rastrear no datapath |
MARS + MIPS X-Ray, vídeo do direct threading |
salto indireto real via jump table, com rota mais curta no dispatch |
| MARS, contadores estruturais | switch = 23000 branches de dispatch; threading = 8000 |
| Benchmark em C no host | threading foi mais rápido nesta máquina |
| Decisão arquitetural do projeto | switch dispatch continua sendo a opção recomendada para a JVM acadêmica |
| Artefato | Papel no experimento |
|---|---|
vm_dispatch_compare.asm |
comparador principal em MIPS com as duas estratégias no mesmo arquivo |
vm_dispatch_compare.c |
benchmark complementar em C para CPU real |
MIPS/switch_dispatch_drmips.asm |
versão switch adaptada para DrMIPS |
MIPS/direct_threading_dispatch_mars_spim.asm |
versão direct threading para MARS/SPIM |
Videos/ |
vídeos e frames usados na análise visual |
Uso_Grafico_mars/ |
capturas reais do MARS |
Graficos_Comparativos/ |
gráficos consolidados do experimento |
Dados_Experimento/ |
tabelas e resumos numéricos finais |
Os dois vídeos têm papéis diferentes:
- o vídeo do DrMIPS é melhor para explicar o comportamento do
switchno datapath; - o vídeo do MARS X-Ray é melhor para mostrar a mecânica real do
direct threading, já que o DrMIPS usado no experimento não suporta bem esse padrão de salto indireto.
| Aspecto | Switch dispatch | Direct threading |
|---|---|---|
| Seleção do handler | cadeia de comparações beq |
jump table + jr |
| Ponto de despacho | centralizado | distribuído |
| Estrutura auxiliar em memória | não precisa | precisa de thread_table |
| Portabilidade em C/C++ | total | depende de técnica mais específica |
| Rastreabilidade didática | muito alta | alta, mas menos linear |
| Aderência ao DrMIPS | alta | limitada |
No vídeo do switch, a execução é dominada por um fluxo sequencial muito claro:
- leitura do opcode da mini-VM;
- avanço do ponteiro de instrução virtual;
- comparações sucessivas no laço de dispatch;
- entrada no handler correto;
- retorno ao laço central.
Essa visualização reforça quatro características importantes:
- o fluxo de controle é explícito;
- o ponto de despacho é único;
- a depuração fica mais simples;
- o mapeamento mental entre o código C/C++ e o assembly MIPS é direto.
A principal virtude observada aqui não foi “menos branches”, porque isso não ocorre. A virtude foi a clareza estrutural do mecanismo.
No vídeo do direct threading, o fluxo é diferente:
- o opcode é lido;
- ele é transformado em índice com
sll; - a base da
thread_tableé carregada; - o endereço do handler é buscado na memória;
- o salto indireto é executado com
jr.
Essa rota deixa duas propriedades muito claras:
- o dispatch é mais curto em termos de branches explícitos;
- o mecanismo depende de uma estrutura auxiliar em memória e de um salto indireto real.
Visualmente, o threading é mais compacto no ponto de despacho. Estruturalmente, porém, ele também é mais “acoplado” à jump table e menos linear para explicação em sala.
| Os vídeos mostram | Os vídeos não mostram sozinhos |
|---|---|
| forma do fluxo de controle | desempenho absoluto em CPU moderna |
diferença entre cadeia de beq e jump table |
branch predictor real do hardware |
| dependência do threading em salto indireto | branch misses reais |
facilidade de rastrear o switch |
superioridade universal de uma técnica |
Essa separação é importante para a defesa: os vídeos servem como evidência qualitativa e estrutural, não como medição definitiva de performance.
As duas implementações foram validadas funcionalmente e produziram o mesmo estado final:
vm_mem[0] = 25- topo final da pilha =
25
| Métrica | Switch | Threading |
|---|---|---|
| Bytecodes executados | 8000 | 8000 |
| Branches de dispatch | 23000 | 8000 |
| Diferença de branches | 15000 | — |
Jump table no .data |
0 bytes | 24 bytes |
Resultado final vm_mem[0] |
25 | 25 |
| Topo final da pilha | 25 | 25 |
- o
direct threadingvenceu estruturalmente no número de branches de dispatch; - o
switchvenceu em simplicidade de layout e de inspeção; - as duas abordagens preservaram exatamente a correção funcional do interpretador.
Uma das diferenças mais úteis para a defesa do projeto aparece na memória:
- o
switchnão introduz nenhuma estrutura auxiliar de roteamento; - o
threadingprecisa de umathread_tableexplícita.
Isso não é um problema técnico em si. Mas, para uma JVM acadêmica pequena, adiciona mais um elemento estrutural que precisa ser mantido consistente com o valor numérico dos opcodes.
No MARS, o switch é particularmente forte em dois pontos:
- o dispatch está todo concentrado em um único laço;
- o avanço do PC é fácil de demonstrar com breakpoints e stepping.
O benchmark em C foi mantido como contraste com hardware real do host.
| Métrica | Switch | Threading |
|---|---|---|
| Execuções | 7 | 7 |
| Bytecodes processados | 160000000 | 160000000 |
| Branches modelados | 460000000 | 160000000 |
| Tempo médio de parede | 210.00 ms | 154.29 ms |
| RSS médio | 1431 KB | 1440 KB |
| Tamanho do binário | 16280 bytes | 16400 bytes |
Os gráficos abaixo deixam esse contraste mais claro:
O benchmark em C mostrou que, nesta máquina, o direct threading foi mais rápido. Isso precisa ser dito com clareza.
Ao mesmo tempo, esse resultado não anula a defesa do switch para a JVM acadêmica, porque o objetivo da escolha arquitetural aqui não é maximizar um único indicador de velocidade local. O objetivo é equilibrar:
- clareza de implementação;
- facilidade de depuração;
- previsibilidade estrutural;
- portabilidade;
- qualidade da defesa técnica do projeto.
| Fonte | O que ela sustenta melhor |
|---|---|
| Vídeo do DrMIPS | clareza e linearidade do switch dispatch |
| Vídeo do MARS X-Ray | mecânica real do direct threading |
| Tabelas do MARS | diferença estrutural de branches e custo da jump table |
| Benchmark em C | contraste de desempenho no host real |
Essa combinação levou a uma conclusão mais madura do que uma simples comparação “qual é mais rápido”.
O experimento mostrou três coisas ao mesmo tempo:
direct threadingreduz branches de dispatch e torna o salto ao handler mais direto;- no benchmark em C deste host, ele foi mais rápido;
- ainda assim, o
switch dispatchcontinua sendo a melhor escolha de engenharia para esta JVM acadêmica.
Essa recomendação final se apoia em cinco argumentos:
- o
switché mais simples de explicar e auditar; - o fluxo do interpretador fica mais visível em simulação;
- o projeto evita dependência de jump table como estrutura de roteamento;
- a implementação permanece mais próxima de C/C++ padrão;
- a manutenção e a defesa oral da arquitetura ficam mais seguras.
Portanto, a posição final deste repositório não é “threading não funciona”. A posição é mais precisa:
Em uma mini-VM acadêmica, com ISA pequena e foco em legibilidade, rastreabilidade e robustez da implementação, o
switch dispatché a escolha arquitetural mais adequada, mesmo reconhecendo a vantagem estrutural dodirect threadingno ponto de despacho.
vm_dispatch_compare.asmvm_dispatch_compare.cMIPS/switch_dispatch_drmips.asmMIPS/direct_threading_dispatch_mars_spim.asmVideos/switch_dispatch_drmips.mp4Videos/direct_threading_mars_xray.mp4Dados_Experimento/mars_summary.csvDados_Experimento/metricas_resumo.csv
Os demais arquivos visuais e gráficos servem como material pronto para apresentação e relatório.
Este repositório usa a licença The Unlicense, permitindo cópia, modificação, redistribuição e uso irrestrito, inclusive para trabalhos derivados, sem necessidade de pedir autorização prévia.












