Presentazione di PowerPoint

Transcript

Presentazione di PowerPoint
29/09/2014
.NET
introduzione
Vittorio Maniezzo – University of Bologna
1
Common Language Infrastructure
.NET è un’implementazione di CLI, Common Language
Infrastructure: uno standard ECMA (http://www.ecmainternational.org/)
• ECMA-334, ECMA-335
Esistono altre implementazioni di CLI:
•
•
•
•
•
SSCLI (Microsoft, per Windows, FreeBSD e Macintosh)
Mono (per Linux)
DotGNU
Intel OCL (Open CLI Library)
…
Vittorio Maniezzo – University of Bologna
2
1
29/09/2014
.NET framework
• .NET framework è un’estensione del sistema operativo. È
l'ambiente per la creazione, la distribuzione e l'esecuzione di tutti
gli applicativi che supportano .NET siano essi servizi Web o altre
applicazioni.
• .NET contiene un ambiente run-time che si appoggia su Windows
(XP, 7, 8, …) di supporto allo sviluppo, gestione e deploy del
codice.
• I programmi e componenti scritti dall’utente vengono eseguiti
all’interno dell’ambiente.
• Fornisce al programmatore funzionalità specifiche, quali garbage
collection automatica, accesso unificato alle API di sistema,
accesso a Internet, connessione a database, ...
• .NET è rilasciato in integrazioni successive, chiamate framework.
Oggi (2014) siamo al 4.5.
3
Vittorio Maniezzo – University of Bologna
.NET framework
Versione
Release
Date
Visual Studio
1.0
13 – 2-2002
1.1
24-4-2003
Visual Studio .NET 2003
2.0
7-11-2005
Visual Studio 2005
3.0
6-11-2006
3.5
19-11-2007
Visual Studio 2008
4.0
12-4-2010
Visual Studio 2010
4.5
15-8-2012
Visual Studio 2012
Vittorio Maniezzo – University of Bologna
Default in
Windows
Visual Studio .NET
Windows Server 2003
Windows Vista,
Windows Server 2008
Windows 7, Windows
Server 2008 R2
Windows 8
4
2
29/09/2014
Caratteristiche principali
• Interoperabilità: per garantire l’interazone fra applicazioni nuove e
preesistenti, è supportato l’accesso a componenti COM; l’ accesso a
generiche funzionalità si ha con il P/Invoke.
• Common Language Runtime (CLR): è una virtual machine del .NET
framework. Tutti i programmi .NET girano sotto la sua supervisione
con garanzie sulla gestione della memoria, delle eccezioni e della
sicurezza.
• Indipendenza dal linguaggio: garantita dal Common Type System
(CTS). Il CTS definisce tutti i tipi dati e le operazioni compatibili col
CLR. Questo garantisce l’interoperabilità fra pezzi di codice scritti in
linguaggi diversi.
• Base Class Library: una libreria di funzioni utilizzabile in qualunque
linguaggio: incapsula funzioni comuni come lettura, scrittura,
rendering grafico, accesso a database, XML, remotizzazione, ecc.
Vittorio Maniezzo – University of Bologna
5
Caratteristiche principali
• Sicurezza: vengono gestite esplicitamente condizioni (es. buffer
overflow) che potrebbero essere sfruttate da SW malevolo. Inoltre, il
.NET fornisce un modello di sicurezza comune a tutte le applicazioni.
• Portabilità:.NET è indipendente dal sistema operativo, quindi crossplatform. Un programma scritto per il framework dovrebbe girare
senza modifiche su qualunque SO. Microsoft non ha mai
implementato il framework su sistemi diversi da Windows, ma
sviluppatori indipendenti l’hanno fatto ed esistono applicazioni crossplatform.
• Deployment semplificato:.NET include tool che aiutano l’installazione
del sw e controllano che non ci siano interferenze con SW
preesistente.
Vittorio Maniezzo – University of Bologna
6
3
29/09/2014
Sviluppo semplificato
Ambiente object-oriented
• Qualsiasi entità è un oggetto
• Classi ed ereditarietà pienamente supportati
• Anche tra linguaggi diversi
Riduzione errori comuni di programmazione
• Linguaggi fortemente tipizzati
• Errori gestiti
• Meno perdite di memoria: Garbage Collector
Vittorio Maniezzo – University of Bologna
7
Caratteristiche .NET
Indipendenza dal linguaggio
• Il .NET Framework introduce un Common Type System (CTS)
• Le specifiche del CTS definiscono tutti i possibili tipi di dato e
costrutti di programmazione supportati dall’ambiente runtime
(chiamato Common Language Runtime, CLR): questo permette di
scambiarsi istanze di tipi tra programmi scritti nei vari linguaggi
.NET
Base Class Library (BCL)
• È una libreria disponibile a tutti i linguaggi .NET
• Contiene classi che incapsulano un numero di funzioni comuni,
come per esempio lettura e scrittura di file, interazione con le
stringhe, i numeri, …
Vittorio Maniezzo – University of Bologna
8
4
29/09/2014
Indipendenza dal linguaggio
class Program
{
static void Main (string[] args)
{
System.Console.WriteLine( "Hello World" );
}
}
Class Program
Shared Sub Main (ByVal args As String())
System.Console.WriteLine( "Hello World" );
End Sub
End Class
C#
VB
Vittorio Maniezzo – University of Bologna
9
Indipendenza dal linguaggio
class Hello
{
static void Main (string[] args)
{
System.Console.WriteLine(Greeting.Message());
}
C# richiama Vb.NET
}
Class Greeting
Shared Function Message() As String
Return "Hello World“;
End Function
End Class
Vittorio Maniezzo – University of Bologna
10
5
29/09/2014
Architettura, linguaggi e tool
VB
C++
C#
JScript
…
Common Language Specification
Windows Forms
ADO.NET and XML
Base Class Library
Common Language Runtime
Windows
Visual Studio.NET
WS
ASP.NET
COM+ Services
11
Vittorio Maniezzo – University of Bologna
Architettura .NET (base)
Web
Services
User
Interface
Base Classes
Common Language Runtime
Vittorio Maniezzo – University of Bologna
Base Frame
Data & XML
12
6
29/09/2014
Namespace .NET (2.0, alcuni)
System.WinForms
System.Web
Web Services
Controls
Web Forms
Drawing
Windows Application Services
ASP.NET Application Services
System Base Framework
ADO.NET
XML
SQL
Threading
IO
Net
Security
ServiceProcess
Common Language Runtime
Type System
Metadata
Execution
13
Vittorio Maniezzo – University of Bologna
Namespace .NET (un po’ di più)
System.Web
System.Windows.Forms
UI
HtmlControls
Compilation
Design
ComponentModel
WebControls
Handlers
System.Drawing
Hosting
Caching
Security
Drawing2D
Printing
Configuration
SessionState
Imaging
Text
System.Data
System.Xml
OleDb
Common
Xsl
Schema
SqlClient
SQLTypes
XPath
Serialization
System
Collections
IO
Security
Configuration
Reflection
Text
Diagnostics
Resources
Threading
Globalization
Vittorio Maniezzo – University of Bologna
Runtime
InteropServices
Remoting
Serialization
14
7
29/09/2014
Ambiente di esecuzione
Elementi fondamentali:
• MSIL: Microsoft Intermediate Language
• CLR: Common Language Runtime
• CTS: Common Type System
• CLS: Common Language Specification
• BCL: Base Class Library
15
Vittorio Maniezzo – University of Bologna
Codice interpretato
Sorgenti
Vittorio Maniezzo – University of Bologna
Interprete
Output
16
8
29/09/2014
Codice compilato
Sorgenti
Compilatore
Codice
nativo
(.EXE)
Output
17
Vittorio Maniezzo – University of Bologna
Codice MSIL
Sorgenti
Compilatore
.NET
Codice
MSIL
(Assembly)
.EXE/.DLL
Compilatore
JIT
Vittorio Maniezzo – University of Bologna
Codice
nativo
Output
18
9
29/09/2014
Codice MSIL
Sorgenti
Compilatore
.NET
Codice
MSIL
(Assembly)
.EXE/.DLL
.NET runtime
Compilatore
JIT
Codice
nativo
Output
Vittorio Maniezzo – University of Bologna
19
CTS: Common Type System
Sistema di tipi comune alla base di tutti i linguaggi .NET
Progettato per linguaggi object-oriented, procedurali e
funzionali
• Esaminate caratteristiche di 20 linguaggi
• Tutte le funzionalità disponibili con MSIL
• Ogni linguaggio utilizza alcune caratteristiche
Common Language Specification (CLS)
• Sottoinsieme di CTS
• Regole di compatibilità tra linguaggi
Vittorio Maniezzo – University of Bologna
20
10
29/09/2014
Common Type System
Qualsiasi applicazione .NET è realizzata definendo un
insieme di tipi, utilizzandoli insieme a quelli predefiniti
da MS (Base Class Library)
Due categorie di tipi:
• Tipi reference (riferimento)

Allocati su heap gestito
• Tipi value (valore)

Allocati su stack o in oggetti gestiti (reference)
Tutti i tipi value possono essere utilizzati come tipi
reference (Boxing).
Vittorio Maniezzo – University of Bologna
21
Estendibilità delle classi
Il Framework non è una scatola nera, qualsiasi classe
.NET può essere estesa mediante ereditarietà
• si usa e si estende la classe stessa, non uno strato
intermedio (wrapper)
L’ereditarietà è cross-language
Vittorio Maniezzo – University of Bologna
22
11
29/09/2014
Managed code e CLR
Il codice sviluppato all’interno del framework viene
eseguito come managed code (codice gestito)
Managed code gira in un ambiente chiamato Common
Language Runtime (CLR)
Managed code
Codice Utente
CLR
Richieste di
funzionalità standard
Richieste di
funzionalità CLR (es.
garbage collection)
Windows OS
Vittorio Maniezzo – University of Bologna
23
Il CLR di .NET
Il CLR è un ambiente runtime che supporta qualunque
linguaggio .NET.
Il CLR può girare su qualunque OS che implementi la
Common Language Infrastructure, che è definita in modo
indipendente dalla macchina.
Vittorio Maniezzo – University of Bologna
24
12
29/09/2014
Common Language Runtime
Caratteristiche
• Tipi di dati comuni

Mapping dei tipi di dati fra linguaggi diversi
• Compilatori just-in-time (JIT)


•
•
•
•
•
JIT compila un linguaggio intermedio (MSIL) in codice nativo
Può essere ottimizzato per ogni piattaforma
Garbage collector
Permessi e politiche di sicurezza
Eccezioni
Threading
Diagnostica e profiling
25
Vittorio Maniezzo – University of Bologna
CLR: struttura
Base Class Library Support
Thread Support
COM Marshaler
Type Checker
Exception Manager
Security Engine
Debug Engine
MSIL to Native
Compilers (JIT)
Code
Manager
Garbage
Collector (GC)
Class Loader
Vittorio Maniezzo – University of Bologna
26
13
29/09/2014
Funzioni del CLR
Gestione dell’esecuzione del codice:
Il CLR gestisce le referenze agli oggetti, rilasciandoli quando
non sono più utilizzati. Gli oggetti gestiti in questo modo
sono detti “oggetti gestiti” (managed objects).
La gestione automatica della memoria elimina le perdite di
memoria, oltre ad alcuni comuni errori di programmazione.
Vittorio Maniezzo – University of Bologna
27
CLR e metadati
I metadati, forniscono le informazioni che descrivono la dichiarazione
dei tipi, dei membri delle classi e le referenze nel codice.
I metadati sono memorizzati col codice; qualunque file common
language runtime caricabile contiene metadati (v. ILSDAM).
Il runtime usa i metadati per localizzare e caricare le classi, posizionare
le istanze in memoria, risolvere le chiamate ai metodi, generare
codice nativo, garantire la sicurezza e definire limiti ai contesti runtime.
Vittorio Maniezzo – University of Bologna
28
14
29/09/2014
Class Loader
E’ un componente .NET, che cerca e carica classi .NET
utilizzando metadati.
Il Class Loader può caricare classi locali, remote o su
internet.
Carica le classi remote tramite un processo detto di
“marshaling” delle informazioni di chiamata.
29
Vittorio Maniezzo – University of Bologna
JIT
Il CLR è in grado di lavorare solo con codice in Microsoft
Intermediate Language (MSIL o IL, il bytecode della MS)
Ogni linguaggio .NET compatibile deve compilarsi in
MSIL
Un compilatore Just In Time (JIT) traduce il MSIL in
istruzioni macchina
Tre possibilità di compilazione per deploy
Codice
sorgente
Vittorio Maniezzo – University of Bologna
VisualStudio
MSIL
JIT
Codice
eseguibile
30
15
29/09/2014
Doppia compilazione
Avviene una doppia compilazione
• La prima a design time con csc.exe: viene creato un semilavorato
in IL
• La seconda quando il programma viene eseguito: il codice IL è
compilato durante l’esecuzione dal JIT Compiler (Just –in –time)
Vantaggi
• Il JIT produce codice ottimizzato per quella particolare
esecuzione
• Potenzialmente multipiattaforma
Svantaggi
• Maggior lentezza iniziale
• Possibilità di fare reverse engineering
Vittorio Maniezzo – University of Bologna
31
Doppia compilazione
Vittorio Maniezzo – University of Bologna
32
16
29/09/2014
Esecuzione codice
Generazione file .NET PE(Portable Executable)
(Un file .NET PE è chiamato Assembly, memorizzato come .DLL o .EXE)
Class Loader
JIT Compiler
Verifica
JIT
Executer and Manager(GC, IL Management, Security
Management,Exception Management)
33
Vittorio Maniezzo – University of Bologna
Esecuzione codice
Compilazione
Codice
sorgente
Compilazione
Intermediate Language
MSIL
Metadata
Esecuzione
JIT Compiler
Codice nativo
(Chiamato solo una volta)
Vittorio Maniezzo – University of Bologna
34
17
29/09/2014
Esecuzione
PE/COFF Header
JMPHeader
_CorExeMain
CLR
OS Loader
MsCorEE.dll
Metadata
IL Code
JIT Compiler
& Verification
Class Loader
Policy Manager
Assembly Loader
Garbage Collection
Native code
GC Info
EH Info
Exception Manager
Code
Manager
Thread Support
Security Permission
Enforcement
Debug Engine
35
Vittorio Maniezzo – University of Bologna
35
Esempio
namespace HelloWorld
{ class Program
{ static void Main (string[] args)
{
System.Console.WriteLine( "Hello World" );
}
}
}
• Il compilatore per C# si trova (ad es) in
c:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe
• Esempio direttiva di compilazione csc Program.cs (csc è il
compilatore di C#)
• Il risultato della compilazione è un file program.exe
• Program.exe è un file non in linguaggio macchina ma in MSIL
Vittorio Maniezzo – University of Bologna
36
18
29/09/2014
Esempio : Somma
public class X
{ public static int Sum(int n)
{ int s = 0; // running sum
for (int i = 1; i <= n; i++)
{ s += i; // add in current
}
return s;
}
C#
}
Prolog
Epilog
push
mov
sub
push
xor
xor
xor
mov
jmp
add
inc
cmp
jle
mov
pop
mov
pop
ret
ebp
ebp,esp
esp,0Ch
esi
edx,edx
esi,esi
edx,edx
esi,1
00000005
edx,esi
esi
esi,ecx
FFFFFFFB
eax,edx
esi
esp,ebp
ebp
x86
csc /debug Sum.cs
.method public static int32 Sum(int32 n) {
.locals (int32 s, int32 i, int32 t)
ldc.i4.0
// < 0
>
stloc.0
// <
>
// s = 0
ldc.i4.1
// < 1
>
stloc.1
// <
>
// i = 1
br.s
chek // <
>
// => chek:
loop: ldloc.0
// < s
>
ldloc.1
// < i
>
add
// < s+i >
stloc.0
// <
>
// s = s + i
ldloc.1
// < i
>
ldc.i4.1
// < i 1 >
add
// < i+1 >
stloc.1
// <
>
// i = i + 1
chek: ldloc.1
// < i
>
ldarg.0
// < n
>
ble.s
loop // <
>
// i< n => loop:
ldloc.0
// < s
>
stloc.2
// <
>
// t = s
br.s
done // <
>
// goto done:
done: ldloc.2
// < t
>
ret
IL
}
JIT Compiler
Vittorio Maniezzo – University of Bologna
37
Esecuzione di codice gestito
• Il codice, quando mandato in esecuzione, gira in
cooperazione con (è gestito da) il runtime environment.
• Il codice gestito deve fornire i metadati necessari al
runtime per fornire i servizi di gestione memoria,
integrazione multilinguaggio e sicurezza accesso al codice.
• Qualunque codice basato sul Microsoft Intermediate
Language (MSIL) viene eseguito come codice gestito.
Vittorio Maniezzo – University of Bologna
38
19
29/09/2014
Assembly
Tutto il codice che gira nel CLR risiede in un qualche
assembly.
Un assembly è una collezione di uno o più file exe o
dll che contengono codice e risorse di una
applicazione.
Un assembly contiene anche un manifest, metadata
(in chiaro) di descrizione dei contenuti dell’assembly.
Molte funzionalità di base, es. gestione sicurezza,
namespace, versioning, sono basate su assembly di
sistema.
Vittorio Maniezzo – University of Bologna
39
Assembly
Un assembly corrisponde a un componente, che può
essere privato dell’applicazione o reso pubblico.
Assembly private risiedono nel sottodirettorio BIN
del progetto
Assembly condivise NON usano il registro di
windows  ma risiedono nella Global Assembly
Cache (GAC), in \windows\assembly
Vittorio Maniezzo – University of Bologna
40
20
29/09/2014
Assembly
Assembly
• Unità minima per la distribuzione, il versioning e la
security
• Simile alle DLL, ma aggiunge meta-dati sul contenuto
attraverso il “Manifest”
• Può essere composto da uno o più file
• Il manifest può risiedere in un file EXE/DLL separato,
oppure in un EXE/DLL che contiene codice
dell’assembly
Vittorio Maniezzo – University of Bologna
41
Dove sono gli assembly
Assembly privati
• Directory applicazione (e sub-directory)
Assembly condivisi
• Global Assembly Cache (GAC)
• c:\windows\assembly
Assembly scaricati da URL
• Download cache
• c:\windows\assembly\download
GACUTIL.EXE
• Tool per esaminare GAC e download cache
Vittorio Maniezzo – University of Bologna
42
21
29/09/2014
Assembly
Modulo
(file PE)
Codice IL
Metadati
Manifest
Assembly a modulo singolo
Vittorio Maniezzo – University of Bologna
43
Metadati
I metadati descrivono ogni elemento gestito dal runtime:
un assembly, un file caricabile, tipi, metodi, ecc.
In particolare contengono le informazioni necessarie al
debugging e alla garbage collection, gli attributi di
sicurezza, il marshaling dei dati, le classi estese, il version
binding.
Vittorio Maniezzo – University of Bologna
44
22
29/09/2014
Metadati
Descrizione di un assembly
•
•
•
•
Identità: nome, versione, cultura [, public key]
Tipi esportati
Assembly da cui dipende
Permessi necessari per l’esecuzione
Descrizione dei tipi
• Nome, visibilità, classe base, interfacce implementate
Attributi custom
• Definiti dall’utente
• Definiti dal compilatore
• Definiti dal Framework
45
Vittorio Maniezzo – University of Bologna
Tool che usano i metadati
Compilatori
• Compilazione condizionale
Ambienti per sviluppo rapido di applicazioni
• Informazioni sulle proprietà dei componenti


Categoria
Descrizione
• Editor personalizzati di tipi di proprietà
Analisi dei tipi
• Intellisense
• ILDASM
Vittorio Maniezzo – University of Bologna
46
23
29/09/2014
Altri servizi del CLR
Garbage collector
• Gestione del ciclo di vita degli oggetti
• Distruzione deterministica
Reflection
• Analisi dei metadati di un assembly
• Generazione di un assembly dinamico
Remoting
• Chiamata di componenti remoti (.NET)
Interoperabilità (COM, Platform Invoke)
AppDomains
Vittorio Maniezzo – University of Bologna
47
Garbage Collector
Gli oggetti vengono distrutti automaticamente
quando non sono più referenziati
Non ci si basa sul Reference Counting
• Maggiore velocità di allocazione
• Consentiti i riferimenti circolari
• Perdita della distruzione deterministica
Algoritmo Mark-and-Compact
Vittorio Maniezzo – University of Bologna
48
24
29/09/2014
Garbage Collector - fase 1: Mark
NextObjPtr
Root set
Oggetti “vivi”
Oggetti non raggiungibili
Spazio libero
49
Vittorio Maniezzo – University of Bologna
Garbage Collector - fase 2:
Compact
Spazio recuperato
NextObjPtr
Oggetti “vivi”
Root set
Vittorio Maniezzo – University of Bologna
Spazio libero
50
25
29/09/2014
Spazio per il C++ (e ANSI C)
• Il GC riloca gli oggetti in memoria: non è più possibile gestirli
esplicitamente tramite puntatore.
• La gestione della memoria è delegata al framework: più comodo, più
sicuro ma più lento (ca. da 1.2 a 1.5 volte più lento).
• Inefficienze computazionali non sono tanto dovute alla doppia
compilazione quanto alla difficoltà di una gestione diretta della
memoria.
• Per le applicazioni computazionalmente più impegnative
(ottimizzazione, grafica, ecc.) ANSI C (o C++ nativo) possono essere più
efficienti.
Vittorio Maniezzo – University of Bologna
51
26