Pergunta

estou brincando com um intérprete de brinquedo em Java e eu estava pensando em tentar escrever um compilador simples que pudesse gerar bytecode para a Java Virtual Machine.O que me fez pensar: quanta otimização precisa ser feita por compiladores direcionados a máquinas virtuais como JVM e CLI?

Os compiladores Just In Time (JIT) fazem dobras constantes, otimizações de olho mágico, etc.?

Foi útil?

Solução

Vou apenas adicionar dois links que explicam Bytecode de Java muito bem e alguns dos várias otimizações da JVM durante o tempo de execução.

Outras dicas

Otimizar o bytecode é provavelmente um oxímoro na maioria dos casos

Eu não acho que isso seja verdade.Otimizações como elevar invariantes de loop e propagar constantes nunca podem prejudicar, mesmo que a JVM seja inteligente o suficiente para fazê-las sozinha, pelo simples fato de fazer com que o código trabalhe menos.

A otimização é o que torna as JVMs viáveis ​​como ambientes para aplicativos de longa execução. Você pode apostar que a SUN, a IBM e seus amigos estão fazendo o melhor para garantir que possam otimizar seu bytecode e código compilado JIT da maneira mais eficiente possível.

Dito isso, se você acha que pode pré-otimizar seu bytecode, provavelmente não causará muitos danos.

Vale a pena estar ciente, entretanto, que as JVMs podem tender a ter um desempenho melhor (e não travar) quando apresentadas exatamente com o tipo de bytecode que o compilador Java tende a construir.Não é incomum que otimizações sejam perdidas ou mesmo que a JVM trave quando ocorrem permutações de bytecode corretas, mas diferentemente do que seria produzido por javac.Esperançosamente, esse tipo de coisa está mais no passado agora, mas pode ser algo para se estar ciente.

Ofuscadores como o ProGuard realizarão muitas otimizações estáticas em seu bytecode para você.

O compilador HotSpot otimizará seu código em tempo de execução melhor do que é possível em tempo de compilação - afinal, ele tem mais informações para trabalhar.O único momento em que você deve otimizar o bytecode em vez de apenas o seu algoritmo é quando você está direcionando dispositivos móveis, como o Blackberry, onde a JVM para essa plataforma não é poderosa o suficiente para otimizar o código em tempo de execução e apenas executa o bytecode.

Otimizar o bytecode é provavelmente um oxímoro na maioria dos casos.A menos que você controle a VM, você não tem ideia do que ela faz para acelerar a execução do código, se é que faz alguma coisa.O compilador precisaria conhecer os detalhes da VM para gerar código otimizado.

Nota para Aserafins:

Também pode ser útil otimizar bytecode para aplicativos não incorporados em alguns casos limitados:

  1. Ao entregar código pela rede, por exemplo, para aplicativos WebStart, para minimizar o tamanho da entrega/cache e porque você não conhece necessariamente a capacidade/velocidade do cliente.

  2. Para códigos que você sabe que são críticos para o desempenho e usados ​​na inicialização antes (digamos) que o HotSpot tenha tido tempo de coletar quaisquer estatísticas.

Novamente, as transformações que um bom otimizador/ofuscador realiza podem ser muito úteis.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top