Bonjour , je voudrais savoir comment l'on fait pour créer un langage puis créer un interpréteur ou un compilateur ?
je cherche des tuto
Quel logiciels prendre ?
Ps :J'avoue que je voudrais créer un langage mais je voudrais d'abord savoir comment procédé
ftp://https://www.jeuxvideo.com//ftp-developpez.com/general/cours/PolyCompil.pdf
Bon courage pour tout comprendre, assimiler et mettre en oeuvre ![]()
Je tiens à préciser (surtout à la vue de la quantité de C qu'il y a dans le poly cité ci-dessus) que des langages avec des traits fonctionnels sont beaucoup plus adaptés pour faire des interpréteurs.
Je pense notamment à Ocaml, qui fournit ses propres versions de lex et yacc que je trouve facile à utiliser.
Pour les compilateurs, le coté fonctionnel est aussi terriblement pratique … sauf qu'il ne s'agit pas de pondre la sortie
.
Je pense qu'un bon exercice pour comprendre comment cela peut marcher est d'ecrire une calculatrice qui prends une expression en entre comme : 3+4*2 et fournit le resultat. Apres on peut essayer de rafiner en mettant des variables dedans comme x+y*3 et fournir les valeurs de x et y separement.
Comment faut-il faire utiliser Ocaml ?
Au niveau du poly, je l'ai fournis car c'est le seul que je connaissais ^^'
Je n'ai pas vu de théorie et langage ni de compilation en C, mais en Ruby, qui est assez agile de ce coté là je trouve ![]()
je voudrais aussi savoir comment on fait pour faire la "grammaire" de son langage
faut-il un logiciel ?
Si possible pouvez vous me donner tous les logiciel qu'il fait avoir pour pouvoir créer son langage .
ca a deja ete fait. Les gens utilisent des lexeurs comme lex, yacc et bison. Ca peut etre plus facil a ecrire en caml qu'en C.
Apres, je n'ai pas dit que c'etait facil a faire.
je voudrais aussi savoir comment on fait pour faire la "grammaire" de son langage
faut-il un logiciel ?
Si tu veux que ce soit TON langage il va falloir que tu définisses toi même la grammaire du langage. C'est a dire qu'il va falloir que tu décides comment donner du sens a ce qui est écrit, comment comprendre un texte correctement écrit et comment rejeter ce qui ne correspond pas a une syntaxe correcte. Je doute qu'il y ai des logiciel pour ça, il vaut sans doute mieux le faire a la main (papier + crayon) puis retranscrire ta syntaxe et tes règles avec lex/yacc.
En première année de master j'avais fait un compilateur qui reconnaissait un petit sous-ensemble du C (même pas de fonction...) et sortait du bytecode java en lex/yacc/Ocaml et ça n'a rien de trivial. (néanmoins j'aurais pu être plus attentif)
Bon courrage
Donc si j'ai bien compris il faut que je crée ma "grammaire"
après je télécharge lex/yacc j'écris ma "grammaire" et après je fais quoi ?
La première chose c'est de définir ce que doit permettre ton langage. Cela impacte beaucoup sur le langage lui-même.
Petite citation dérivée des commentaires sur fetchmail dans "La cathédrale et le bazar" :
« Si la langage n'a pas besoin d'être Turing-complet, faites un langage le plus proche possible de l'anglais. »
Excusez moi de vous interrompre, mais j'ai comme l'impression que kaxes ne possèdes pas les bases requises pour ce genre de taches.
Au vu des questions
"quels logiciels utiliser ?"
"il faut que je crée ma "grammaire"
après je télécharge lex/yacc j'écris ma "grammaire" et après je fais quoi ? "
Je pense qu'il s'agit de quelqu'un qui ne possède pas des bases suffisantes en informatique en général.
Il va falloir d'abord apprendre et comprendre comment on crée des programmes, voir un peu d'architecture des machines élémentaires, puis programmer un certain temps et de manière plus avancée en impératif, en fonctionnel...
Enfin, s'intéresser à la théorie des langages :
Langages[langages régulier, hors contextes, dépendants au contexte...]
Automates[automates à états finis, automates à piles, machines de Turing]
Lemme de l'Etoile, Equation d'Arden
Grammaires[grammaires linéaires à droite, grammaires en général..]
Et encore à l'architecture des machines si tu veux aller jusqu'à la génération de code et générer du code efficace.
Il y a un sérieux paquet de choses théoriques à comprendre pour pouvoir faire convenablement les choses.
Quelqu'un qui veut sérieusement faire ce genre de choses ne poserait pas de telles questions. Il saurait s'y dans quel ordre s'y prendre.
C'est un peu comme si je demandais un mon ancien prof de physique "mais, comment je pourrais faire pour ecrire la théorie de la grande unification" sans connaitre les trois plans de la physique...
Mais ce n'est que mon avis...
N'y voyez rien de condescendant, je trouve juste que passer un poly sur la compilation ou faire référence aux langages Turing complet sur de telles questions, c'est un peu rigolo :D
NB : lorsque je parlais des trois plans de la physique, je faisais référence à la mécanique Newtonienne, la physique quantique, et la physique relativiste.
Merci , pour ta réponse mais j'ai précisé que je voulais savoir comment procédé et après voir si je pourrais ,mais ta réponse m'as servi donc encore merci!
bah avec plaisir. je pense que là tu as bonnes pistes pour appréhender convenablement tout ça.
Prends bien ton temps, et fais les choses étapes par étapes.
La compréhension vaut tout, et la compréhension des choses simples vaut plus que de l'à peu près sur des problèmes compliqués.
Mon petit conseil de la fin :
1/ Je ne sais pas si tu as déjà programmé. Si ce n'est pas le cas, je te proposes de commencer avec un langage tel Visual Basic. Il est disponible sous Windows exclusivement, et une version gratuite de l'IDE complet est disponible : recherches Visual Studio Express sur ton moteur de recherches favori.
Et il te suffit de prendre Visual Basic.
Pourquoi je conseille ce langage ou un équivalent pour débuter ?
Parce que sa syntaxe de base est assez simple mais proche de nombreux langages impératifs.
Parce qu'il permet de faire des choses plus jolies et plus "graphiques" que du C dans une console "command.exe de windows" ou "terminal linux".
Personnellement, quand je découvrais la programmation, ça m'avait permit de comprendre pas mal de petites choses en algo de base (conditions, boucles, fonctions...)
Avec ce langage, j'avais rapidement pu créer des fenetres qui demandait à l'utilisateur des choses, des boites de dialogues pour les erreurs, etc...
2/ D'ici quelques semaines, quand tu auras ces bases (si tu ne les avait pas), tu vas attaquer la phase autrement plus difficle : comprendre comment marche en gros un systême (de préference UNIX [regardes du coté de Linux]. Tu regarderas la notion de processus, de mémoire virtuelle, ...
Regardes avec attention la chaine de compilation (compilations, fichiers objets, edition des liens, code executable, image d'un processus)
Et en parallèle, jettes un coup d'oeil à de l'architecture des machines (de base).
Et en parallèle encore, essaye le langage C.
A ce moment là précis, une vision à peu près complete d'un systeme t'apparaitra.
Il te manquera encore de nombreuses briques pour tout comprendre, mais plein de choses seront plus claires.
Voila un bon programme je trouve ! :p
PS : J'ai essayé de mettre le plus de mots clefs cherchables sur google dans mes posts, si tu veux en savoir plus.
Je ne suis pas tout à fait d'accord avec ce qui a été dit. J'ai écrit mes premiers "compilateurs" et interpréteurs bien avant de connaître quoi que ce soit de sérieux à la théorie des langages (et même pour faire quelque chose de sérieux, je pense qu'une bonne partie de la liste de saleGauss n'est pas nécessaire).
Il s'agissait de langage simple, c'est pour ça que j'ai pu le faire, mais des langages turing complet tout de même. L'un d'eux était par exemple une extension des langage de programmation "polonaise inverse" que l'on trouvait dans les vieille calculatrice HP : une espèce d'assembleur pour une machine à pile. La grammaire est quasiment inexistante donc je parsais ça "à la main" en Visual Basic, puis je traduisais le code en "binaire" (juste une représentation lisible par un programme du code) et j'interprétais ça en C avec une machine virtuelle à pile qui effectuait les opérations.
Bref, tout ça pour dire, qu'à condition de définir un langage suffisamment simple (au moins pour commencer), il n'y a pas besoin d'être grand savant pour faire un projet de ce type. Et la connaissance d'un langage de programmation quel qu'il soit peut suffire.
Je trouve qu'il est plus approprié de voir les choses dans le bon ordre...
Souvent cela permet de gagner en temps et en compréhension...
Mais ce n'est que mon avis, et c'est sur que ca se discute...
Mon avis s'est essentiellement forgé en regardant des gars de ma promo.
Et bien quand il leur manque trop de notions, c'est à coup de "hé machin tu peux m'aider ?", de longs zieutages sur le nets, de code rafistolé et rustiné pour compbler "le cas qui marche pas pour la valeur 25"...
Et bien souvent, le prof doit filer son coût de main.
Et au final, l'étudiant (étudiant ?) regarde tout content tourner du code qu'il comprend à peine, et qui mettent en avant des concepts qui lui échappent totalement.
Mon dernier exemple en date ?
En écrivant un mini resolveur Prolog en Caml (en TP), je me suis rendu compte que nombreux étaient ceux qui ne comprenaient pas le fonctionnement d'un interprète Prolog, ni de l'idée sous jacente à ce langage.
Et pourtant ils étaient à fond, et tapaient du code à la vitesse de la lumière, j'entends encore le cliqueti des claviers... :p
j'avais déja de petite base en programmation visual basic
donc je vais continuer j'ai un livre qui est "Débuter en programmation le guide complet " de fredétyk blot et yann lautrédou
Quand j'aurais fais la "phase 2" de ton programme je devrais faire quoi ?
après la phase 1, qui était "les bases de l'algorithmique avec des boutons et de fenetre" et après
l'étape 2 qui est d'assez bas niveau "Archi-Systeme-Langage C", je te conseille :
Etape 3 : Commencer à appréhender une autre manière de penser les choses.
Je te conseille alors le merveilleux langage OCaml.
Après l'étape 2 de bas niveau, tu devrais jouir de plaisir.
Tu vas voir que l'ont peut monter en abstraction d'un cran encore.
Tu avais ton matériel, et tes interruptions matérielles. Tu avais ton systeme, qui te donnait l'illusion d'un matériel qui execute des programmes en meme temps sur un meme processeur, tu as vu des processus,et des signaux (sorte de couche au dessus des interruptions matérielles), et tout cela représentait déjà une belle abstraction.
Tu as vu le langage C, ou comment survivre en s'élévant encore un peu du matériel.
Et là, avec OCaml, tu vas voir comment résoudre des problême à priori difficiles avec une grande élégance.
Tu vas penser non plus en terme de "comment ça marche" mais "POURQUOI ca ne peut QUE marcher".
Mais pour profiter pleinement de cette étape, je ne peux que te conseiller de prendre un maximum de temps sur l'étape 2.
Je trouve (et je le répète, c'est purement subjectif), qu'on ne peut comprendre la beauté d'un langage de haut niveau sans avoir tripatouillé proche du matériel, en s'élevant petit à petit dans l'abstraction.
Voila.
Et surtout, prends le temps.
Et n'hésite pas à poser tes questions au fur et à mesure, il y a un paquet de gens compétents sur ce forum.
Bon courage, et have FUN* !
Ajout :
Et dans cette phase 3, en parallèle à l'apprentissage d'Ocaml, tu pourras bien sur d'intéresser aux types abstrait de données.
J'ai sous la main un très bon cours d'un de mes profs (en .pdf) que je peux passer (il n'est pas dispo sur le net sans loggin ><).
C'est un document hard, et mieux vaut avoir déjà implémenté des conteneurs standards (piles, listes, files) et abordé la généricité, polymorphisme, et gestion des erreurs(en caml par exemple).
Pourtant, dans son poly, aucun rapport direct avec la programmation.
Ca ne parle que de type, de sortes, de constructeurs, d'observateurs, de modèle initial, dégénéré... de secouage et de repliage..
Il ne s'agit que d"une techniques algébriques de développement.
Les 80 premières pages introduisent l'essentiel des types abstrait de données.
Mais encore une fois, mieux vaut les avoir déjà croisés de manière plus informelle, au détour d'une spécification C ou Caml.
Bref, Etape 3 = TAD + Fonctionnel (OCaml).
PS : Je le répète, cet ordre d'apprentissage ne reflete que ma manière de concevoir l'enseignement, au vu de ce que j'en vois tous les jours, les bons, et les mauvais cotés
PS2 : Je ne cache pas mon attirance pour les modèles théoriques, qu'il s'agisse de théorie des langages ou de techniques algébriques pour les TADs.
Tout le monde ne partage pas forcemment ce goût, et je le comprend bien...
Mes conseils sont donc à écouter, mais pas forcemment à suivre à la lettre :p
Voici son cours :