Skip to content

Un langage de programmation inspiré de Scheme et d'OCaml (Compilateur + Machine Virtuelle)

Notifications You must be signed in to change notification settings

dinosaure/dinoscheme

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

53 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Le DinoScheme

Le DinoScheme est un langage informatique compilé (avec le logiciel dinc - OCaml) et un interprété à l'aide d'une machine virtuelle (avec le logiciel dini - C). Le langage dérive de la syntaxe de Scheme mais qui dispose en plus une implémentation du système F dans le compilateur. C'est donc un langage fonctionnel qui reste (et restera) basique.

Compilation

Dépendance: OCaml OCamllex OCamlbuild Menhir GCC GNU Flex

cd dinc && make cd dini && make cd dino && make

Le compilateur Dinc est un compilateur OCaml basique qui a besoin de OCamllex pour le Lexer et Menhir pour le Parser. OCamlbuild est utilisé pour gérer les dépendances entres les différents modules qui composent le compilateur. Une version futur aura pour dépendance l'API LLVM pour OCaml (dans une autre branche ou un autre dossier).

L'interpréteur Dini est une machine virtuelle qui n'a que pour dépendance le compilateur Clang. Cette machine virtuelle n'est là que pour titre indicatif - c'est une version « propre » de Dino. Vous pouvez l'essayer (cette version est stable) sans risque de trou spatio-temporel.

L'interpréteur Dino est une machine virtuelle écrite pour le générateur GNU Flex. C'est ce projet qui a pour ambition de s'intégrer à d'autres projets. L'ajout d'opcode est plus simple que sur Dini (grâce à GNU Flex), cette version n'est pas stable et sera plus sujet à des modifications.

Objectifs

Un projet avec une grande ambition se doit d'avoir une interface pour intéragir avec l'utilisateur. Il existe plusieurs moyens de mettre en place cette interface. À l'aide des GUIs mais aussi à l'aide de fichier de configuration où même à l'aide de petit langage informatique qui ne sont là que pour offrir un modèle d'interaction plus complexe mais plus puissant entre le projet et l'homme.

Le DinoScheme a pour objectif d'offrir un langage très basique et très simple à modifier au niveau du « core » pour les développeurs voulant ajouter une tel interface à leurs projets. L'objectif est donc d'être capable de modifier le DinoScheme afin qu'il correspond aux problématiques du projet maître pour le définir ainsi comme interface maniable entre le logiciel et l'homme.

Mais le langage doit être capable d'offrir une certaine sécurité pour le développeur afin que celui ci n'est pas (ou très peu) à s'occuper d'un hypothétique « debug » entre la machine virtuelle et son programme. Ainsi, le travail sur ce dépôt n'a que pour ambition d'offrir un langage « safe » pour qu'il n'y est que très peu de risque à l'utiliser dans un projet annexe.

Utilisation

Le langage dérive de Scheme. Je vous réfère au dossier « examples » qui contient pas mal d'exemple notamment sur la gestion des chaînes de caractères. Il faut utiliser le logiciel Dinc pour compiler un fichier en DinoScheme. Par défaut, Dinc lit sur stdin et écrit sur stdout. L'option -o permet de définir un output d'écriture et le prochain premier argument est l'input.

Exemple: ./dinc.native file.dino -o file.dono ./dinc.native file.dino > file.dono ./dinc.native < file.dino > file.dono

Une nouvelle utilisation vient de se mettre en place. En effet, on est capable de définir les primitives dans un fichier *.ding et de le donner en paramètre à la compilation pour ensuite générer le fichier *.dono qui va bien. Cette modification permet de se délaisser des compétences OCaml pour changer des détails dans la compilation. Le fichier *.ding intervient avec l'option -i. Si il n'y a pas de fichier *.ding, il n'y a aucune primitive qui n'est assigné dans le compilateur (comme + par exemple). Ce fichier est donc nécessaire à la compilation.

Dini et Dino sont des interpréteurs qui prennent en paramètre un unique fichier compilé à l'aide de Dinc. Il exécute ensuite le code du fichier donné en paramètre. Vous pouvez voir le « debug » de ces interpréteurs en ajoutant #define DEBUG dans le fichier dinoscheme.h. Vous aurez sur stderr tout une sortie sur les instructions que fait la machine virtuelle.

Si vous êtes face à un bug sur la machine virtuelle, il peut être intéressant d'activer DEBUG et de m'envoyer le fichier source et la sortie d'erreur. La correction du bug va parcontre être très long vue la masse d'information à manipuler. Si, là aussi, vous avez des idées pour un DEBUG plus rapide, je suis prenneur, c'est pas cool de ce taper le dump de la mémoire et de vérifier toutes les références.

/!\ Dini est désormais obsolète puisqu'il y a eu une grande phase de debug dans Dino qui n'ont pas été reporté sur Dini. En somme, si j'ai le temps, j'y passerais du temps mais je vous conseille d'utiliser Dino de préférence. /!\

Avenir

Aujourd'hui, le DinoScheme est un projet maintenu par un étudiant Epitech qui se voit offrir des soutiens annexes internes à l'école pour atteindre l'objectif expliqué plus haut. Ainsi, nous travaillons sur des problématiques génériques à l'aide du Laboratoire ACSEL afin d'y prendre profit et les utiliser par la suite dans se projet (pour ne citer que TyLLVM ou une gestion plus précise des exceptions).

Ces différents travaux indépendants du DinoScheme ont pour ambition d'offrir un environnement plus « safe » au développeur. Cet environnement permmettra de d'obtenir un langage dont les problématiques liées au « debug » ne s'addressent plus aux développeurs qui utiliseront le langage.

Conclusion

Le projet manque un logo. Vous pouvez envoyer une appréciation, une critique, un patch, ou toute autre initiative à cette adresse: romain [point] calascibetta [at] epitech [point] eu

About

Un langage de programmation inspiré de Scheme et d'OCaml (Compilateur + Machine Virtuelle)

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages