Byte codice tessitura vs macro Lisp

11

Ho letto delle librerie che le persone hanno scritto per linguaggi come Java e C # che fanno uso della codifica di byte code per fare cose come le chiamate alle funzioni di intercettazione, inserire il codice di registrazione, ecc. Ho anche letto su Lisp / Clojure macro nel tentativo di capire meglio come utilizzarli. Più leggo sui macro, più mi sembra che forniscano lo stesso tipo di funzionalità delle librerie di codice byte. Per funzionalità, intendo la capacità di manipolare il codice in fase di compilazione.

Esempi di librerie che ho visto sarebbero AspectJ, PostSharp e Cecil.

C'è qualcosa che può essere fatto con uno e non con l'altro? In realtà risolvono gli stessi problemi o sto confrontando mele e arance?

    
posta mortalapeman 30.03.2013 - 22:02
fonte

3 risposte

10

La tessitura e le macro dei codici byte sono due cose diverse.

La tessitura di codice byte è un modo per intercettare le chiamate di funzione, in modo da poter inserire una sorta di funzionalità (generalmente una preoccupazione trasversale come la registrazione) in una chiamata di funzione, prima o dopo l'esecuzione della funzione. La tessitura del codice byte viene eseguita a livello di codice byte, il che significa che si verifica dopo la compilazione. La funzione stessa non è influenzata. Questa è una delle tecniche utilizzate da Programmazione dell'aspetto .

I macro sono un modo per estendere la sintassi di una lingua. Nella sua forma più semplice, una macro è semplicemente un modo per registrare i tasti premuti e quindi riprodurli utilizzando un tasto di scelta rapida. Le macro di lingua funzionano in modo simile; una parola chiave o un'altra sintassi costruiscono dei sostituti per una sorta di espansione della macro. Questo è semplificato, ovviamente; un esempio migliore di una macro specifica per Lisp può essere trovato qui .

    
risposta data 01.04.2013 - 01:48
fonte
5

Sebbene possano essere utilizzati allo stesso fine, le macro LISP sono molto diverse dai plug-in per la tessitura di codice byte Java. Le macro LISP estendono la sintassi LISP a livello di codice sorgente LISP. Poiché le macro LISP sono scritte allo stesso livello degli altri codici LISP, sono una caratteristica linguistica comunemente utilizzata.

I plug-in per la tessitura di codice byte Java operano a livello di JVM. Mentre molti programmatori Java possono usare plug-in di codice byte scritti da altri, molto pochi programmatori Java scrivono i propri plugin per tessere codice byte.

Alcuni dei lavori eseguiti dai plugin per compilatori Java sono fatti molto facilmente in linguaggi dinamici. L'intercettazione di chiamata di funzione è particolarmente semplice.

    
risposta data 02.04.2013 - 22:24
fonte
4

Le macro Lisp funzionano a livello di codice sorgente. Se avvolgi qualche macro attorno a un pezzo di codice, puoi fare un sacco di cose. Compreso l'analisi del codice sorgente, l'inserimento di codice, la riscrittura del codice, ecc.

Se si desidera modificare le chiamate di funzione, in genere Lisp utilizza due meccanismi:

  • simboli vincolanti in ritardo. È possibile modificare la funzione associata a un simbolo. Ogni funzione chiama che passa attraverso un simbolo, quindi utilizza la nuova funzione.

  • Le implementazioni Lisp a volte forniscono una funzionalità chiamata 'consulenza'. Ciò consente di eseguire il codice prima, dopo o intorno a chiamate. Ad esempio in LispWorks: Consigli .

In questo modo puoi intercettare le chiamate senza manipolazione del codice di basso livello.

    
risposta data 03.04.2013 - 14:26
fonte

Leggi altre domande sui tag