Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Discussions


Index du Forum » Discussions » Comment créer un langage de programmation (interprété ou compilé?)
Captainluigi Hors ligne Membre Points: 815 Défis: 1 Message

Comment créer un langage de programmation (interprété ou compilé?)

Posté le 18/12/2020 07:29

Bonjour a tous.
Ça fait plusieurs années que je programme et que je créé des ''petites'' choses dans différents langages de programmation.
Et je me suis dit que ça serait cool de passer de l'autre côté de l'ordinateur (j'ai pas trouvé d'autre expression ), de créer mon propre langage de programmation.
Je sais qu'il y a deux type de langage de programmation (compilé vs interprété ), mais dans les deux cas on doit analyser et interprétrer le code (je pense que le C est tout d'abord interprété pour être ensuite compilé) même si c'est différent vu que les langages compilés ne sont interprétés qu'une fois (a la compilation).
Donc je voulais m'orienter vers un langage interprété style Basic et créer son interprèteur en Python (Je suis en train d'apprendre le C++ donc pas de bas-niveau pour l'instant , et puis le Python serait très facilement adaptable vers du JS -> interprèteur en ligne ...)
Mais par où doit je commencer? Comment fonctionne l'analyse syntaxique (détecter telle ou telle instruction, réussir à comprendre un programme où il y a deux espaces au lieu d'un entre des mots-clés -> gérer les différences d'orthographes , gérer l'imbrication -> pile , récursivité et fonctions ).
Y a t'il des cours en ligne du style openclassroom ?
Vous voyez que je suis encore très noob, même si j'ai 2/3 notions ...
Votre aide me serait très précieuse , parce que si je connais le principe d'un interprèteur j'hesiterai pas à tester ça sur Casio

Passez une bonne journée


Kbd2 Hors ligne Membre Points: 269 Défis: 0 Message

Citer : Posté le 18/12/2020 08:08 | #


Well to start, you should plan out your language first.
- How will you separate code into blocks for control flow?
- What types of variables will there be?
- Will there be functions/subroutines, and if so how will they be defined/called?
When you have a good idea of what your language will look like, it will be much easier to design a parser for it. There are many good resources online for all this
Captainluigi Hors ligne Membre Points: 815 Défis: 1 Message

Citer : Posté le 18/12/2020 08:25 | #


Kbd2 a écrit :
it will be much easier to design a parser for it.

Thank you for your answer ^^.
But I'm also wondering (it's the main subject of my question) how works this parser : lexical analysing, syntax analysing and how it format different code looks : imagine two spaces instead of the standard one , etc.
And I don't think there's big difference from one language parser to one another ... (Looks at C's style and Js's), It doesn't matter for me ...

Something like calculation parser doesn't depend from the language type, same for basic things like built-in keywords...

Ajouté le 18/12/2020 à 08:33 :
I just need explanations about '' how to make one interpreter : what are steps, how it works '' (sorry for my English)
Les bons artistes copient, les grands artistes volent. Picasso
Synthwave/Musique électro 80s sur ma chaine Youtube

Jouez à Mario sans arrêt sur votre Casio !
Cliquez pour découvrir
Cliquez pour recouvrir
Lephenixnoir Hors ligne Administrateur Points: 24234 Défis: 170 Message

Citer : Posté le 18/12/2020 08:56 | #


Il y a pas mal de choses que tu vois bien : oui l'outil qui « crée » le langage c'est le compilateur ou l'interpréteur, l'analyse syntaxique joue un rôle important, et on veut gérer les questions d'orthographe/ponctuation/etc (on dit lexicales).

Compilé vs interprété n'est pas deux types de langages, juste deux façons de coder un langage. Il existe des interpréteurs Basic et des compilateurs Basic. Il existe un interpréteur Python (canonique) et aussi un compilateur Python (Cython). C'est juste un choix à faire (et en fait beaucoup de code est partagé entre les deux).

Dans un langage de programmation, il est important de séparer deux concepts :
• La syntaxe c'est le format dans lequel on écrit le programme. Les mots-clés, la ponctuation, les accolades, Unicode, les blocs imbriqués, etc.
• La sémantique c'est la signification du programme. Variables locales et globales, fonctions, itération non bornée, récursion, etc.

Quand tu commences à jouer avec les outils, pouvoir maîtriser et influencer la syntaxe est super fun et valorisant. Mais au bout de quelques temps, on finit par réaliser que la sémantique est beaucoup plus profonde et définit plus fondamentalement le langage. En général donc on s'attarde plus sur la sémantique. Mais n'hésite pas à jouer avec la syntaxe autant que tu veux.

En pratique, un compilateur ou un interpréteur effectue plusieurs transformations successives du programme pour partir du fichier texte et arriver jusqu'à un résultat exécutable, soit à la volée (interpréteur) soit dans un autre langage (compilateur). Au début, le programme est juste un paquet de texte :

print("Hello, " + get_current_user());

On commence par faire une analyse lexicale qui groupe les caractères en mots. C'est ici qu'on gère la présence d'espaces (ou plus précisément qu'on les ignore la plupart du temps), et à partir de là on ne se soucie plus jamais jamais du texte du programme. Il ne reste plus qu'un flot de mots appelés « tokens » :

NAME(print) LPAR STR("Hello, ") PLUS NAME(get_current_user) LPAR RPAR RPAR SEMICOL

Ensuite on fait une analyse syntaxique pour grouper les tokens en « phrases ». C'est ici qu'on gère l'imbrication avec les parenthèses/accolades/etc. À partir de là on ne se soucie plus jamais de quel mot est écrit après quel autre, il ne reste plus qu'un objet structuré appelé « arbre de syntaxe » ou AST.

CALL(VAR(print), PLUS(STR("Hello, "), CALL(VAR(get_current_user))))

Puis vient la première partie « intéressante » qui est l'analyse sémantique. C'est ici que tu identifies toutes les variables locales et globales, que tu détermines le type des expressions et des opérateurs. Par exemple si get_current_user() renvoie un entier, tu peux décider que le + est invalide ou décider de convertir automatiquement en texte. Dans le deuxième cas l'AST peut devenir :

CALL(VAR(print), STR_CONCAT(STR("Hello, "), INT2STR(CALL(VAR(get_current_user)))))

Si tu programmes un interpréteur, tu peux parcourir récursivement l'arbre obtenu par l'analyse sémantique et exécuter le programme immédiatement. Si tu programmes un compilateur, il faut ensuite régénérer ton programme dans le langage cible. Par exemple si tu compiles vers du C, ça peut donner :

char *t1 = str_from_int(get_current_user());
char *t2 = str_concat("Hello, ", t1);
mylang_print(t2);
free(t2);
free(t1);


Donc voilà en gros les étapes à prendre. Pour information, un compilateur moderne ne génère pas directement du C comme ça, après l'analyse sémantique il génère une représentation intermédiaire qui est généralement du code à trois adresses, une sorte de langage universel. Ensuite il fait plein d'optimisations sur cette représentation intermédiaire, et enfin il produit du code cible (de l'assembleur, du C, etc).

Je pense que dans ton cas ce qui est important c'est de faire un truc propre avant de faire un truc complet. L'analyse lexicale c'est chiant à faire à la main : non pas que ce soit fondamentalement compliqué, mais c'est compliqué à faire efficacement. L'analyse syntaxique c'est chiant à faire à la main aussi sauf si la grammaire est LL(1), et là c'est de la vraie théorie compliquée. Les deux peuvent s'automatiser, il y a des outils (des générateurs de lexers et générateurs de parsers) auxquels tu dis à quoi ressemble le langage et qui génèrent les deux premières étapes pour toi. Je te conseille de générer le lexer et de faire un parser LL(1) comme Shadow15510 dans "Compylateur".

Voilà donc une roadmap :
1. Définir la syntaxe et la sémantique de ton langage. Je te conseille de commencer avec un truc super facile genre juste des calculs arithmétiques avec deux types de valeurs (entiers et flottants) et les conversions automatiques, ça te donnera les bonnes bases.
2. Écrire une grammaire pour ton langage. Tu peux lire des choses sur les grammaires formelles. L'article est très formel mais tu peux lire la section avec des exemples pour te faire une idée.
3. Écrire ou générer un lexer et un parser.
4. Faire un peu d'analyse sémantique juste pour vérifier que le programme a du sens.
5. Interpréter l'AST en sortie de l'analyse sémantique.
6. Étendre le langage, faire une étape de génération de code, ou ce que tu veux en fait.

Voilà voilà.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Captainluigi Hors ligne Membre Points: 815 Défis: 1 Message

Citer : Posté le 18/12/2020 08:59 | #


Merci beaucoup pour ta réponse, Lephé.
Je vais prendre un bon quart d'heure a lire tout ça , et après je te donnerai mes impressions et mes (dernières ? ) questions

Ajouté le 18/12/2020 à 09:59 :
Okay, j'ai quasiment tout compris.
Je vais tenir un journal de bord de temps en temps avec mes essais et mes tests, et on aura au final un tutoriel très complet et un langage tout neuf

Ajouté le 18/12/2020 à 10:00 :
Je vais commencer par un truc tout simple: une calculatrice...
Les bons artistes copient, les grands artistes volent. Picasso
Synthwave/Musique électro 80s sur ma chaine Youtube

Jouez à Mario sans arrêt sur votre Casio !
Cliquez pour découvrir
Cliquez pour recouvrir

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 104 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd