{"id":18083019,"url":"https://github.com/progval/impterpreter","last_synced_at":"2025-04-05T23:13:50.505Z","repository":{"id":15417684,"uuid":"18149917","full_name":"progval/Impterpreter","owner":"progval","description":"Implémentation en OCaml d’un interpréteur d’un petit langage impératif","archived":false,"fork":false,"pushed_at":"2014-03-26T18:56:03.000Z","size":144,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-02-12T05:15:21.692Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"OCaml","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/progval.png","metadata":{"files":{"readme":"README.txt","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-03-26T18:55:35.000Z","updated_at":"2014-03-26T18:58:33.000Z","dependencies_parsed_at":"2022-08-30T14:11:32.064Z","dependency_job_id":null,"html_url":"https://github.com/progval/Impterpreter","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/progval%2FImpterpreter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/progval%2FImpterpreter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/progval%2FImpterpreter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/progval%2FImpterpreter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/progval","download_url":"https://codeload.github.com/progval/Impterpreter/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247411243,"owners_count":20934654,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-31T14:06:42.935Z","updated_at":"2025-04-05T23:13:50.488Z","avatar_url":"https://github.com/progval.png","language":"OCaml","funding_links":[],"categories":[],"sub_categories":[],"readme":"Utilisation\n===========\n\nExécution\n---------\n\nÀ partir d’un fichier existant : cat tests/test_042.imp | make run\nEn entrant directement le programme : \n    * Exécuter : make run\n    * Entrer le programme\n    * Terminer avec Ctrl-D\n\nRemarque : « make run » est équivalent à « make \u0026\u0026 ./impterpreter ».\n\nTests\n-----\n\nDes fichiers de test sont présents dans le répertoire tests/.\n\nLe script tests/run.sh exécute tous les tests dont le nom commence par\n« test_ » et compare leur sortie à celle attendue (indiquée dans\ntests/expected_output.txt). S’il y a une différence, elle est\nindiquée dans le fichier _build/tests.diff.\nOn peut aussi exécuter les tests avec la commande « make tests ».\n\nLe fichier tests/infinite_recursion.imp ne s’arrête jamais et permet de\nvérifier (à l’aide d’un outil externe, tel que « ps -v ») qu’une récursion\ninfinie mais terminale ne fait pas augmenter la taille de la pile.\n\nNotes d’implémentation\n======================\n\nAmbiguïtés\n----------\n\nPriorité classique des opérateurs :  */ puis +- puis andor puis not puis \u003e\u003c=\n\nDangling else : un else est associé au if le plus proche possible\n\nwhile b do c1;c2 : interprété comme (while b do c1); c2\n\nStructure du code\n-----------------\n\nLes définitions des expressions arithmétiques, booléennes, et des commandes\nsont respectivement dans expr.ml, assertion.ml, et com.ml.\nLa gestion de la mémoire est dans memory.ml. La liste des fonctions est aussi\nstockée dans la Memory.mem (pour éviter de devoir passer un paramètre de plus\nà toutes les fonctions de réduction).\nÀ cause des problèmes de dépendance circulaire :\n    * Les réductions des trois types d’expressions sont dans step.ml\n    * Les types « mem », « expr », et « assertion » sont paramétrés par\n      un type « 'com » (qui, en pratique, est toujours Com.com).\n\nToute la sémantique (expressions arithmétiques, expressions booléennes,\ncommandes) est à petits pas.\n\nRéduction des appels de fonction\n--------------------------------\n\nLorsque l’on rencontre une expression de la forme « f(e1, e2) »\n(codée par « RawCall(f, e1, e2) »), les deux expressions arithmétiques\ne1 et e2 sont d’abord réduites en deux entiers, on obtient alors une\nexpression de la forme « f(i1, i2) » (codée par\n« RawCall(f, Const i1, Const i2) »).\nOn réduit alors celle-ci en un doublet « {mem, c} » (codé par\n« Call(mem, c) ») où mem est l’état mémoire « {A=i1, B=i2} »\n(si les arguments de f sont A et B), et on réduit ce doublet jusqu’à ce\nqu’il soit d’une des formes suivantes :\n    * {mem, return i} avec i entier\n    * {mem, return i; c} avec i entier\n    * {mem, skip}\nL’étape suivante de la réduction est de remplacer ce doublet par\n« Const i » (ou « Const 0 » dans le troisième cas).\n\nOptimisation de la récursion terminale et des « tail calls »\n------------------------------------------------------------\n\nElle est désactivable en supprimant les lignes 93 à 96 de step.ml.\n\nElle se fait en détectant les structures de la forme « return f(i, j) »\noù i et j sont des entiers, qui est obtenue après réduction de toute\nstructure de la forme « return f(e1, f2) » où e1 et e2 sont des\nexpressions arithmétiques.\n\nEn exécutant l’interpréteur sur le fichier tests/infinite_recursion.imp,\navec et sans cette optimisation, on constate que sans celle-ci, le programme\nva moins vite et consomme plus de mémoire.\n\nAutres\n------\n\nPossibilité d’avoir des instructions vides (ie. terminer un programme par\nun point-virgule, comme dans la plupart des langages en utilisant).\n\nPas de variable globale. À l’intérieur d’une fonction on ne peut pas\naccéder aux variables définies dans le corps du programme.\nPas de notion de fermeture puisque les fonctions sont définies hors du\ncorps du programme.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprogval%2Fimpterpreter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fprogval%2Fimpterpreter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprogval%2Fimpterpreter/lists"}