Salut,
Avant toute réflexion, je sais pertinemment que créer un langage de programmation est bien trop ambitieux avec mes compétences actuelles mais j'aimerais tout de même tenter ma chance dans ce projet, un échec même cuisant ne peut être que bénéfique pour mon apprentissage
Mes compétences sont en effet faibles, en tout cas trop pour créer un langage, j'ai fait un an de Python, du JAVA, un peu de C++ et ai touché à quelques langages mais que je maîtrise moins (Ruby, Lua, Haskell et JS).
J'ai déjà effectué quelques recherches sur le procédé de création d'un langage, j'ai réfléchi aux concepts et paradigmes principaux que je voudrais implémenter dans mon langage mais, au moment de coder, je bloque, je ne sait pas par où commencer. J'aimerais programmer ce langage en CPython car je suis à l'aise en Python et le C est plus rapide.
Mon problème réside dans le fait que je ne sais pas comment un compilateur marche ! Malgré mes recherches je n'arrive pas à comprendre, je cherche une bonne âme qui saurait m'expliquer comment un compilateur fonctionne. Le tokenizer/lexer je sais déjà comment faire.
Merci d'avance,
AZ
étant moi aussi dans la création de mon langage, je crois bien pouvoir t'aider.
Le compilateur n'est juste qu'un programme qui traduit le code source d'un langage à un autre de plus bas niveau. Exemple : pour mon langage, le code était traduit en C++ maintenant j'opte pour le C.
La traduction du code se fait en différentes étapes :
Nous allons traduire :
var x as int en C en partant des procédés utilisés par mon compilateur.
1. Tokenisation C'est le fait de diviser le code en lexèmes, parties et de les reconnaitre ( de préférence grâce au regex ).
Pour le code plus haut, ça donnera : var -> mot-clé var x -> identifiant as -> mot-clé as int -> mot-clé int
2. Analyse syntaxique C'est le fait de vérifier l'exactitude des instructions. A partir du code otenu plus haut, mon compilateur va savoir qu'avec le mot-clé var en début d'instruction, c'est une initialisation donc, on va vérifier que le reste de l'expression est correcte : Y'a t'il un nom pour la variable ? Son type est-il précédé de as ? ect...
3. [ Optionnel ] Production d'un arbre XML avec la structure du programme.
Ex : < init name='x' type='int'/>
4. Analyse sémantique
C'est la phase qui permet de comprendre le code source : On déclare une variable x ; l'avait on déjà déclaré ??
Cette partie détecte les erreurs de logique .
5. Production de l'Arbre Syntaxique Abstrait ( Abstract Syntaxic Tree [ AST ] ) C'est la représentation du programme, de son squelette sur lequel on effectuera d'éventuels optimisations . Perso j'utilise XML mais on parle de BNF.
6. Production des sources du langage cible selon l'AST puis
7. Utilisation d'un compilateur existant comme GGC.
Salut Orlson (j'ai vu ton langage d'ailleurs, super ),
Le procédé de tokenisation ne me pose pas vraiment de problème, mais merci quand même. C'est vraiment la compilation en elle même qui demeure un mystère. Je ne comprend pas, GCC compile quoi exactement ? Si j'ai bien compris, grossièrement, un compilateur c'est juste le google traduction des langages: tu appelle le parseur avec en argument du code de ton langage et il te retourne du code dans un langage qui existe déjà, c'est ça ?
Erf oui, je me suis mal exprimé... Je voulais dire, le code C, il le trouve où ? C'est bien nous qui devons traduire le code de notre langage en C, non ? (Remarque avec CPython ça devrait pas être trop compliqué).
Merci pour les précisions en tout cas
Oui nous allons écrire le code C du moins le compilateur. Attention à ne pas être tenter de sauter une étape, faut essayer de bugger le compilateur et n'oublies pas de produire le code C à partir de l'AST.
Le principe de la compilation est effectivement de traduire un langage en un autre. Dans le cadre de GCC, il s'agit de traduction de C ou C++ vers du langage machine (instructions comprises par ta machine pour pouvoir exécuter le programme).
Cependant, pour se simplifier la tâche, la traduction est souvent faite en plusieurs passes, en manipulant des représentations intermédiaires de ton programme (comme l'AST évoqué plus haut, les quadruples), avec des optimisations pouvant survenir à chaque étape.
Je t'invite à lire la documentation de clang pour plus d'informations sur le fonctionnement d'un compilateur.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
entwanne — @entwanne — Un zeste de Python — La POO en Python — Notions de Python avancées — Les secrets d'un code pythonique