96 votes

Créer un langage de programmation JVM

J'ai créé un compilateur en C (utilisant lex & bison) pour un langage de programmation à typage dynamique qui supporte 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 qu'au lieu de compiler vers mon propre code intermédiaire, il fallait le compiler vers le byte code java.

J'ai vu que la question sur la création d'un langage JVM a déjà été posée. a demandé mais je ne trouve pas la réponse très instructive.

Voici donc mes questions :

  1. Je suppose que pour créer un langage pour la JVM, il est indispensable de lire la Spécification de la JVM Quels autres livres pouvez-vous suggérer (à l'exception du Livre du Dragon, bien sûr) ? Je suis surtout intéressé par des livres ou des tutoriels sur la façon de créer un langage JVM, pas un compilateur en général.
  2. Il existe de nombreuses bibliothèques Java qui permettent de lire, d'écrire et de modifier les fichiers .class, par exemple jclasslib , bcel , bytecode gnu etc. Laquelle suggérez-vous ? Par ailleurs, connaissez-vous des bibliothèques C qui font le même travail ?
  3. Je pensais jeter un coup d'oeil à 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 cherche un langage de programmation plus simple (peu importe s'il est inconnu ou inutilisé) qui cible la JVM et dont le compilateur est open source. Des idées ?

67voto

theomega Points 8874

Je recommande également ASM, mais jetez un coup d'œil à Jasmin J'ai écrit une combinaison lexer/parse/analyseur/optimiseur/générateur pour un langage de programmation utilisant java et jasmin, générant ainsi du code JVM. J'ai téléchargé le code aquí la partie intéressante devrait être le le code source lui-même . Dans le dossier "bytecode/InsanelyFastByteCodeCreator.java" vous trouvez un morceau de code qui transforme un arbre AST dans le format d'entrée de l'assembleur jasmin. C'est assez simple.

Le langage source (qui a été transformé en AST par Lexer+Parser+Analyzer) est un sous-ensemble de Java appelé MiniJava. Il lui manque certaines fonctionnalités "compliquées" comme l'héritage, les constructeurs, les méthodes statiques, les champs/méthodes privés. Aucune de ces caractéristiques n'est difficile à mettre en oeuvre, mais il y avait une autre tâche à accomplir : écrire un backend X86 (pour générer un assembleur machine), et ces choses ont tendance à devenir difficiles si vous n'avez pas de JVM qui gère certaines choses.

_Au cas où vous vous interrogeriez sur l'étrange nom de la classe : la tâche du projet universitaire était de transformer l'AST en une SSA Graph (donc un graphique représentant le code d'entrée), puis optimiser le graphique et enfin transformer le graphique en code d'octet java. Cela représentait environ 3/4 du travail du projet et le InsanlyFastByteCodeCreator était juste un raccourci pour tout tester._

Jetez un coup d'oeil au livre "Java Virtual Machine" de Jon Meyer et Troy Downing. Ce livre fait largement référence à l'assembleur Jasmin, il est très utile pour comprendre les mécanismes internes de la JVM.

16voto

Kami Points 3181

Le semestre dernier, j'ai suivi un cours de "construction de compilateur". Notre projet était exactement ce que vous voulez faire.

Le langage que j'ai utilisé pour écrire mon langage était Scala . Il fonctionne sur une JVM mais prend en charge de nombreuses fonctionnalités avancées que Java ne prend pas en charge (tout en restant entièrement compatible avec une JVM purement java).

Pour sortir le bytecode java, j'ai utilisé la fonction 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.

En plus du livre, je pense que vous pouvez trouver beaucoup d'informations en parcourant le site web de la Commission européenne. laboratoires que nous avons fait pendant le cours.

5voto

h3xStream Points 2710

ASM peut être une solution pour générer du bytecode. Pour commencer, consultez les rubriques sur la génération de éléments de la manuel .

5voto

Pedro Points 196

Le week-end dernier, je me posais la même question pour porter mon langage jouet sur la JVM.

Je n'ai passé 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 semble très bien. Si vous n'aimez pas antlr non plus, il y a un très bon livre sur l'analyse syntaxique "Parsing Techniques. A Practical Guide".

    Apprenez à construire des lecteurs de fichiers de configuration, des lecteurs de données, des générateurs de code orientés modèle, des traducteurs de source à source, des analyseurs de source et des interprètes. Vous n'avez pas besoin d'une formation en informatique : Terence Parr, créateur d'ANTLR, démystifie l'implémentation des langages en la décomposant en patrons de conception les plus courants. Patron par patron, vous apprendrez les compétences clés dont vous avez besoin pour mettre en œuvre vos propres langages informatiques.

    Le chapitre 10 couvre en 30 pages (trop rapide selon moi) ces sujets. Mais il y a d'autres chapitres qui vous intéresseront probablement.

    • 10 Construire des interprètes de bytecode

      • 10.1 Programmation des interprètes de bytecode .
      • 10.2 Définir une syntaxe en langage assembleur
      • 10.3 Architecture de la machine à bytecode . . . .
      • 10.4 Où aller à partir d'ici . . . . . . . . . .
      • P.26. Assembleur de bytecode . . . . . . . . . . . .
      • P.27. Interprète de bytecode basé sur la pile . . .
      • P.28. Interprète de bytecode basé sur les registres

      http://pragprog.com/titles/tpdsl/language-implementation-patterns

    • La mise en œuvre de Lua 5.0 C'est un excellent article sur les machines bytecodes basées sur les registres. Allez le lire, même pour le plaisir.

    • Lisp en petits morceaux. Ce livre enseigne comment écrire un compilateur à deux schémas qui compile en C. De nombreuses leçons peuvent être tirées de ce livre. Je possède une copie de ce livre et il est vraiment bon pour quiconque s'intéresse à lisp, mais peut-être pas votre tasse de thé.

      Il s'agit d'un compte rendu complet de la sémantique et de l'implémentation de toute la famille des langages Lisp, à savoir Lisp, Scheme et les dialectes apparentés. Il décrit 11 interprètes et 2 compilateurs ...

    http://www.amazon.com/Lisp-Small-Pieces-Christian-Queinnec/dp/0521562473

Vérifiez la VM Dalvik7, une VM basée sur les registres. La 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.

Prévoyez-vous de télécharger le code à un endroit quelconque ? J'aimerais y jeter un coup d'œil.

4voto

bakkal Points 13449

Je pensais jeter un coup d'oeil à 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).

Suggestion : Vous pourriez jeter un coup d'œil à Langage de programmation Lua Il existe des implémentations de la JVM, telles que LuaJ .

Léger Lua, rapide, centré sur Java interprète écrit pour J2ME et J2SE, avec des bibliothèques pour basic, string, table, package, maths, io, os, debug et coroutine, une compilateur , luajava, et JSR-233 liées à un moteur de script enfichable.

(À ne pas confondre avec LuaJava qui utilise une approche de librairies natives avec JNI).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X