Il y a deux aspects, je ne sais pas auquel tu penses en demandant "comment c'est k'on fait", mais je vais tenter de résumer les deux:
1- Créer le langage
il faut qu'il soit analysable par un programme, donc contrairement aux langages naturels, il va devoir avoir une grammaire plus stricte et non ambiguë.
Il faut essayer de faire entrer les fonctionnalités que l'on veut dans la syntaxe sans la rendre trop lourde ou ambiguë.
Il faut choisir parmis les différentes manières de programmer celle(s) que l'on veut introduire dans le langage, par exemple:
- est-ce que les variables ont un type défini lors de leur création, ou bien est-ce que ce type peut changer ?
- peut-on redéfinir les opérateurs ? Par exemple si on crée un "objet" Matrice, peut on redéfinir l'opérateur "+" pour écrire "m1 + m2" ou bien doit-on définir une nouvelle fonction "addition_matrice" ?
- indique-t-on les opérations que l'ordinateur doit effectuer, dans l'ordre, ou bien indique-t-on les calculs qu'il doit faire, en le laissant décider comment il les fait ?
etc.
2- Créer un compilateur ou interpréteur
Il y a plusieurs étapes:
- Créer la fonction qui transforme le texte du programme en quelque chose de plus facilement exploitable, une représentation intermédiaire. Pour prendre l'exemple des opérations arithmétiques:
a = 1+2*6+3
va être découpé pour indiquer comment on fait les opérations:
2*6
+3
+1
affecté à a
Pour les grammaires courrament utilisées, l'écriture de cette fonction est à peu près automatique, car il y a des outils qui le font automatiquement. Lex (flex chez GNU) se charge de découper le texte en tokens, puis Yacc (Bison chez GNU) prend une grammaire et permet simplement de construire la représentation intermédiaire.
- Si possible, on essaye d'optimiser cette représentation intermédiaire (surtout si on fait un compilateur). Par exemple si on voit qu'à plusieurs reprises on additionne deux variables sans que leurs valeurs changent, on va essayer d'éviter de refaire l'addition à chaque fois. L'optimisation de la représentation intermédiaire, c'est difficile.
- Ensuite, si on fait un interpréteur, on doit "lire" la représentation et effectuer les opérations demandées, pour calculer le résultat. Si on fait un compilateur, c'est pareil, sauf qu'au lieu d'exécuter les instructions on les traduit dans un autre langage. On les traduit en langage machine si on veut directement faire un programme, mais on peut aussi les traduire en C puis compiler le tout avec gcc, c'est plus simple.
[^] # Re: Expliquer...
Posté par Yusei (Mastodon) . En réponse au journal Le langage L. Évalué à 4.
1- Créer le langage
il faut qu'il soit analysable par un programme, donc contrairement aux langages naturels, il va devoir avoir une grammaire plus stricte et non ambiguë.
Il faut essayer de faire entrer les fonctionnalités que l'on veut dans la syntaxe sans la rendre trop lourde ou ambiguë.
Il faut choisir parmis les différentes manières de programmer celle(s) que l'on veut introduire dans le langage, par exemple:
- est-ce que les variables ont un type défini lors de leur création, ou bien est-ce que ce type peut changer ?
- peut-on redéfinir les opérateurs ? Par exemple si on crée un "objet" Matrice, peut on redéfinir l'opérateur "+" pour écrire "m1 + m2" ou bien doit-on définir une nouvelle fonction "addition_matrice" ?
- indique-t-on les opérations que l'ordinateur doit effectuer, dans l'ordre, ou bien indique-t-on les calculs qu'il doit faire, en le laissant décider comment il les fait ?
etc.
2- Créer un compilateur ou interpréteur
Il y a plusieurs étapes:
- Créer la fonction qui transforme le texte du programme en quelque chose de plus facilement exploitable, une représentation intermédiaire. Pour prendre l'exemple des opérations arithmétiques:
a = 1+2*6+3
va être découpé pour indiquer comment on fait les opérations:
2*6
+3
+1
affecté à a
Pour les grammaires courrament utilisées, l'écriture de cette fonction est à peu près automatique, car il y a des outils qui le font automatiquement. Lex (flex chez GNU) se charge de découper le texte en tokens, puis Yacc (Bison chez GNU) prend une grammaire et permet simplement de construire la représentation intermédiaire.
- Si possible, on essaye d'optimiser cette représentation intermédiaire (surtout si on fait un compilateur). Par exemple si on voit qu'à plusieurs reprises on additionne deux variables sans que leurs valeurs changent, on va essayer d'éviter de refaire l'addition à chaque fois. L'optimisation de la représentation intermédiaire, c'est difficile.
- Ensuite, si on fait un interpréteur, on doit "lire" la représentation et effectuer les opérations demandées, pour calculer le résultat. Si on fait un compilateur, c'est pareil, sauf qu'au lieu d'exécuter les instructions on les traduit dans un autre langage. On les traduit en langage machine si on veut directement faire un programme, mais on peut aussi les traduire en C puis compiler le tout avec gcc, c'est plus simple.