{"id":16005776,"url":"https://github.com/thibaudcolas/metaprogramming","last_synced_at":"2026-02-02T01:33:55.716Z","repository":{"id":6285570,"uuid":"7519762","full_name":"thibaudcolas/metaprogramming","owner":"thibaudcolas","description":"Métaprogrammation et réflexivité — Exploration de la métaprogrammation dans différents langages — M2 AIGLE @ UM2","archived":false,"fork":false,"pushed_at":"2016-09-12T10:56:16.000Z","size":36,"stargazers_count":3,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-11-12T01:06:13.041Z","etag":null,"topics":["clisp","common-lisp","memoclass","metaprogramming","singleton"],"latest_commit_sha":null,"homepage":"","language":"Ruby","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/thibaudcolas.png","metadata":{"files":{"readme":"README.md","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":"2013-01-09T11:16:34.000Z","updated_at":"2022-01-21T07:08:12.000Z","dependencies_parsed_at":"2022-09-07T20:30:34.359Z","dependency_job_id":null,"html_url":"https://github.com/thibaudcolas/metaprogramming","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/thibaudcolas/metaprogramming","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thibaudcolas%2Fmetaprogramming","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thibaudcolas%2Fmetaprogramming/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thibaudcolas%2Fmetaprogramming/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thibaudcolas%2Fmetaprogramming/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/thibaudcolas","download_url":"https://codeload.github.com/thibaudcolas/metaprogramming/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thibaudcolas%2Fmetaprogramming/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28999852,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-02T01:32:03.847Z","status":"ssl_error","status_checked_at":"2026-02-02T01:32:03.458Z","response_time":56,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["clisp","common-lisp","memoclass","metaprogramming","singleton"],"created_at":"2024-10-08T11:21:40.667Z","updated_at":"2026-02-02T01:33:55.693Z","avatar_url":"https://github.com/thibaudcolas.png","language":"Ruby","readme":"# Métaprogrammation et réflexivité #\n\nUn ensemble d'expériences sur la métaprogrammation et la réfléxivité, réalisées dans différents langages dans le cadre de l'UE éponyme du premier semestre de master 2 AIGLE à l'Université Montpellier 2.\n\nLangages utilisés :\n- CLOS\n- Java\n- Ruby\n- OpenJava\n- Smalltalk\n\nAutres langages possibles :\n- Objective-C\n- Python\n- Javassist\n- OpenC++\n- Scala\n\nExpérimentations réalisées :\n- Design pattern singleton\n- Classes qui mémorisent leurs instances (mémo-classes)\n- Inspecteur d'objets\n\n## CLOS ##\n\nCLOS (Common Lisp Object System) est un ensemble d'opérateurs pour faire de la programmation orientée objets en Lisp. Ces opérateurs ne sont pas séparés du reste de Common Lisp mais historiquement on les regroupe tout de même.\n\nCLOS et son MOP (MetaObject Protocol) sont un bon terrain pour faire de la métaprogrammation.\n\n- [ANSI Common Lisp](http://www.paulgraham.com/acl.html), Paul Graham\n\n### Singleton ###\n\nEn CLOS, la façon la plus simple de créer des singletons est de créer une méta-classe possédant un slot étant l'instance à mémoriser. Cette implémentation est d'ailleurs [très répandue](http://www.tfeb.org/lisp/hax.html#SINGLETON-CLASSES). Les classes singleton n'auront alors plus qu'à définir comme méta-classe la classe des classes qui n'ont qu'une seule instance.\n\n- [singleton-class.lisp](https://github.com/thibaudcolas/metaprogramming/blob/master/clos/singleton/singleton-class.lisp)\n\n### Mémo-classes ###\n\nObjectif : Définir la classe `memo-class` des classes qui mémorisent leurs instances. Pour simplifier, on pourra lui associer la classe `memo-object` des objets qui sont mémorisés par leur classe.\n\nCLOS tire parti des méta-classes pour stocker les instances de chaque classe étant un mémo-object.\n\n- [memoclass.lisp](https://github.com/thibaudcolas/metaprogramming/blob/master/clos/memoclass/memoclass.lisp)\n\n### Inspecteur d'objets ###\n\nUn inspecteur d'objets tire parti du MOP pour afficher des informations sur chaque objet qui lui est donné et parcourir leur hiérarchie.\n\n- [inspector.lisp](https://github.com/thibaudcolas/metaprogramming/blob/master/clos/inspector/inspector.lisp)\n\n## Java ##\n\nEn Java, la métaprogrammation se fait par le biais de la librairie standard `java.lang.reflect`. Java n'est pas un langage tourné vers la métaprogrammation, mais grâce à cette API il demeure possible de métaprogrammer.\n\n### Singleton ###\n\nLe design pattern Singleton est très commun en Java, et est par exemple utilisé pour `java.lang.Runtime` ou `java.awt.Desktop`. Si sa mise en place ne nécessite pas d'utiliser la métaprogrammation, il est intéressant de savoir comment l'en protéger : comment empêcher l'utilisation de l'API reflect pour créer deux instances d'un supposé singleton.\n\nOn considère donc deux approches : l'une, très simple, permise par les structures [`enum`](http://stackoverflow.com/questions/5735797/is-this-singleton-resistant-to-both-serialization-and-reflection-attacks)) de Java \u003e 1.5, et l'autre [plus classique](http://technonstop.com/java-singleton-reflection-and-lazy-initialization) avec une initialisation tardive et un double verrouillage.\n\n1. [EnumSingleton.java](https://github.com/thibaudcolas/metaprogramming/blob/master/java/singleton/EnumSingleton.java)\n2. [ClassicSingleton.java](https://github.com/thibaudcolas/metaprogramming/blob/master/java/singleton/ClassicSingleton.java)\n\nTests :\n\n1. [TestEnumSingleton.java](https://github.com/thibaudcolas/metaprogramming/blob/master/java/singleton/TestEnumSingleton.java)\n2. [TestClassicSingleton.java](https://github.com/thibaudcolas/metaprogramming/blob/master/java/singleton/TestClassicSingleton.java)\n\n### Mémo-classes ###\n\nObjectif : Définir la classe `memo-class` des classes qui mémorisent leurs instances. Pour simplifier, on pourra lui associer la classe `memo-object` des objets qui sont mémorisés par leur classe.\n\n- [MemoObject.java](https://github.com/thibaudcolas/metaprogramming/blob/master/java/memoclass/MemoObject.java)\n\n### Inspecteur d'objets ###\n\nAffichage des propriétés d'un objet donné, séparant ses attributs hérités de ses attributs introduits, ses méthodes héritées de ses méthodes introduites.\n\n- [Inspector.java](https://github.com/thibaudcolas/metaprogramming/blob/master/java/inspector/Inspector.java)\n- [Test.java](https://github.com/thibaudcolas/metaprogramming/blob/master/java/inspector/Test.java)\n\n## Ruby ##\n\nRuby est assez intéressant car il implémente nativement la notion de méta-classe (appelées en Ruby _singleton classes_ ou _eigenclasses_).\n\n- [DrX](http://drx.rubyforge.org/), un inspecteur d'objet avec interface graphique\n- Plus d'informations sur [Wikipedia](https://en.wikipedia.org/wiki/Metaclass).\n- Et [encore plus d'informations](http://madebydna.com/all/code/2011/06/24/eigenclasses-demystified.html).\n- Ressources sur la [métaprogrammation en Ruby](https://github.com/geetarista/ruby-metaprogramming).\n\n### Singleton ###\n\nLe pattern singleton peut être obtenu de nombreuses façons en Ruby. On présente ici six techniques différentes (bien que certaines soient des variations de la même idée).\n\nCes six techniques peuvent être retrouvées au fil des [nombreux](https://practicingruby.com/articles/shared/jleygxejeopq) [articles](http://selfless-singleton.rickwinfrey.com/2012/12/19/singleton-pattern-metaprogramming-remix/) sur [le sujet](http://dalibornasevic.com/posts/9-ruby-singleton-pattern-again).\n\nIl est conseillé de parcourir ces six essais du plus simple au plus échevelé :\n\n1. [singleton-stdlib.rb](https://github.com/thibaudcolas/metaprogramming/blob/master/ruby/singleton/singleton-stdlib.rb)\n2. [singleton-metaclass.rb](https://github.com/thibaudcolas/metaprogramming/blob/master/ruby/singleton/singleton-metaclass.rb)\n3. [singleton-attr.rb](https://github.com/thibaudcolas/metaprogramming/blob/master/ruby/singleton/singleton-attr.rb)\n4. [singleton-module.rb](https://github.com/thibaudcolas/metaprogramming/blob/master/ruby/singleton/singleton-module.rb)\n5. [singleton-object.rb](https://github.com/thibaudcolas/metaprogramming/blob/master/ruby/singleton/singleton-object.rb)\n6. [singleton-last.rb](https://github.com/thibaudcolas/metaprogramming/blob/master/ruby/singleton/singleton-last.rb)\n\n### Mémo-classes ###\n\nObjectif : Définir la classe `memo-class` des classes qui mémorisent leurs instances. Pour simplifier, on pourra lui associer la classe `memo-object` des objets qui sont mémorisés par leur classe.\n\nLes mémo-classes s'approchent du design pattern [Multiton](https://en.wikipedia.org/wiki/Multiton_pattern). En Ruby, on peut les implémenter de différentes manières [plus](http://www.ruby-forum.com/topic/101486) ou [moins](http://stackoverflow.com/questions/6365638/how-to-get-class-instances-in-ruby) propres.\n\n1. [memoclass-attr.rb](https://github.com/thibaudcolas/metaprogramming/blob/master/ruby/memoclass/memoclass-attr.rb)\n2. [memoclass-module.rb](https://github.com/thibaudcolas/metaprogramming/blob/master/ruby/memoclass/memoclass-module.rb)\n3. [memoclass-objectspace.rb](https://github.com/thibaudcolas/metaprogramming/blob/master/ruby/memoclass/memoclass-objectspace.rb)\n\n### Inspecteur d'objets ###\n\nObjectif : définir une fonction inspect-object qui permette d'afficher le type d'un objet et les noms / valeurs de ses attributs.\n\nEn Ruby, toutes les fonctions de base d'un inspecteur d'objet sont définies dès l'origine dans le langage. Il est donc très facile de les réutiliser pour construire en [quelques lignes](https://github.com/seeingidog/deeper) des [inspecteurs d'objet](https://github.com/ongaeshi/rubywho) puissants.\n\nIci, on définit un module `Inspector` qui affiche toutes sortes d'informations sur un objet donné et qui permet d'en effectuer une copie profonde et de le sérialiser de différentes manières.\n\n1. [xmlserializer.rb](https://github.com/thibaudcolas/metaprogramming/blob/master/ruby/inspector/xmlserializer.rb)\n2. [example.xml](https://github.com/thibaudcolas/metaprogramming/blob/master/ruby/inspector/example.xml)\n3. [inspector.rb](https://github.com/thibaudcolas/metaprogramming/blob/master/ruby/inspector/inspector.rb)\n\n## OpenJava ##\n\n[OpenJava](http://www.csg.is.titech.ac.jp/openjava/) (mainteant OJ) est un langage basé sur Java, qui lui ajoute un MOP. OpenJava est relativement ancien (2002), mais son apport au Java vanilla reste toujours intéressant.\n\nProjets liés : [OpenC++](http://www.csg.is.titech.ac.jp/~chiba/openc++.html) et [Javassist](http://www.csg.is.titech.ac.jp/~chiba/javassist/)\n\n### Mémo-classes ###\n\nEn OpenJava, les mémo-classes sont simulées en créant une méta-classe qui ajoutera à ses instances un attribut `instances` et une méthode `getInstances`.\n\n1. [MemoClass.oj](https://github.com/thibaudcolas/metaprogramming/blob/master/openjava/memoclass/MemoClass.oj)\n2. [Person.oj](https://github.com/thibaudcolas/metaprogramming/blob/master/openjava/memoclass/Person.oj)\n3. [Student.oj](https://github.com/thibaudcolas/metaprogramming/blob/master/openjava/memoclass/Student.oj)\n\n## Smalltalk ##\n\nMOP très puissant sur lequel se sont basés Ruby et Objective-C.\n\n### Mémo-classes ###\n\n- [memoclass.st](https://github.com/thibaudcolas/metaprogramming/blob/master/smalltalk/memoclass/memoclass.st)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthibaudcolas%2Fmetaprogramming","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthibaudcolas%2Fmetaprogramming","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthibaudcolas%2Fmetaprogramming/lists"}