CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Programmer un compilateur en JAVA

rvz
rvz
Niveau 7
03 septembre 2016 à 09:33:39

Bonjour à tous,

Je compte réaliser un compilateur en Java. Je sais qu'il existe notamment "javac" et j'aurais voulu m'en inspirer pour commencer. :ok:

Quelqu'un sait où je pourrais trouver au moins une description du fonctionnement du compilateur ? :(

GermanSkyline
GermanSkyline
Niveau 9
03 septembre 2016 à 11:03:36

Salut,

La tâche que tu souhaites réaliser n'est pas des moindres, mais c'est bien d'être ambitieux :)
Je suppose en tout cas que tu as déjà un bagage technique assez conséquent.

Il est important de réaliser un travail papier tout d'abord.
- Choisi déjà ce que tu veux pouvoir compiler (quelques mots clés indispensables, variables d'un certain type...)
- Analyse cette grammaire (il te faudra te renseigner sur la théorie des langages). Il faudra commencer à réfléchir à l'analyse lexicale, les transitions entre les différents symboles de ta grammaire, etc.
- Concevoir, sur papier éventuellement, l'automate (en pensant au type d'automate nécessaire)
- S'informer sur la construction de compilateur (comment faire, les différentes techniques, les bonnes pratiques d'implémentations)
- Et finalement, explore la documentation du java bytecode pour que ton code généré soit exécutable par la JVM (important pour que ton compilateur fonctionne) (http://docs.oracle.com/javase/specs/jvms/se8/html/)

J'ai sûrement oublié ou mal expliqué des étapes, mais d'autres gens se feront un plaisir de me corriger/compléter :)

Bon courage!

GermanSkyline
GermanSkyline
Niveau 9
03 septembre 2016 à 11:05:40

Okay, en fait j'avais compris un compilateur pour Java.

Tu veux réaliser un compilateur (la théorie reste la même) en java ou qui compile du java? Ou les deux?

tbol
tbol
Niveau 20
03 septembre 2016 à 11:09:04

http://openjdk.java.net/groups/compiler/

romtrep
romtrep
Niveau 8
03 septembre 2016 à 11:33:05

Je ne crois pas que de regarder un compilateur qui existe déjà t'aidera.

Pour apprendre à faire un compilateur, tu fais la même chose que pour apprendre n'importe quoi d'autre: tu lis un livre qui va graduellement t'expliquer les concepts ou bien des tutoriels.

Perso, je suis passé par ce tutoriel pour apprendre le fonctionnement du compilateur. http://compilers.iecc.com/crenshaw/

Pour les livres, le plus connu est sans doute le Dragon Book.
https://www.amazon.fr/Compilers-Principles-Techniques-Alfred-Aho/dp/0321486811/ref=sr_1_7?ie=UTF8&qid=1472895000&sr=8-7&keywords=compiler+design

rvz
rvz
Niveau 7
03 septembre 2016 à 13:41:50

Le 03 septembre 2016 à 11:05:40 GermanSkyline a écrit :
Okay, en fait j'avais compris un compilateur pour Java.

Tu veux réaliser un compilateur (la théorie reste la même) en java ou qui compile du java? Ou les deux?

Merci pour ta réponse du dessus :ok:
J'avais imaginé un compilateur pour le JAVA et le C pour commencer !

J'ai de solides bases en théorie des langages. J'ai cependant un peu de mal à m'imaginer que pourrait représenter les états / transitions ?

rvz
rvz
Niveau 7
03 septembre 2016 à 13:43:39

Le 03 septembre 2016 à 11:33:05 romtrep a écrit :
Je ne crois pas que de regarder un compilateur qui existe déjà t'aidera.

Pour apprendre à faire un compilateur, tu fais la même chose que pour apprendre n'importe quoi d'autre: tu lis un livre qui va graduellement t'expliquer les concepts ou bien des tutoriels.

Perso, je suis passé par ce tutoriel pour apprendre le fonctionnement du compilateur. http://compilers.iecc.com/crenshaw/

Pour les livres, le plus connu est sans doute le Dragon Book.
https://www.amazon.fr/Compilers-Principles-Techniques-Alfred-Aho/dp/0321486811/ref=sr_1_7?ie=UTF8&qid=1472895000&sr=8-7&keywords=compiler+design

Le premier lien me fait penser aux RFC :rire:
Merci, j'y jetterai un coup d'oeil après le lien de tbol, qui me semble aussi valable !

godrik
godrik
Niveau 30
03 septembre 2016 à 19:52:44

Le dragon book est probablement le livre le plus connu.
Cependant tu peux commencer plus simple. Par exemple en ecrivant un interpreteur pour un langage plus simple.
Quand j'etais en 1ere annee, on avait ecrit un interpreteur brainf*ck par exemple. Ca aide a comprendre des choses.

Note que de nos jours, beaucoup ne compile pas vers la JVM ou vers del'assembleur de nos jours. Ils compilent vers un autre langage.Compiler d'un langage vers du C peut etre beaucoup plus simple que de generer de l'assembleur.

rvz
rvz
Niveau 7
04 septembre 2016 à 20:20:17

Le 03 septembre 2016 à 19:52:44 godrik a écrit :
Le dragon book est probablement le livre le plus connu.
Cependant tu peux commencer plus simple. Par exemple en ecrivant un interpreteur pour un langage plus simple.
Quand j'etais en 1ere annee, on avait ecrit un interpreteur brainf*ck par exemple. Ca aide a comprendre des choses.

Note que de nos jours, beaucoup ne compile pas vers la JVM ou vers del'assembleur de nos jours. Ils compilent vers un autre langage.Compiler d'un langage vers du C peut etre beaucoup plus simple que de generer de l'assembleur.

Qu'est-ce que tu entends par un "interpréteur" ?

rvz
rvz
Niveau 7
04 septembre 2016 à 20:21:01

Je comptais bien compiler vers de l'assembleur...

godrik
godrik
Niveau 30
05 septembre 2016 à 00:25:05

Qu'est-ce que tu entends par un "interpréteur" ?

Je veux parler d'un logiciel qui interprete ton langage et l'execute mais sans le transformer en executable. Genre, bash c'est interprete, c'est pas compile.

GermanSkyline
GermanSkyline
Niveau 9
05 septembre 2016 à 09:28:12

Si tu comptes compiler vers de l'assembleur, il te faut savoir lequel je pense : quel architecture de processeur... Tu veux évidemment te dire que tu vas offrir la possibilité de compiler vers une panoplie d'architecture différente, mais là je pense que la charge de travail excède plusieurs années si tu es seul.
L'avantage à compiler du java en son bytecode, c'est que ce code est unique, et ensuite tu as la JVM qui se charge de l'adapter pour l'architecture courante.

saleGauss
saleGauss
Niveau 9
05 septembre 2016 à 12:00:54

Il n'apparait toujours pas clairement quel langage tu souhaites compiler.
Tu doit définir :
Le langage source = ?
Le langage cible = assembleur
Le langage hote = le langage utilisé pour écrire ton compilateur = ?

La première étape sera de définir la syntaxe abstraite (= la représentation interne ce celle-ci) et la syntaxe concrète de ton langage source (qui elle normalement est déjà définie car ton langage source existe déjà).

Tout comme godrik, je te conseillerais de commencer par un interpréteur. Il y a plusieurs avantages à cela. C'est globalement plus simple, tout en t'habituant à manipuler de la syntaxe (analyse syntaxique & grammaire & construction d'un parser, analyse lexicale & expressions régulières & construction d 'un lexer), tout en t'évitant de te soucier de la génération de code.
Et ces premières étapes sont de toutes façon aussi nécessaire pour un compilateur.

Si vraiment tu veux écrire un compilateur, choisit comme langage cible un langage interprété, comme du bytecode java. Tu n'auras pas à te soucier de l'allocation de registres (qui seront au passages virtuellement illimités), de l'architecture du processeur, et d'autres détails très techniques de bas niveau.

Mais pour moi, ce genre de projet se fait surtout à la fac (en M1), après un cours de théorie des langages (en L3), et idéalement pendant un cours sur les compilateurs et la génération de code. Si tu y vas en bricolant, sans connaissances théoriques ça ne risque pas de marcher fort (encore plus vrai pour compiler un langage de haut niveau vers de l'asm).

Et je confirme, le dragon book est la référence ultime. Et en prime, il se lit vraiment bien.

Enfin, mais c'est plutôt personnel, si tu t'intéresse à la manipulation de syntaxe, à l'interprétation, à la compilation et la traduction de langages, je ne peux que te conseiller très vivement de t'intéresser dans un premier temps aux langages fonctionnels (Ocaml ou Haskell). Ces langages sont le meilleur choix pour écrire un compilateur (= langage hote), car ils disposent d'abstractions très utiles pour manipuler de tels concepts abstraits.

Tu peux par exemple lire ça sur le langage Ocaml : http://caml.inria.fr/distrib/books/llc.pdf
Un des derniers chapitres aborde justement la compilation d'un (mini-)langage impératif.

Bon courage !

Sous forums
  • Aide à l'achat Mac
  • Internet
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment