Compilazione di una pagina ASP.NET

di Daniele Bochicchio, in ASP.NET,

In questo breve articolo cercheremo di capire meglio, nella pratica, come è impostato il sistema che sta alla base della compilazione (e della ricompilazione) automatica delle pagine ASP.NET.

Alla base di tutto: CLR e MSIL

Il cuore del sistema è ovviamente l'ormai noto Common Language Runtime (CLR).
Il .NET Framework si basa sul CLR, per l'esecuzione del codice MSIL ( Microsoft Intermediate Language ).
Il codice MSIL è prodotto dai vari compilatori .NET. In sintesi, ogni compilatore, C# o VB.NET che sia, compila in MSIL e non in un linguaggio macchina. E' anche questo il motivo per cui un linguaggio vale l'altro, alla fine ciò che generano è MSIL.
E' una premessa molto importante per capire, dunque, come avviene nel dettaglio la compilazione automatica della pagina.

La compilazione automatica

Il CLR esegue JIT (just in time) il codice MSIL, creato a partire da un compilatore.
La sequenza (che è spiegata anche meglio nalla figura) è grosso modo questa:

  • il worker process ASPNET_wp.exe viene invocato, perchè c'è una richiesta per una pagina ASP.NET
  • se la nostra pagina è invocata per la prima volta, si passa al punto successivo.
  • ora avviene la compilazione, attraverso il compilatore del linguaggio in cui è scritta la pagina, in MSIL. Dalla pagina viene creata una classe, salvata su disco con un nome temporaneo, in un assembly (oggetto).
  • il nostro assembly verrà eseguito JIT in memoria

Immagine

Cosa succede alle successive richieste?
Se la pagina non viene modificata, sarà utilizzata la versione già compilata in memoria.
Se la pagina dovesse subire modifiche o il servizio web venisse riavviato, si ripeterebbe il ciclo.

Un approndimento particolare lo merita il terzo punto. E' divisibile in più fasi:

  • preparazione della pagina alla compilazione: vengono individuate tutte le dipendenze con eventuali classi esterne
  • viene invocato il compilatore specifico per il linguaggio utilizzato nella pagina. Nel caso di Visual Basic.NET sarà vbc.exe, per C# csc.exe
  • è in questo frangente che si ha la percezione della lentezza della prima esecuzione. E' sufficiente avere un server con un discreto quantitativo di RAM per non accorgersene.
  • Il compilatore genera codice MSIL, salvato su disco.

La lentezza della prima esecuzione in realtà non è visibile, a meno che l'equipaggiamento di RAM sia basso (128 MB).

La ricompilazione automatica

Il framework, attraverso una classe particolare, FileSystemWatcher , contenuta nel namespace System.IO , monitora tutti i cambiamenti ai sorgenti.
E' sfruttando questo meccanismo che le modifiche sono intercettate al volo e la ricompilazione avviene.
Nella pratica, avviene una compilazione ex-novo, proprio perchè la versione precedente, contenuta su disco e memoria, sarà stata invalidata.
In questo modo potete continuare ad usare il vostro editor preferito, perchè ciò su cui andrete a lavorare sarà sempre e comunque un file sorgente "pulito".

Conclusioni

I cosiddetti internals del .NET Framework in moltissimi casi possono anche esserci oscuri, per il semplice fatto che è un argomento più da architetturista che da sviluppatore.
In moltissimi casi come questo, invece, una buona conoscenza dell'architettura può aiutarci a capire meglio come debba essere impostata un'applicazione, dei limiti che ci sono, ma soprattutto delle possibilità avanzate di sfruttare queste caratteristiche.

Contenuti dell'articolo

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti