J'ai lu sur les bibliothèques que les gens ont écrites pour des langages comme Java et C # qui utilisent le tissage de code octet pour faire des choses comme intercepter des appels de fonction, insérer du code de journalisation, etc. J'ai également lu des macros Lisp / Clojure dans un essayer de mieux comprendre comment les utiliser. Plus je lis sur les macros, plus il semble qu'elles fournissent le même type de fonctionnalités que les bibliothèques de tissage de code d'octets. Par fonctionnalité, j'entends la possibilité de manipuler du code au moment de la compilation.
Des exemples de bibliothèques que j'ai examinées seraient AspectJ, PostSharp et Cecil.
Peut-on faire quoi que ce soit avec l'un et pas avec l'autre? Résolvent-ils réellement les mêmes problèmes ou est-ce que je compare des pommes et des oranges?
la source
Réponses:
Le tissage de code octet et les macros sont deux choses différentes.
Le tissage de code octet est un moyen d'intercepter les appels de fonction, de sorte que vous pouvez injecter une sorte de fonctionnalité (généralement une préoccupation transversale comme la journalisation) dans un appel de fonction, avant ou après l'exécution de la fonction. Le tissage de code d'octet se fait au niveau du code d'octet, ce qui signifie qu'il se produit après la compilation. La fonction elle-même n'est pas affectée. C'est l'une des techniques utilisées par la programmation orientée aspect .
Les macros sont un moyen d'étendre la syntaxe d'une langue. Dans sa forme la plus simple, une macro est tout simplement un moyen d'enregistrer des séquences de touches, puis de les lire à l'aide d'une touche de raccourci. Les macros de langue fonctionnent de manière similaire; un mot clé ou une autre construction de syntaxe remplace une sorte d'extension de macro. Bien sûr, cela est trop simplifié; un meilleur exemple d'une macro spécifique à Lisp peut être trouvé ici .
la source
Bien qu'elles puissent être utilisées dans le même but, les macros LISP sont assez différentes des plugins de tissage de code octet Java. Les macros LISP étendent la syntaxe LISP au niveau du code source LISP. Étant donné que les macros LISP sont écrites au même niveau que les autres codes LISP, elles constituent une fonctionnalité de langage couramment utilisée.
Les plugins de tissage de code octet Java fonctionnent au niveau de la machine virtuelle Java. Alors que de nombreux programmeurs Java peuvent utiliser des plugins de tissage de code octet écrits par d'autres, très peu de programmeurs Java écrivent leurs propres plugins de tissage de code octet.
Une partie du travail effectué par les plugins du compilateur Java se fait très facilement dans des langages dynamiques. L'interception d'appels de fonction est particulièrement simple.
la source
Les macros Lisp fonctionnent au niveau du code source. Si vous enveloppez une macro autour d'un morceau de code, vous pouvez faire beaucoup de choses. Y compris l'analyse du code source, l'insertion de code, la réécriture de code, etc.
Si vous souhaitez modifier les appels de fonction, Lisp utilise généralement deux mécanismes:
symboles de liaison tardive. Vous pouvez modifier la fonction liée à un symbole. Chaque fonction appelant qui passe par un symbole, utilise alors la nouvelle fonction.
Les implémentations Lisp fournissent parfois une fonctionnalité appelée «conseil». Cela permet d'exécuter du code avant, après ou autour des appels. Par exemple dans LispWorks: Advice .
Ainsi, vous pouvez intercepter des appels sans manipulation de code de bas niveau.
la source