Eu criei um compilador em C (usando lex & bison) para uma linguagem de programação de tipo dinâmico que suporta loops, declarações de funções dentro de funções, chamadas recursivas, etc. Eu também criei uma máquina virtual que executa o código intermediário criado pelo compilador.
Agora eu estava pensando em compilar meu próprio código intermediário, compilá-lo em código de bytes java.
Eu vi que a pergunta sobre a criação de uma linguagem JVM já foi feita, mas não acho a resposta muito informativa.
Então, aqui estão as minhas questões:
- Eu acho que para criar uma linguagem para JVM uma obrigação é ler o livro de especificações da JVM , que outros livros você pode sugerir (exceto Dragon Book, é claro)? Estou mais preocupado com livros ou tutoriais sobre como criar uma linguagem JVM, não um compilador em geral.
- Existem muitas bibliotecas Java para ler, gravar e alterar arquivos .class como jclasslib , bcel , gnu bytecode , etc. Qual você sugere? Além disso, você está ciente das bibliotecas C que fazem o mesmo trabalho?
- Eu estava pensando em dar uma olhada em outra linguagem que vise a JVM como Clojure, Jython ou JRuby. Mas todas essas linguagens são de alto nível e complicadas (para criar um compilador para elas). Eu estava procurando por uma linguagem de programação mais simples (não me importo se é desconhecida ou não usada) que tem como alvo a JVM e seu compilador é de código aberto. Alguma ideia?
No semestre passado, participei de um curso de "Construção de compiladores". Nosso projeto foi exatamente o que você deseja fazer.
A linguagem que usei para escrever minha linguagem foi Scala . Ele é executado em uma JVM, mas oferece suporte a muitos recursos avançados que o Java não oferece (ainda é totalmente compatível com uma JVM Java pura).
Para gerar bytecode em java, usei a biblioteca Scala CAFEBABE . Bem documentado e você não precisa se aprofundar nas classes java para entender o que fazer.
Ao lado do livro, acho que você pode encontrar muitas informações visitando os laboratórios que fizemos durante o curso.
fonte
ASM pode ser uma solução para gerar bytecode. Para começar, verifique os tópicos de geração de elementos do manual .
fonte
Sugestão: você poderia dar uma olhada na Linguagem de Programação Lua , existem implementações JVM dela como LuaJ .
(Não deve ser confundido com LuaJava, que usa bibliotecas nativas com abordagem JNI.)
fonte
No fim de semana passado, eu estava me perguntando a mesma coisa para portar minha linguagem de brinquedo para a JVM.
Eu gasto apenas algumas horas pesquisando informações, então considere essas referências com cautela.
Padrões de implementação de linguagem . Eu odeio antlr, mas este livro parece muito bom. Se você também não gosta de antlr, há um bom guia de análise de "Técnicas de análise. Um guia prático".
O Capítulo 10 cobre em 30 páginas (para acelerar a IMO) esses tópicos. Mas há outro capítulo em que provavelmente você se interessará.
A implementação de Lua 5.0 Este é um ótimo artigo sobre máquinas de bytecode baseadas em registradores. Vá e leia, mesmo que seja por isso.
Lisp em pequenos pedaços. Este livro ensina como escrever compiladores de 2 schme que compilam para C. Muitas lições podem ser aprendidas com este livro. Eu tenho uma cópia deste livro e é realmente bom para qualquer pessoa interessante é ceceio, mas talvez não para sua xícara de chá.
http://www.amazon.com/Lisp-Small-Pieces-Christian-Queinnec/dp/0521562473
Verifique o Dalvik7 VM, um VM baseado em registro. O DVM opera em bytecodes que são transformados a partir dos arquivos Java Class compilados por um compilador Java.
Existe uma lista de discussão sobre o assunto, jvm-languages.
Você está planejando enviar o código para qualquer lugar? Eu gostaria de dar uma olhada.
fonte
Are you planning to upload the code to anyplace?
Não estou orgulhoso desse código :( ... Talvez eu reescrevesse tudo. De qualquer forma, se eu fizer isso, avisarei. Muito obrigado por suas sugestões.Eu recomendaria que você primeiro aprendesse como a montagem da JVM funciona, se ainda não o conhece.
Muitas instruções têm a forma
?name
, onde?
éi
se a instrução funciona com um tipo inteiro ea
se funciona com um tipo de referência.Basicamente, a JVM é uma máquina de pilha sem registros, portanto, todas as instruções funcionam com dados diretamente na pilha. Você pode enviar /
?push/?pop
retirar dados com e mover dados entre variáveis locais (localizações de pilha referenciadas por deslocamentos) e o topo da pilha usando?store/?load
. Algumas outras instruções importantes sãoinvoke???
eif_???
.Para o curso de compilador da minha universidade , usamos Jasmin para montar os programas. Não sei se esse é o melhor caminho, mas pelo menos é um lugar fácil para começar.
Aqui está uma referência de instrução para uma versão antiga da JVM, que pode conter menos instruções do que uma nova.
fonte
Primeiro, eu recuaria, modificaria meu compilador para gerar Java real em vez de códigos de bytes Java (o que significa criar mais um tradutor do que um compilador) e compilar a saída Java com qualquer ambiente Java que seja conveniente (o que provavelmente geraria um código-objeto melhor do que meu próprio compilador).
Você pode usar a mesma técnica (por exemplo, compilar em C #) para gerar códigos de byte CLI ou compilar em Pascal para gerar código P, etc.
Não está claro por que você está considerando códigos Java em vez de usar sua própria VM, mas se for para desempenho, é claro que você também deve considerar a compilação para o código de máquina real.
fonte
Claro, uma vez poderia usar Java para escrever uma nova linguagem. Com a API de reflexão do Java, você pode conseguir muito. Se a velocidade não importa muito, eu daria preferência ao Java em vez de ASM. A programação é mais fácil e menos sujeita a erros em Java (IMHO) . Dê uma olhada na linguagem RPN 7º . É inteiramente escrito em Java.
fonte