Aproximando-se de Java / JVM internos [fechado]

15

Programei em Java por cerca de 8 anos e conheço a linguagem muito bem como desenvolvedor, mas meu objetivo é aprofundar meus conhecimentos sobre os internos. Fiz cursos de graduação em design de PL, mas eram visões acadêmicas muito amplas (no Scheme, IIRC).

Alguém pode sugerir uma rota para começar a investigar os detalhes? Especificamente, existem tópicos específicos (por exemplo, coleta de lixo) que podem ser mais acessíveis ou um bom ponto de partida? Existe um livro decente de alto nível sobre as partes internas da JVM e o design da linguagem de programação Java? Minha abordagem atual será começar com as especificações e pesquisas da JVM, conforme necessário.

spinning_plate
fonte
2
Minha abordagem pessoal seria (e é) encontrar a verdadeira razão de todos esses pequenos casos "por que exatamente funciona assim" em Java. Como o boxe automático é definido, como os tipos genéricos funcionam. E os var-args? O que o SUPERsinalizador nos arquivos de classe realmente faz? A maioria dos que está descrito na JVM especificação em si, mas requer algum trabalho para tirá-lo de lá e em seu cérebro ;-)
Joachim Sauer

Respostas:

13

Eu fiz um pouco disso quando comecei com Java, anos atrás. Minha abordagem foi ler as especificações da VM e examinar a saída do javap -c, que exibe o código de código desmontado de uma classe. Também tentei criar classes java com bytecode específico, usando um montador java bytecode. Existe um assembler chamado jasmin , se você quiser tentar isso.

Você também pode consultar o documento da Lambda Expression Translation publicado por Brian Goetz, da Oracle, que aborda a estratégia que será usada para converter os lambdas (fechamentos, essencialmente) que estão sendo adicionados no Java 8.

Você também pode obter o código-fonte da VM Hotspot no OpenJDK e a versão de acesso antecipado do compilador javac com suporte lambda (repositório hg) para o JDK 8, se você realmente quiser mergulhar no fundo do pool.

Examinar a coleta de lixo é provavelmente uma boa ideia. Uma pesquisa rápida revelou este artigo do Dr. Dobbs no primeiro GC de lixo de Java. Não sei se é uma boa introdução. Suponho que você já conheça coletores de lixo de marca e varredura e geracionais; caso contrário, você vai querer ler sobre eles primeiro.

David Conrad
fonte
3

Algumas idéias adicionais:

  • Envolva-se no projeto OpenJDK . Nada supera a compreensão das partes internas de algum software, invadindo-o!
  • Veja como outras linguagens da JVM (por exemplo, Clojure ou Scala) geram código para a JVM
  • Faça um miniprojeto que lhe interesse e exija o uso de componentes internos da JVM. Talvez usando algo como ASM para manipular bytecode ..
Mikera
fonte
2

Se você ainda não está familiarizado com o formato Java bytecode, considere escrever um compilador minúsculo que crie um código de byte Java válido (ou o Jasmin assembler) e faça com que ele seja executado corretamente.

Ver "Hello World" ou "4" (dados 2 + 2) gerados pelo seu código é muito gratificante.


fonte