2010-02-05 12 views
5

Quindi sappiamo tutti che C# non ha un pre-processore macro C-like (e c'è una buona discussione sul perché here). Ma ora che AOP sta guadagnando trazione, sembra che stiamo iniziando a fare cose con i post-processori che eravamo abituati a fare con i pre-processori (tenete presente che sto solo bagnando i piedi con PostSharp quindi sono forse fuori base).Perché l'iniezione del codice post-compilazione è un'idea migliore dell'iniezione del codice pre-compilazione?

Sono un grande fan degli attributi in C#, ma se un pre-processore è stato lasciato fuori per buone ragioni (che, come utente precedente MFC, mi chiedo ma accetto), perché l'iniezione del codice post-compilazione è migliore idea di un'iniezione di codice pre-compilazione?

risposta

6

I motivi per cui ho scelto la post-compilazione durante la progettazione di PostSharp 5 anni fa sono:

  1. Agnosticismo linguistico.
  2. MSIL ha specifiche di stabler rispetto ai linguaggi di alto livello (che hanno aggiornamenti non banali ogni due anni).
  3. La maggior parte delle volte, MSIL è il livello di astrazione necessario per affrontare gli aspetti. Non è necessario conoscere tutti i costrutti equivalenti (si pensi ad "usare" e "provare finalmente").
  4. Prima del 2008, nessuno è riuscito a produrre un compilatore C# decente. Le difficoltà incontrate da Mono erano abbastanza impressionanti, anche se ora sono state raggiunte.
  5. La gestione del binario sembrava molto più rapida rispetto al codice sorgente.
  6. La gestione di un assieme binario consente di eseguirlo - l'assieme in elaborazione può trasformarsi da solo. Era inaudito prima che PostSharp Laos fosse pubblicato per la prima volta.

Detto questo, le implementazioni di AOP per C/C++ sono davvero un pre-compilatore (WeaveC) e le implementazioni in Java sono un'estensione del compilatore (per la buona ragione che ci sono molte implementazioni OSS del compilatore Java).

-gael

+0

Sono d'accordo, personalmente per te ha perfettamente senso. Tuttavia, nessuna delle società per le quali ho lavorato ha potuto adottare PostSharp per un singolo motivo: un passo extra non standard nella compilazione degli assembly, rendendo praticamente impossibile l'integrazione in un processo più complicato di un semplice. –

2

Se si dovesse eseguire la pre-compilazione, è necessario interpretare i file di origine da tutte le diverse lingue supportate e quindi generare codice in quella lingua prima che venga passato al compilatore. Con la post-elaborazione si può semplicemente usare la riflessione per esaminare gli assemblaggi sia che la lingua originale fosse C#, Visual Basic, o qualsiasi altra cosa.

+0

Sulla stessa linea, posso aggiungere che il codice compilato in C# viene compilato in MSIL (se non diversamente specificato), che non è ancora codice macchina reale. È un codice JIT. Quindi, tecnicamente, quello che tu definisci "postprocessore" è ancora in realtà pre-processore poiché il codice è compilato in fase di esecuzione. – regex

+0

@regex: sì tecnicamente vero, tuttavia nel contesto della mia domanda l'MSIL è una unità di compilazione allo stesso modo di un PE con C++ (tecnicamente una dll .NET è ancora un PE, ma tu prendi il mio punto). – dkackman

+0

Quindi il supporto della lingua incrociata come motivo principale (vedi @nobugz sotto)? – dkackman

2

È semplicemente più semplice. IL è un heckofalot più facile da analizzare rispetto al codice sorgente C#. Ed è un linguaggio agnostico.

+0

Un pre-processore per la sostituzione del testo non è stato lasciato fuori da .net perché era difficile da fare; almeno secondo il post di Gunnerson.L'agnosticismo linguistico posso comunque comprare. – dkackman

+0

Non era questo il mio punto, un preprocessore non sarà mai disponibile. Che lascia solo l'analisi e la riscrittura del codice sorgente in alternativa. Questo è tecnicamente possibile, ma spiacevole. –

4

Tecnicamente, esiste un'opzione di pre-compilazione per C# integrata in Visual Studio: Text Template Transformation Toolkit (T4). Questo ti permette di fare cose incredibili in una fase di pre-compilazione, ed è la base di molti prodotti, come alcune ORM, ecc.

+0

Sai, non ho mai esaminato quelli. Dovrei finalmente arrivare a questo. – dkackman

+0

Questo in pratica gestisce la sostituzione del testo pre-compilazione. Funziona alla grande. Ad esempio, Subsonic è completamente costruito attorno ai modelli T4: http://subsonicproject.com/docs/T4_Templates –