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 ?

2voto

Jørgen Fogh Points 3579

Je vous recommande d'apprendre d'abord comment fonctionne l'assemblage JVM, si vous ne le savez pas déjà.

De nombreuses instructions se présentent sous la forme ?name , donde ? es i si l'instruction fonctionne sur avec un type d'entier et a s'il fonctionne avec un type de référence.

Fondamentalement, la JVM est une machine à pile sans registres, de sorte que toutes les instructions travaillent avec des données directement sur la pile. Vous pouvez pousser/déposer des données avec ?push/?pop et déplacer des données entre des variables locales (emplacements de la pile référencés par des offsets) et le sommet de la pile en utilisant la fonction ?store/?load . Voici d'autres instructions importantes invoke??? y if_??? .

Para le cours de compilateur de mon université nous avons utilisé Jasmin pour assembler les programmes. Je ne sais pas si c'est la meilleure méthode, mais au moins c'est un point de départ facile.

Voici une référence d'instruction pour une ancienne version de la JVM, qui peut contenir moins d'instructions qu'une nouvelle version.

1voto

Sloin Points 6086

La meilleure ressource pour le début pourrait être Présentation d'Ola Bini . Prenez également les diapositives.

0voto

joe snyder Points 2273

D'abord, je ferais marche arrière, je modifierais mon compilateur pour qu'il produise du vrai Java au lieu de codes d'octets Java (ce qui implique de créer plus un traducteur qu'un compilateur), et je compilerais la sortie Java avec l'environnement Java qui me convient (ce qui générerait probablement un meilleur code objet que mon propre compilateur).

Vous pourriez utiliser la même technique (par exemple, compiler en C#) pour générer des codes d'octets CLI, ou compiler en Pascal pour générer du P-code, etc.

La raison pour laquelle vous envisagez d'utiliser des codes Java plutôt que votre propre VM n'est pas claire, mais si c'est pour les performances, vous devriez bien sûr envisager de compiler en code machine réel.

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