J'ai créé un compilateur en C (en utilisant lex & bison) pour un langage de programmation typé dynamique qui prend en charge les boucles, les déclarations de fonctions à l'intérieur des fonctions, les appels récursifs, etc. J'ai également créé une machine virtuelle qui exécute le code intermédiaire créé par le compilateur.
Je pensais maintenant au lieu de compiler vers mon propre code intermédiaire, compilez-le en java byte code.
J'ai vu que la question sur la création d'un langage JVM a déjà été posée mais je ne trouve pas la réponse très informative.
Donc, voici mes questions:
- Je suppose que pour créer un langage pour JVM, un must est de lire le livre de spécifications JVM , quels autres livres pouvez-vous suggérer (sauf Dragon Book bien sûr)? Je suis surtout préoccupé par les livres ou les tutoriels sur la façon de créer un langage JVM, pas un compilateur en général.
- Il existe de nombreuses bibliothèques Java pour lire, écrire et modifier des fichiers .class comme jclasslib , bcel , gnu bytecode , etc. Laquelle suggérez-vous? Connaissez-vous également les bibliothèques C qui font le même travail?
- Je pensais jeter un œil à peut-être un autre langage qui cible la JVM comme Clojure, Jython ou JRuby. Mais tous ces langages sont de très haut niveau et compliqués (pour créer un compilateur pour eux). Je cherchais un langage de programmation plus simple (cela ne me dérange pas s'il est inconnu ou inutilisé) qui cible la JVM et son compilateur est open source. Des idées?
Le semestre dernier, j'ai suivi un cours "Compiler Construction". Notre projet était exactement ce que vous vouliez faire.
La langue que j'ai utilisée pour écrire ma langue était le Scala . Il fonctionne sur une JVM mais prend en charge de nombreuses fonctionnalités avancées que Java ne fait pas (toujours entièrement compatible avec une JVM pure java).
Pour générer le bytecode java, j'ai utilisé la bibliothèque Scala CAFEBABE . Bien documenté et vous n'avez pas besoin d'aller au fond des classes Java pour comprendre ce qu'il faut faire.
À côté du livre, je pense que vous pouvez trouver beaucoup d'informations en parcourant les laboratoires que nous avons faits pendant le cours.
la source
ASM peut être une solution pour générer du bytecode. Pour commencer, consultez les rubriques sur la génération d' éléments dans le manuel .
la source
Suggestion: Vous pouvez jeter un œil au langage de programmation Lua , il existe des implémentations JVM comme LuaJ .
(À ne pas confondre avec LuaJava qui utilise une bibliothèque native avec une approche JNI.)
la source
Le week-end dernier, je me posais la même question pour porter mon langage jouet sur la JVM.
Je ne passe que quelques heures à chercher des informations, alors prenez ces références avec un grain de sel.
Modèles d'implémentation du langage . Je déteste antlr mais ce livre a l'air très bien. Si vous n'aimez pas non plus antlr, il y a une très bonne analyse "Techniques d'analyse. Un guide pratique."
Le chapitre 10 couvre en 30 pages (à IMO rapide) ces sujets. Mais il y a un autre chapitre qui vous intéressera probablement.
L'implémentation de Lua 5.0 Ceci est un excellent article sur les machines à bytecode basées sur des registres. Allez le lire même pour le plaisir.
Lisp en petits morceaux. Ce livre enseigne comment écrire 2 compilateurs schme qui se compilent en C. Tant de leçons peuvent être tirées de ce livre. Je possède un exemplaire de ce livre et il est vraiment bon pour tous ceux qui sont intéressants, mais peut-être pas votre tasse de thé.
http://www.amazon.com/Lisp-Small-Pieces-Christian-Queinnec/dp/0521562473
Vérifiez la VM Dalvik7, une VM basée sur des registres. Le DVM fonctionne sur des bytecodes qui sont transformés à partir des fichiers de classe Java compilés par un compilateur Java.
Il existe une liste de diffusion sur le sujet, jvm-languages.
Envisagez-vous de télécharger le code n'importe où? Je voudrais jeter un oeil.
la source
Are you planning to upload the code to anyplace?
Je ne suis pas fier de ce code: (... Je réécrirais peut-être tout. De toute façon, si je le fais, je vous le ferai savoir. Merci beaucoup pour vos suggestions.Je vous recommande d'apprendre d'abord comment fonctionne l'assemblage JVM, si vous ne le connaissez pas déjà.
De nombreuses instructions ont la forme
?name
, où?
esti
si l'instruction fonctionne avec un type entier eta
si elle fonctionne avec un type référence.Fondamentalement, JVM est une machine de pile sans registre, donc toutes les instructions fonctionnent avec des données directement sur la pile. Vous pouvez pousser / pop des données avec
?push/?pop
et déplacer des données entre des variables locales (emplacements de pile référencés par des décalages) et le haut de la pile en utilisant?store/?load
. Certaines autres instructions importantes sontinvoke???
etif_???
.Pour le cours de compilation de mon université, nous avons utilisé Jasmin pour assembler les programmes. Je ne sais pas si c'est la meilleure façon, mais au moins c'est un point de départ facile.
Voici une référence d'instructions pour une ancienne version de la JVM, qui peut contenir moins d'instructions qu'une nouvelle.
la source
Tout d'abord, je reculerais, modifierais mon compilateur pour générer Java réel au lieu de codes d'octets Java (ce qui signifie créer plus d'un traducteur que d'un compilateur), et compiler la sortie Java avec n'importe quel environnement Java pratique (ce qui générerait probablement un meilleur code objet que mon propre compilateur).
Vous pouvez utiliser la même technique (par exemple, compiler en C #) pour générer des codes d'octet CLI, ou compiler en Pascal pour générer du code P, etc.
On ne sait pas pourquoi vous envisagez d'utiliser des codes Java au lieu d'utiliser votre propre machine virtuelle, mais si c'est pour les performances, vous devriez bien sûr également envisager de compiler le code machine réel.
la source
Bien sûr, une fois pourrait utiliser Java pour écrire un nouveau langage. Avec l'API de réflexion Java, vous pouvez obtenir un llot. Si la vitesse n'a pas trop d'importance, je donnerais la préférence à Java au lieu d'ASM. La programmation est plus facile et moins sujette aux erreurs en Java (IMHO) . Jetez un œil à la 7e langue RPN . Il est entièrement écrit en Java.
la source