Visual Basic .NET - Il Framework .Net
di Federico Barbati
Con questa nuova versione di Visual Basic .Net Microsoft non ha solo migliorato VB6 ma ha riscritto completamente il codice.
Alla base di tutto c'è il .NET Framework che sicuramente merita un approfondimento.
Che cos'è il Framework?
Un Framework è un insieme di classi che collaborano tra di loro e che risolvono o semplificano le problematiche di programmazione. Per esempio, quando visualizzo un form, non faccio altro che ereditare la classe del Framework System.Windows.Forms.Form nella quale è incapsulato tutto il codice che serve per costruire una finestra vuota. Questo vuol dire che il codice che noi non scriviamo, verrà generato automaticamente facendoci risparmiare tempo.
Quindi, alla base di tutto il lavoro c'è l'ereditarietà poichè ogni classe del Framework viene ereditata da Visual Basic .Net (vale lo stesso per C# e C++).
La grande novità è che le classi del Framework sono accessibili da tutti i linguaggi di Visual Studio .Net mettendo a pari dignità Visual Basic con con gli altri linguaggi di sviluppo .Net.
Quindi molte applicazioni o servizi che venivano sviluppate solo in C++ ora possono essere scritte in Visual Basic .Net senza problemi dato che si accede alle stesse classi e il compilato darà lo stesso MsIL (Microsoft Intermediate Language). E' per questo motivo che una classe scritta in C# può essere ereditata da Vb.net e viceversa.
I Namespace
Nel Framework sono raccolte circa 3500 classi per cui come si fa a trovare quella che ci serve? Il Framework è suddiviso in Namespace che a loro volta raggruppano classi simili. Ogni Namespace, può contenere altri Namespace creando una vera e propria gerarchia.
Ad esempio, nel Namespace System (che comprende la maggioranza delle classi del Framework), sono compresi:
· System.Data (dove ci sono le varie classi per la connessione e gestione ai database)
· System.Xml (dove ci sono le varie classi per leggere e scrivere codice Xml)
· System.Windows.Forms (dove ci sono le varie classi relative alla visualizzazione di form sullo schermo)
Per cui, prendendo come riferimento l'ultimo punto, per visualizzare una finestra, scriverò "System.Windows.Forms.Form.Show()".
Non sarà comunque necessario scrivere continuamente System perchè .Net provvederà da solo a creare una versione abbreviata di tutte le classi, per cui, riferendomi a System.Data, scriverò solamente Data.
In ogni caso, possiamo creare noi stessi un abbreviazione usando Import. In pratica usando:
Import System.Windows.Forms
per visualizzare una finestra scriverò solamente: Form1.Show()
Le classi
Qualunque operazione voglia fare in .Net, si potrà effettuare tramite un oggetto. Se voglio connettermi ad un database, oppure aprire un file di testo, non farò altro che creare un oggetto che sappia fare questa operazione. Ritornando all'esempio di prima, per visualizzare una finestra userò
In ogni caso, a noi non interesserà il codice che verrà eseguito dalla classe Show(), l'importante è che si visualizzi sullo schermo una finestra (questo concetto è definito incapsulazione).
L'applicazione in questo modo, non dialogherà mai direttamente con il sistema ma sarà il Framework a farlo per lei.
Per cui, il concetto finale è che se io devo visualizzare una finestra, non importa se l'utente finale utilizzerà un sistema operativo Mac, Linux o Windows, io effettuerò una chiamata ad una classe e se esisterà un Framework per quel sistema operativo, la finestra si aprirà sempre senza cambiare una riga di codice.
E' chiaro quindi che Microsoft ha creato un sistema multipiattaforma. L'unica limitazione è che per ora (al momento della stesura di questo articolo) esistono ufficialmente solo due versioni del Framework: una per Windows ed una (Compat Framework) per Pocket Pc.
Ci sono voci non confermate che esiste una versione del Framework anche per ambiente Linux. Questo vuol dire che se io sviluppo un'applicazione in ambiente Windows e installo il Framework .Net su di un sistema Linux, la mia applicazione funzionerà tranquillamente anche su quest'ultimo.
Un altro vantaggio è che le classi sono indipendenti dal linguaggio utilizzato. Per cui se scrivo un'applicazione in Vb.Net, utilizzerò gli stessi oggetti che utilizza C#. E' per questo motivo che non esiste un linguaggio migliore dell'altro perchè tutti faranno riferimento alle stesse classi del Framework.
Il Linguaggio Intermedio (MsIL)
Ma oltre a tutto questo, esiste un altro punto a favore di .Net: il codice non è più vincolato al microprocessore. Fino a d oggi, i nostri eseguibili (.exe) erano prodotti in istruzioni macchina x86 ossia istruzioni in grado di essere eseguite da microprocessori Intel, Amd e compatibili.
Tuttavia, esistono in commercio in maniera meno diffusa, altri tipi di processore che non potrebbero far girare le applicazioni con istruzioni macchina x86. E' per questo motivo che Microsoft ha deciso di utilizzare MsIL (Microsoft Intermediate Language).
In effetti, la compilazione di un progetto, realizzato in VB.Net oppure C# (C Sharp), non produrrà un eseguibile .EXE come eravamo abituati, ma un codice Assembly (MsIL sempre con estenzione .EXE) identico per tutti e due i linguaggi di programmazione arricchito da metadati che ne descrivono in modo automatico il contenuto.
Questo linguaggio è un Assembler indipendente da qualsiasi microprocessore e di proprietà Microsoft. Dobbiamo pensare al Framework .Net come un vero e proprio microprocessore software che si interfaccia poi con il microprocessore hardware vero e proprio.
Il tutto funziona in questo modo:
Il Common Language Runtime
Il CLR (Common Language Runtime) è la parte che compila al volo l'applicazione .Net in codice nativo del processore e quindi lo esegue.
Esso si occupa del:
· caricamento ed esecuzione del codice (come appena descritto);
· isolamento dell'applicazione: in modo tale che in caso di malfunzionamento di un applicazione non blocchi gli atri processi di sistema;
· gestione della memoria: si occupa di gestire l'allocazione di memoria, avviare ed eliminare processi e variabili, verificare le dipendenze tra i componenti e coordinare le attività del garbage collector. Quest'ultima fase è particolarmente delicata perché consente l'ottimizzazione e la gestione degli spazi di memoria legati ad oggetti istanziati e dichiaratamente, non piu' necessari;
· sicurezza: si possono impostare particolari permessi per limitare le azioni o le operazioni di un programma;
· gestione delle eccezioni: quando un applicazione produce un'eccezione che non è stata prevista dal programmatore (ad esempio non trova il file nella directory specificata), al posto di interrompere bruscamente l'esecuzione, il .Net darà la possibilità all'utente di continuare lo stesso;
· interoperabilità: la possibiltà di utilizzare librerie o richiamare applicazioni precedenti (basate su COM)
Il Common Type System e la Common Language Specification
Uno degli aspetti più evidenti ed importanti di .Net e l'interoperabilità fra linguaggi. Come già descritto, l'intento di Microsoft è che qualsiasi programmatore possa scrivere codice in .Net, con il linguaggio che già conosce. Perchè questo accada, tutti i linguaggi di programmazione devono essere considerati alla stessa stregua e per ottenere ciò, tutto quello che scrivo con un linguaggio deve essere compreso con l'altro.
E' quì che subentra il CTS (Common Type System) che non è altro che uno standard.
Per esempio, una variabile di tipo stringa in VB6 non poteva essere passata direttamente ad un programma C++, ma doveva essere opportunamente convertita perchè i due linguaggi non memorizzano le stringhe nello stesso modo. Ora tutti i linguaggi che rispettano CTS, utilizzano le stringhe, come i numeri e le date, nello stesso modo, quindi possono scambiarsi direttamente i dati. Inoltre Microsoft ha introdotto e reso pubblico CLS (Common Language Specification), per standardizzare l'adattamento dei linguaggi per renderli compatibili con .Net.
In poche parole, qualsiasi linguaggio supporti questi standard, potrà essere interoperabile con i linguaggi .Net.
Per ora esistono solo VB .Net, C#, C++ e J# mentre Cobol e Perl hanno già realizzato implementazioni.
L'ultima cosa ma non per questo la meno importante è che finalmente abbiamo finito di combattere con il REGISTRO DI CONFIGURAZIONE. Si perchè ora per registrare una classe, basta fare un copia ed incolla nella cartella del Framework.
Basta con quel registro che non finisce mai e pieno di informazioni molte volte inutili che non fanno altro che rallentare il sistema.
N.B. Per dubbi e chiarimenti scrivere a federicobarbati@tiscali.it