VM baseada em registradores
Mude a VM para um modelo de execução baseado em registradores para um runtime mais rápido e uma forma de VM diferente da padrão.
A opção vmRegisterBased muda a VM do seu bytecode baseado em pilha padrão para um modelo de execução baseado em registradores. Em alguns casos isso melhora o desempenho de execução da VM em torno de 15-20 %, ao custo de um bundle ofuscado ligeiramente maior.
Baseado em pilha vs. baseado em registradores
Uma VM baseada em pilha mantém os operandos em uma pilha implícita: cada valor é empilhado, consumido pela instrução seguinte e o resultado empilhado de volta. Uma VM baseada em registradores endereça seus operandos diretamente, de modo que o mesmo trabalho é expresso em menos instruções e sem tráfego de empilhar/desempilhar entre elas. É daí que vem o ganho de execução — e também por que o bytecode cresce um pouco, já que cada instrução agora precisa indicar quais registradores ela lê e escreve em vez de deixá-los implícitos na pilha.
Nenhum dos dois modelos muda o que o seu código faz ou o que a VM protege. São duas codificações da mesma lógica virtualizada; o modelo baseado em registradores apenas troca um pouco de tamanho por um pouco de velocidade.
Quando usar
Recorra a ela quando o custo de execução da VM importar. Código virtualizado é mais lento que JavaScript comum por design, então em um caminho quente — um loop de animação, um handler por frame, uma rotina de parsing apertada — os ~15-20 % que o executor baseado em registradores pode poupar valem o bundle maior. Em código que roda raramente, o custo de tamanho geralmente não compensa.
Ela também varia a forma da VM. Como emite um bytecode e um executor estruturalmente diferentes, a saída carrega uma impressão digital mais singular do que a VM baseada em pilha padrão. Se você quer que a VM entregue se pareça pouco com a comum baseada em pilha — para que seja menos reconhecível a análises genéricas baseadas em padrões — esta é uma forma de mudá-la.
Como funciona por baixo dos panos
Isto não é um compilador nativo baseado em registradores. O compilador baseado em pilha de sempre ainda gera o bytecode exatamente como sem a opção; uma etapa de transformação separada então reescreve esse bytecode na forma baseada em registradores. A consequência prática é que todo o resto da ofuscação de VM — targeting, codificação de bytecode, as opções do dispatcher — se comporta igual, porque o modo baseado em registradores fica a jusante de tudo isso.
Requisitos
- Requer
vmObfuscation— esta opção apenas remodela a VM quevmObfuscationproduz. - Versão do ofuscador 7.12.0 ou posterior.
Exemplo
JavaScriptObfuscator.obfuscate(code, {
vmObfuscation: true,
vmRegisterBased: true
});
