NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione...

55
1 Vittorio Maniezzo – Università di Bologna .NET Introduzione 2 Vittorio Maniezzo – Università di Bologna Common Language Infrastructure .NET è un’implementazione di CLI, Common Language Infrastructure: uno standard ECMA (http://www.ecma- international.org/) ECMA-334, ECMA-335 Esistono già altre implementazioni di CLI: SSCLI (Microsoft, per Windows, FreeBSD e Macintosh) Mono (per Linux) DotGNU Intel OCL (Open CLI Library)

Transcript of NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione...

Page 1: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

1

Vittorio Maniezzo – Università di Bologna

.NET Introduzione

2Vittorio Maniezzo – Università di Bologna

Common Language Infrastructure

• .NET è un’implementazione di CLI, Common Language Infrastructure: uno standard ECMA (http://www.ecma-

international.org/)

— ECMA-334, ECMA-335

• Esistono già altre implementazioni di CLI:

— SSCLI (Microsoft, per Windows, FreeBSD e Macintosh)

—Mono (per Linux)

—DotGNU

— Intel OCL (Open CLI Library)

—…

Page 2: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

2

3Vittorio Maniezzo – Università di Bologna

.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, vista, 7, …) 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à utili, quali garbage collection automatica, accesso unificato alle API di sistema, accesso a Internet, connessione a database.

• .NET è rilasciato in integrazioni successive, chiamate framework. Oggi (2010) siamo al 4.

4Vittorio Maniezzo – Università di Bologna

.NET frameworkVersione

VersionNumber

ReleaseDate

Visual StudioDefault in Windows

1.0 1.0.3705.0 13 – 2-2002 Visual Studio .NET

1.1 1.1.4322.573 24-4-2003Visual Studio .NET

2003

Windows Server

2003

2.0 2.0.50727.42 7-11-2005 Visual Studio 2005

3.0 3.0.4506.30 6-11-2006

Windows Vista,

Windows Server

2008

3.5 3.5.21022.8 19-11-2007 Visual Studio 2008

Windows 7,

Windows Server

2008 R2

4.0 4.0.30319.1 12-4-2010 Visual Studio 2010

Page 3: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

3

5Vittorio Maniezzo – Università di Bologna

Prima dei componenti

Prima dell’avvento dello sviluppo per componenti, le applicazioni erano entità completamente separate, senza integrazione

Applicazione

Codice e strutture dati

6Vittorio Maniezzo – Università di Bologna

Architetture a componenti

I componenti forniscono un meccanismo per integrare parti dell’applicazione.Ogni componente deve però fornire dei “contatti” e gli oggetti non possono interagire direttamente

Page 4: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

4

7Vittorio Maniezzo – Università di Bologna

J2EE e .NET

Con J2EE o .NET, i componenti sono costruiti su uno strato comune. Gli oggetti interagiscono direttamente.

Caratteristiche principali

8Vittorio Maniezzo – Università di Bologna

• Interoperabilità: per garantire l’interazone fra applicazioni nuove e

preesistenti. L’accesso a componenti COM è supportato in

System.Runtime.InteropServices e System.EnterpriseServices; 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 ecc.

Page 5: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

5

Caratteristiche principali

9Vittorio Maniezzo – Università di Bologna

• Deployment semplificato:.NET include tools che aiutano

l’installazione del sw e controllano che non ci siano interferenze con

SW preesistente.

• Sicurezza: vengono gestite esplicitamente condizioni (es. buffer

overflow) che potevano 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 cross-

platform. 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 cross-

platform.

10Vittorio Maniezzo – Università di Bologna

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

Page 6: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

6

11Vittorio Maniezzo – Università di Bologna

Caratteristiche .NETIndipendenza 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, …

12Vittorio Maniezzo – Università di Bologna

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

Page 7: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

7

13Vittorio Maniezzo – Università di Bologna

Indipendenza dal linguaggio

class Hello

{

static void Main (string[] args)

{

System.Console.WriteLine(Greeting.Message());

}

}

Class Greeting

Shared Function Message() As String

Return "Hello World“;

End Function

End Class

C# richiama Vb.NET

14Vittorio Maniezzo – Università di Bologna

Linguaggi e tool

Windows COM+ Services

Common Language Runtime

Base Class Library

ADO.NET and XML

ASP.NET WS Windows Forms

Common Language Specification

VB C++ C# JScript …

Visual S

tudio.NE

T

Page 8: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

8

15Vittorio Maniezzo – Università di Bologna

Architettura .NET (base)

Base Classes

Data & XML

UserInterface

Common Language Runtime

WebServices

Bas

e F

ram

e

16Vittorio Maniezzo – Università di Bologna

Architettura .NET (2.0)

Common Language RuntimeMetadataType System Execution

System Base Framework

IO Net Security ServiceProcess

ADO.NET XML SQL Threading

System.Web

Web Services Web Forms

ASP.NET Application Services

System.WinForms

Controls Drawing

Windows Application Services

Page 9: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

9

17Vittorio Maniezzo – Università di Bologna

System

System.Data System.Xml

System.Web

Globalization

Diagnostics

Configuration

Collections

Resources

Reflection

IO

Threading

Text

Security

SqlClient

OleDb

SQLTypes

Common

RuntimeInteropServices

Remoting

Serialization

Configuration SessionState

Caching Security

UIHtmlControls

WebControls

System.Drawing

Imaging

Drawing2D

Text

Printing

System.Windows.Forms

Design ComponentModel

.NET Framework: i namespace

XPath

Xsl

Serialization

Schema

Hosting

Handlers

Compilation

18Vittorio Maniezzo – Università di Bologna

Base Framework: i namespace

System

Threading

Text

Security

Resources

Reflection

IO

Globalization

Diagnostics

Configuration

Collections

Runtime

Serialization

Remoting

InteropServices

Page 10: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

10

19Vittorio Maniezzo – Università di Bologna

Data e XML: i namespace

System.Data

System.Xml

SqlTypes

OleDb

SqlClient

Common

Serialization

Schema

XPath

Xsl

20Vittorio Maniezzo – Università di Bologna

Web Forms e Services: i namespace

System.Web

Caching

Configuration

UI

SessionState

HtmlControls

WebControls

Security

Handlers

Hosting

Compilation

Page 11: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

11

21Vittorio Maniezzo – Università di Bologna

Windows Forms: i namespace

System.Drawing

Drawing2D

Imaging

Printing

Text

System.Windows.Forms

Design ComponentModel

22Vittorio Maniezzo – Università di Bologna

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

Page 12: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

12

23Vittorio Maniezzo – Università di Bologna

Piattaforma multi-linguaggio

• Libertà di scelta del linguaggio

— Tutte le funzionalità di .NET Framework sono disponibili a tutti i linguaggi .NET

— I componenti di un’applicazione possono essere scritti con diversi linguaggi

• Impatto sui tool

— Tool disponibili per tutti i linguaggi:Debugger, Profiler, Analisi, ecc.

24Vittorio Maniezzo – Università di Bologna

Linguaggi

• La piattaforma .NET è neutrale rispetto al linguaggio(nessuno è favorito)

— Tutti i linguaggi .NET hanno le stesse possibilità

— Si possono sfruttare skill già esistenti

• Common Language Specification: due possibilità di utilizzo:

— Consumer: usa il .NET Framework

— Extender: estende il .NET Framework

Page 13: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

13

25Vittorio Maniezzo – Università di Bologna

Codice interpretato

Interprete OutputSorgenti

26Vittorio Maniezzo – Università di Bologna

Codice compilato

Codicenativo(.EXE)

Output

CompilatoreSorgenti

Page 14: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

14

27Vittorio Maniezzo – Università di Bologna

Codice MSIL

Codicenativo

OutputCompilatoreJIT

Compilatore.NET

Sorgenti

CodiceMSIL

(Assembly).EXE/.DLL

28Vittorio Maniezzo – Università di Bologna

Codice MSIL

Codicenativo

OutputCompilatoreJIT

Compilatore.NET

Sorgenti

CodiceMSIL

(Assembly).EXE/.DLL

.NET runtime

Page 15: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

15

29Vittorio Maniezzo – Università di Bologna

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

30Vittorio Maniezzo – Università di Bologna

CTS: Common Type System

• Alla base di tutto ci sono i tipi (le classi)

• Fortemente tipizzato (compile-time)

• Object-oriented

— Campi, metodi, tipi nidificati, proprietà, ...

• Overload di funzioni (compile-time)

• Dispatch metodi virtuali risolto a runtime

• Ereditarietà singola di implementazione

• Ereditarietà multipla di interfacce

Page 16: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

16

31Vittorio Maniezzo – Università di Bologna

Common Type System

• Qualsiasi applicazione .NET è realizzata definendo un insieme di tipi + utilizzo (istanziazione) di questi ultimi 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).

32Vittorio Maniezzo – Università di Bologna

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

Page 17: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

17

33Vittorio Maniezzo – Università di Bologna

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)

CLR

Windows OS

Richieste di funzionalità standard

Richieste di funzionalità CLR (es. garbage collection)

Managed code Codice Utente

34Vittorio Maniezzo – Università di Bologna

Common Language RuntimeCaratteristiche

— 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

Page 18: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

18

35Vittorio Maniezzo – Università di Bologna

CLR: struttura

Class Loader

MSIL to NativeCompilers (JIT)

CodeManager

GarbageCollector (GC)

Security Engine Debug Engine

Type Checker Exception Manager

Thread Support COM Marshaler

Base Class Library Support

36Vittorio Maniezzo – Università di Bologna

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.

Page 19: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

19

37Vittorio Maniezzo – Università di Bologna

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.

38Vittorio Maniezzo – Università di Bologna

Servizi per lo sviluppo:

• 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 immagine

common language runtime caricabile contiene metadati.

• 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 run-time.

Funzioni del CLR

Page 20: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

20

39Vittorio Maniezzo – Università di Bologna

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.

40Vittorio Maniezzo – Università di 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

VisualStudioMSIL JIT Codice

eseguibile

Page 21: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

21

41Vittorio Maniezzo – Università di Bologna

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

42Vittorio Maniezzo – Università di Bologna

Doppia compilazione

Page 22: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

22

43Vittorio Maniezzo – Università di Bologna

Esecuzione codiceGenerazione file .NET PE(Portable Executable)

(Un file .NET PE è chiamato Assembly, memorizzato come .DLL o .EXE)

Class Loader

Verifica

JIT Compiler

JIT

Executer and Manager(GC, IL Management, Security Management,Exception Management)

44Vittorio Maniezzo – Università di Bologna

(Chiamato solo una volta)

Esecuzione

JIT Compiler Codice nativo

MSILCodice

sorgente Compilazione

Compilazione

Intermediate Language

Metadata

Esecuzione codice

Page 23: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

23

45Vittorio Maniezzo – Università di Bologna

45

Esecuzione

OS Loader

JIT Compiler& Verification Class Loader Policy Manager Assembly Loader

MsCorEE.dll

Garbage Collection

Exception Manager

Thread Support

Security PermissionEnforcement

Debug Engine

CodeManager

Native code

GC Info

EH Info

PE/COFF Header

CLR Header

Metadata

IL Code

JMP _CorExeMain

46Vittorio Maniezzo – Università di Bologna

NGEN

Per velocizzare il codice eseguibile.

•Si può compilare il codice IL in codice macchina

•Si utilizza ngen.exe

•Permette uno startup più rapido perché il codice è già

compilato

•Non è possibile fare alcuna ottimizzazione

•Il codice IL originale deve essere disponibile per informazioni

aggiuntive

•Per eseguire ngen.exe bisogna avere diritti amministrativi sulla

macchina

C:\Windows\Microsoft.NET\Framework\v2.0.50727\ngen.exe

Page 24: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

24

47Vittorio Maniezzo – Università di Bologna

Esempio

namespace HelloWorld

{ class Program

{ static void Main (string[] args)

{ System.Console.WriteLine( "Hello World" );

}

}

}

•Il compilatore per C# si trova in

C:\Windows\Microsoft.NET\Framework\v3.5\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

48Vittorio Maniezzo – Università di Bologna

.method public static int32 Sum(int32 n) {.locals (int32 s, int32 i, int32 t)ldc.i4.0 // < 0 >stloc.0 // < > // s = 0ldc.i4.1 // < 1 >stloc.1 // < > // i = 1br.s chek // < > // => chek:

loop: ldloc.0 // < s >ldloc.1 // < i >add // < s+i >stloc.0 // < > // s = s + ildloc.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 = sbr.s done // < > // goto done:

done: ldloc.2 // < t >ret

}

public class X { public static int Sum(int n){ int s = 0; // running sumfor (int i = 1; i <= n; i++) { s += i; // add in current}return s;

}}

push ebpmov ebp,espsub esp,0Chpush esixor edx,edxxor esi,esixor edx,edxmov esi,1jmp 00000005add edx,esiinc esicmp esi,ecxjle FFFFFFFBmov eax,edxpop esimov esp,ebppop ebpret

C#

x86

IL

Esempio : Sommacsc /debug Sum.cs

JIT Compiler

Prolog

Epilog

Page 25: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

25

49Vittorio Maniezzo – Università di Bologna

public class X{ public static int Sum(int n)

{ int s = 0;for (int i = 1; i <= n; i++) s += i; return s;

}}

[0] 0000 0006 // s

[1] 0000 0004 // i

Var. locali

[0] 0000 0007 // n

Argomenti

0000 0004

Evaluation Stack

0000 0006

[2] 0000 0000 // t

Stack, stato corrente

16 0A 17 0B 2B.08 06 07 58 0A 07 17 58 0B 07 02 31.F4 06 0C 2A

.method static int32 Sum(int32 n) { .locals init ( [0] int32 s, [1] int32 i, [2] in t32 t)

ldc.i4.0; stloc.0; ldc.i4.1; stloc.1; br.s chek

loop: ldloc.0; ldloc.1; add; stloc.0ldloc.1; ldc.i4.1; add; stloc.1

chek : ldloc.1; ldarg.0; ble.s loopldloc.0; stloc.2; ldloc.2; ret }

C#

IL

Esempio : Somma

50Vittorio Maniezzo – Università di Bologna

.method static int32 Sum(int32 n) {.locals init ( [0] int32 s, [1] int32 i, [2] int32 t)

ldc.i4.0 stloc.0 ldc.i4.1 stloc.1 br.s check

loop: ldloc.0 ldloc.1 add stloc.0ldloc.1 ldc.i4.1 add stloc.1

check: ldloc.1ldarg.0ble.s loopldloc.0stloc.2ldloc.2ret

}

[0] 0000 0000 // s

[1] 0000 0000 // i

Locals

[0] 0000 0007 // n

Arguments

Evaluation Stack

[2] 0000 0000 // t

Esempio : Somma

Page 26: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

26

51Vittorio Maniezzo – Università di Bologna

.method static int32 Sum(int32 n) {.locals init ( [0] int32 s, [1] int32 i, [2] int32 t)

ldc.i4.0stloc.0 ldc.i4.1 stloc.1 br.s check

loop: ldloc.0 ldloc.1 add stloc.0ldloc.1 ldc.i4.1 add stloc.1

check: ldloc.1ldarg.0ble.s loopldloc.0stloc.2ldloc.2ret

}

[0] 0000 0000 // s

[1] 0000 0000 // i

Locals

[0] 0000 0007 // n

Arguments

Evaluation Stack

[2] 0000 0000 // t

0000 0000

Esempio : Somma

52Vittorio Maniezzo – Università di Bologna

.method static int32 Sum(int32 n) {.locals init ( [0] int32 s, [1] int32 i, [2] int32 t)

ldc.i4.0 stloc.0ldc.i4.1 stloc.1 br.s check

loop: ldloc.0 ldloc.1 add stloc.0ldloc.1 ldc.i4.1 add stloc.1

check: ldloc.1ldarg.0ble.s loopldloc.0stloc.2ldloc.2ret

}

[0] 0000 0000 // s

[1] 0000 0000 // i

Locals

[0] 0000 0007 // n

Arguments

Evaluation Stack

[2] 0000 0000 // t

Esempio : Somma

Page 27: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

27

53Vittorio Maniezzo – Università di Bologna

.method static int32 Sum(int32 n) {.locals init ( [0] int32 s, [1] int32 i, [2] int32 t)

ldc.i4.0 stloc.0 ldc.i4.1stloc.1 br.s check

loop: ldloc.0 ldloc.1 add stloc.0ldloc.1 ldc.i4.1 add stloc.1

check: ldloc.1ldarg.0ble.s loopldloc.0stloc.2ldloc.2ret

}

[0] 0000 0000 // s

[1] 0000 0000 // i

Locals

[0] 0000 0007 // n

Arguments

Evaluation Stack

[2] 0000 0000 // t

0000 0001

Esempio : Somma

54Vittorio Maniezzo – Università di Bologna

.method static int32 Sum(int32 n) {.locals init ( [0] int32 s, [1] int32 i, [2] int32 t)

ldc.i4.0 stloc.0 ldc.i4.1 stloc.1br.s check

loop: ldloc.0 ldloc.1 add stloc.0ldloc.1 ldc.i4.1 add stloc.1

check: ldloc.1ldarg.0ble.s loopldloc.0stloc.2ldloc.2ret

}

[0] 0000 0000 // s

[1] 0000 0001 // i

Locals

[0] 0000 0007 // n

Arguments

Evaluation Stack

[2] 0000 0000 // t

Esempio : Somma

Page 28: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

28

55Vittorio Maniezzo – Università di Bologna

.method static int32 Sum(int32 n) {.locals init ( [0] int32 s, [1] int32 i, [2] int32 t)

ldc.i4.0 stloc.0 ldc.i4.1 stloc.1 br.s check

loop: ldloc.0 ldloc.1 add stloc.0ldloc.1 ldc.i4.1 add stloc.1

check: ldloc.1ldarg.0ble.s loopldloc.0stloc.2ldloc.2ret

}

[0] 0000 0000 // s

[1] 0000 0001 // i

Locals

[0] 0000 0007 // n

Arguments

Evaluation Stack

[2] 0000 0000 // t

Esempio : Somma

56Vittorio Maniezzo – Università di Bologna

.method static int32 Sum(int32 n) {.locals init ( [0] int32 s, [1] int32 i, [2] int32 t)

ldc.i4.0 stloc.0 ldc.i4.1 stloc.1 br.s check

loop: ldloc.0 ldloc.1 add stloc.0ldloc.1 ldc.i4.1 add stloc.1

check: ldloc.1ldarg.0ble.s loopldloc.0stloc.2ldloc.2ret

}

[0] 0000 0000 // s

[1] 0000 0001 // i

Locals

[0] 0000 0007 // n

Arguments

Evaluation Stack

[2] 0000 0000 // t

0000 0001

Esempio : Somma

Page 29: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

29

57Vittorio Maniezzo – Università di Bologna

.method static int32 Sum(int32 n) {.locals init ( [0] int32 s, [1] int32 i, [2] int32 t)

ldc.i4.0 stloc.0 ldc.i4.1 stloc.1 br.s check

loop: ldloc.0 ldloc.1 add stloc.0ldloc.1 ldc.i4.1 add stloc.1

check: ldloc.1ldarg.0ble.s loopldloc.0stloc.2ldloc.2ret

}

[0] 0000 0000 // s

[1] 0000 0001 // i

Locals

[0] 0000 0007 // n

Arguments

Evaluation Stack

[2] 0000 0000 // t

0000 0001

0000 0007

Esempio : Somma

58Vittorio Maniezzo – Università di Bologna

.method static int32 Sum(int32 n) {.locals init ( [0] int32 s, [1] int32 i, [2] int32 t)

ldc.i4.0 stloc.0 ldc.i4.1 stloc.1 br.s check

loop: ldloc.0 ldloc.1 add stloc.0ldloc.1 ldc.i4.1 add stloc.1

check: ldloc.1ldarg.0ble.s loopldloc.0stloc.2ldloc.2ret

}

[0] 0000 0000 // s

[1] 0000 0001 // i

Locals

[0] 0000 0007 // n

Arguments

Evaluation Stack

[2] 0000 0000 // t

0000 0001

0000 0007

Esempio : Somma

Page 30: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

30

59Vittorio Maniezzo – Università di Bologna

.method static int32 Sum(int32 n) {.locals init ( [0] int32 s, [1] int32 i, [2] int32 t)

ldc.i4.0 stloc.0 ldc.i4.1 stloc.1 br.s check

loop: ldloc.0ldloc.1 add stloc.0ldloc.1 ldc.i4.1 add stloc.1

check: ldloc.1ldarg.0ble.s loopldloc.0stloc.2ldloc.2ret

}

[0] 0000 0000 // s

[1] 0000 0001 // i

Locals

[0] 0000 0007 // n

Arguments

Evaluation Stack

[2] 0000 0000 // t

0000 0000

Esempio : Somma

60Vittorio Maniezzo – Università di Bologna

.method static int32 Sum(int32 n) {.locals init ( [0] int32 s, [1] int32 i, [2] int32 t)

ldc.i4.0 stloc.0 ldc.i4.1 stloc.1 br.s check

loop: ldloc.0 ldloc.1add stloc.0ldloc.1 ldc.i4.1 add stloc.1

check: ldloc.1ldarg.0ble.s loopldloc.0stloc.2ldloc.2ret

}

[0] 0000 0000 // s

[1] 0000 0001 // i

Locals

[0] 0000 0007 // n

Arguments

Evaluation Stack

[2] 0000 0000 // t

0000 0000

0000 0001

Esempio : Somma

Page 31: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

31

61Vittorio Maniezzo – Università di Bologna

.method static int32 Sum(int32 n) {.locals init ( [0] int32 s, [1] int32 i, [2] int32 t)

ldc.i4.0 stloc.0 ldc.i4.1 stloc.1 br.s check

loop: ldloc.0 ldloc.1 add stloc.0ldloc.1 ldc.i4.1 add stloc.1

check: ldloc.1ldarg.0ble.s loopldloc.0stloc.2ldloc.2ret

}

[0] 0000 0000 // s

[1] 0000 0001 // i

Locals

[0] 0000 0007 // n

Arguments

Evaluation Stack

[2] 0000 0000 // t

0000 0001

Esempio : Somma

62Vittorio Maniezzo – Università di Bologna

.method static int32 Sum(int32 n) {.locals init ( [0] int32 s, [1] int32 i, [2] int32 t)

ldc.i4.0 stloc.0 ldc.i4.1 stloc.1 br.s check

loop: ldloc.0 ldloc.1 addstloc.0ldloc.1 ldc.i4.1 add stloc.1

check: ldloc.1ldarg.0ble.s loopldloc.0stloc.2ldloc.2ret

}

[0] 0000 0001 // s

[1] 0000 0001 // i

Locals

[0] 0000 0007 // n

Arguments

Evaluation Stack

[2] 0000 0000 // t

Esempio : Somma

Page 32: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

32

63Vittorio Maniezzo – Università di Bologna

.method static int32 Sum(int32 n) {.locals init ( [0] int32 s, [1] int32 i, [2] int32 t)

ldc.i4.0 stloc.0 ldc.i4.1 stloc.1 br.s check

loop: ldloc.0 ldloc.1 addstloc.0ldloc.1ldc.i4.1 add stloc.1

check: ldloc.1ldarg.0ble.s loopldloc.0stloc.2ldloc.2ret

}

[0] 0000 0001 // s

[1] 0000 0001 // i

Locals

[0] 0000 0007 // n

Arguments

Evaluation Stack

[2] 0000 0000 // t

0000 0001

Esempio : Somma

64Vittorio Maniezzo – Università di Bologna

.method static int32 Sum(int32 n) {.locals init ( [0] int32 s, [1] int32 i, [2] int32 t)

ldc.i4.0 stloc.0 ldc.i4.1 stloc.1 br.s check

loop: ldloc.0 ldloc.1 addstloc.0ldloc.1 ldc.i4.1add stloc.1

check: ldloc.1ldarg.0ble.s loopldloc.0stloc.2ldloc.2ret

}

[0] 0000 0001 // s

[1] 0000 0001 // i

Locals

[0] 0000 0007 // n

Arguments

Evaluation Stack

[2] 0000 0000 // t

0000 0001

0000 0001

Esempio : Somma

Page 33: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

33

65Vittorio Maniezzo – Università di Bologna

.method static int32 Sum(int32 n) {.locals init ( [0] int32 s, [1] int32 i, [2] int32 t)

ldc.i4.0 stloc.0 ldc.i4.1 stloc.1 br.s check

loop: ldloc.0 ldloc.1 addstloc.0ldloc.1 ldc.i4.1 addstloc.1

check: ldloc.1ldarg.0ble.s loopldloc.0stloc.2ldloc.2ret

}

[0] 0000 0001 // s

[1] 0000 0001 // i

Locals

[0] 0000 0007 // n

Arguments

Evaluation Stack

[2] 0000 0000 // t

0000 0002

Esempio : Somma

66Vittorio Maniezzo – Università di Bologna

.method static int32 Sum(int32 n) {.locals init ( [0] int32 s, [1] int32 i, [2] int32 t)

ldc.i4.0 stloc.0 ldc.i4.1 stloc.1 br.s check

loop: ldloc.0 ldloc.1 addstloc.0ldloc.1 ldc.i4.1 add stloc.1

check: ldloc.1ldarg.0ble.s loopldloc.0stloc.2ldloc.2ret

}

[0] 0000 0001 // s

[1] 0000 0002 // i

Locals

[0] 0000 0007 // n

Arguments

Evaluation Stack

[2] 0000 0000 // t

Esempio : Somma

Page 34: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

34

67Vittorio Maniezzo – Università di Bologna

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.

68Vittorio Maniezzo – Università di Bologna

Assembly

• Tutto il codice che gira nel CLR risiede in una 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.

Page 35: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

35

69Vittorio Maniezzo – Università di Bologna

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

70Vittorio Maniezzo – Università di Bologna

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

Page 36: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

36

71Vittorio Maniezzo – Università di Bologna

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

72Vittorio Maniezzo – Università di Bologna

Assembly

Assembly a modulo singolo

Codice IL

Metadati

Manifest

Modulo(file PE)

Page 37: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

37

73Vittorio Maniezzo – Università di Bologna

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.

74Vittorio Maniezzo – Università di Bologna

Metadati

• Informazioni sui tipi di un assembly

• Generati automaticamente dai compilatori

• Estendibili da terze parti

• Formato binario rappresentabile con XML:

— XML Schema (XSD)

— Serializzazione e deserializzazione oggetti a runtime in XML

Page 38: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

38

75Vittorio Maniezzo – Università di Bologna

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

76Vittorio Maniezzo – Università di 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

Page 39: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

39

77Vittorio Maniezzo – Università di Bologna

Compilatori e metadati

• Import dei tipi di dati cross-language

• Emettono i metadati insieme al codice

—Descrivono i tipi definiti e usati

—Registrano gli assembly esterni referenziati

—Registrano informazioni di versione

• Possono interpretare attributi custom

—Obsolete

— CLS Compliance (conformità CLS)

— Compilazione condizionale (es. debug)

—Attributi specifici del linguaggio

78Vittorio Maniezzo – Università di Bologna

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

Page 40: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

40

79Vittorio Maniezzo – Università di Bologna

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

80Vittorio Maniezzo – Università di Bologna

Garbage Collector - fase 1: Mark

NextObjPtr

Oggetti “vivi”

Oggetti non raggiungibili

Spazio libero

Root setRoot set

Page 41: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

41

81Vittorio Maniezzo – Università di Bologna

Garbage Collector - fase 2: Compact

NextObjPtr

Oggetti “vivi”

Spazio liberoRoot setRoot set

Spazio recuperato

82Vittorio Maniezzo – Università di Bologna

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.) il C++ nativo è ancora il linguaggio di

elezione.

Page 42: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

42

83Vittorio Maniezzo – Università di Bologna

GC e distruzione deterministica

• In alcuni casi serve un comportamento di finalizzazione deterministica:

—Riferimenti a oggetti non gestiti

—Utilizzo di risorse che devono essere rilasciate appena termina il loro utilizzo

• Non si possono usare i finalizzatori, che non sono richiamabili direttamente

• Implementare l’interfaccia IDisposable

84Vittorio Maniezzo – Università di Bologna

Gestione degli errori

• Uniforme per tutte le classi

• Gestione strutturata delle eccezioni

— Funzionalità implementata nel CTS

—Disponibile in tutti i linguaggi con sintassi diverse

— Elementi universali:

—Lanciare un’eccezione

—Catturare un’eccezione

—Codice di uscita da un blocco controllato (finally)

• Non ha costi elevati (codice/prestazioni)

Page 43: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

43

85Vittorio Maniezzo – Università di Bologna

Elaborazione sincrona e asincrona

a()a()a()a() b()b()b()b() c()c()c()c() d()d()d()d() e()e()e()e() f()f()f()f() g()g()g()g() h()h()h()h()

a()a()a()a()

b()b()b()b()

c()c()c()c()

d()d()d()d()

e()e()e()e()

f()f()f()f()

g()g()g()g() h()h()h()h()fork

join

Tempo

Elaborazionesincrona

Elaborazioneasincrona

Thread 1

Thread 2

86Vittorio Maniezzo – Università di Bologna

Elaborazione sincrona e asincrona

• Programmazione asincrona possibile da tutti i linguaggi

— Chiamate asincrone

— Thread

— Thread pool

— Componenti remoti

—A volte è “involontaria”...

• Nuovo problema: componenti thread-safe

Page 44: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

44

87Vittorio Maniezzo – Università di Bologna

Processi e AppDomain

• Processo: codice eseguibile (almeno un thread) e dati all’interno della memoria che si è riservato col sistema operativo. Ogni risorsa cui si accede (file ecc.) viene assegnata al processo.

• Limite di sicurezza: bug o funzioni malevole interne non possono agire su aree esterne al loro processo. Necessarie tecniche specifiche per far comunicare processi.

• Il processo è l’unità minima di isolamento su Windows.

• Problema per servizi web: centinaia di applicazioni sullo stesso server. Devono essere isolate per sicurezza, ma il costo di istanziazione ed esecuzione di tanti processi è proibitivo.

88Vittorio Maniezzo – Università di Bologna

AppDomain

• Application Domain (AppDomain): a metà fra processo e thread.

• Come un processo è un contenitore e un limite. Il runtime assegna

codice e risorse agli AppDomain e li isola entro confini di sicurezza.

• Un AppDomain appartiene a un unico processo, ma ogni processo

può contenere diversi AppDomain.

• Un AppDomain è molto meno costoso di un processo da gestire,

buono per gli ISP con centinaia di istanziazioni.

Page 45: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

45

89Vittorio Maniezzo – Università di Bologna

Type safety

• Isolamento della memoria

— Consente l’esecuzione sicura di più applicazioni nello stesso processo

• Type safety (sicurezza dei tipi)

—Assicura isolamento della memoria

—Assicura operazioni corrette rispettoal sistema di sicurezza

—Non è richiesta dal Runtime

• Verification

—Assicura type safety

90Vittorio Maniezzo – Università di Bologna

Type safety

• Si eliminano:

— Cast non sicuri

—Variabili non inizializzate

— Indici di array fuori limite (out-of-bounds)

• PEVERIFY.EXE

— Tool linea di comando per verificare requisiti di type safety di un assembly

Page 46: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

46

Framework 1.0

91Vittorio Maniezzo – Università di Bologna

Questa e’ stata la prima release ufficiale del .NET Framework, rilasciata il 13 Febbraio 2002 per Windows 98, Me, NT 4.0, 2000 e XP.

Il supporto di Microsoft per questa versione e’ finito il 10 Luglio 2007, mentre il supporto esteso e’ finito il 14 Luglio 2009.

Framework 1.1

92Vittorio Maniezzo – Università di Bologna

• Importante upgrade.

• Disponibile dal 3 aprile 2003, anche da sola come pacchettoridistribuibile o in un SDK, oltre ad essere inserita nella secondarelease del Visual Studio .NET.

• Prima versione di framework che e’ diventata parte di Windows, specificamente di Windows Server 2003.

• Il supporto per il framework 1.1 e’ finito il 14 ottobre 2008, ilsuppporto esteso terminera’ l’8 ottobre 2013.

• Dato pero’ che il.NET 1.1 e’ un componente di Windows Server 2003, il supporto esteso per .NET 1.1 su Server 2003 cessera’ assieme al supporto per quella versione di Windows, quindi il 14 Luglio 2015.

Page 47: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

47

93Vittorio Maniezzo – Università di Bologna

Framework 2.0

Non dipende dalle versioni 1.0 e 1.1

• Common Language Runtime (CLR) versione 2.0

• Compilatori per C# 2.0 e Visual Basic 8.0

Caratteristiche

• Supporto per i tipi generici

• Librerie di classi base

• ADO.NET

• ASP.NET

• Windows Form

• Web Service

Novità del 2.0 rispetto a 1.1

94Vittorio Maniezzo – Università di Bologna

• Tipi generici• Supporto per architetture 64-bit.• MOLTI cambiamenti di API.• Integrazione con SQL Server: .Net 2.0, VS 2005 e SQL Server 2005

sono tutti collegati, si possono scrivere stored procedures e lanciarle da un qualunque linguaggio .NET.

• Nuove API per applicazioni native che vogliono ospitare (host) ina istanza del.NET runtime.

• Molti nuovi controlli web ASP.NET.• Classi parziali• Tipi nullable• Metodi anonimi• Iteratori• Data tables

Page 48: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

48

95Vittorio Maniezzo – Università di Bologna

Framework 3.0

• È un’estensione del .NET Framework 2.0

• Usa il CLR del .NET Framework 2.0

• Usa i compilatori della versione 2.0

Framework 3.0

96Vittorio Maniezzo – Università di Bologna

• WPF: un nuovo sistema di sviluppo di interfacce utente basato su XML e grafica vettoriale, usa direttamente hardware grafico 3D e tecnologie Direct3D.

• WCF: un sistema di messaggistica service-oriented che permette ai programmi di interoperare in locale o in remoto, in modo analogo ai web services.

• WF: permette di sviluppare task automation e integrated transactions usando workflows.

• Windows CardSpace: un componente software che memorizza in modo sicuro le identita’ digitali e fornisce una interfaccia univoca per scegliere l’identita’ da usare per una particolare transazione (es. log in un sito web).

Page 49: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

49

97Vittorio Maniezzo – Università di Bologna

Framework 3.5

• È un’estensione del .NET Framework 2.0

• Si basa sul .NET Framework versione 2.0 e .NET Framework versione 3.0

• Usa il CLR del .NET Framework 2.0

• Nuovo compilatore per C# 3.0 e Visual Basic 9.0

• Aggiunta di classi rispetto al Framework 2.0 e 3.0

98Vittorio Maniezzo – Università di Bologna

Framework 3.5

Page 50: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

50

Variazioni da 3.0 a 3.5

99Vittorio Maniezzo – Università di Bologna

• Nuove caratteristiche dei linguaggi C# 3.0 e VB.NET 9.0• Aggiunge supporto per expression trees e espressioni lambda• Extension methods• Tipi anonimi con inferenza statica del tipo• Language Integrated Query (LINQ), assieme a vari suoi providers

(LINQ to Objects, LINQ to XML, LINQ to SQL)• Supporto al paging per ADO.NET• API di sincronizzazione per ADO.NET , per sincronizzare cache locali

e datastore su server• API per I/O asincrono su rete.• Stack di rete per sviluppo peer-to-peer• Wrappers gestiti per API di Active Directory• Miglioramento dei runtime WCF e WF, i servizi WCF possono essere

resi stateful• ASP.NET AJAX.

100Vittorio Maniezzo – Università di Bologna

Caratteristiche supportate

Non solo logica applicativa efficiente e accessibilità via browser, ma

anche:

• Interfacce web funzionalmente uguali ad applicazioni installate in

locale.

• Accesso consistente (stesse primitive) a diverse tipologie di dati:

relazionali, XML, testi, strutture dati, …

• Applicazioni distribuite, strutturate in accordo con una architettura

a servizi (SOA). Le funzionalità sono esposte come servizi

interoperabili, utilizzabili da altri applicativi.

• Interfaccia utente potenziata: include come controlli nelle form

diverse tipologie di documenti, grafica 2D e 3D, audio, video ecc.

Page 51: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

51

101Vittorio Maniezzo – Università di Bologna

AJAXAsynchronous JavaScript And XML, è una tecnica di sviluppo di applicazioni web interattive. Evitare che ogni richiesta utente risulti in una chiamata al server e a un reload della pagina

Le applicazioni HTML con AJAX si basano su uno scambio di dati in background fra browser e server, che consente l'aggiornamento dinamico delle parti interessate della pagina web senza esplicito ricaricamento da parte dell'utente.

AJAX è asincrono nel senso che i dati extra sono richiesti al server e caricati in background senza interferire con il comportamento della pagina esistente. Normalmente le funzioni richiamate sono scritte con il linguaggio JavaScript.

A dispetto del nome, l'uso di JavaScript e di XML non è obbligatorio, come non è necessario che le richieste di caricamento debbano essere necessariamente asincrone.

102Vittorio Maniezzo – Università di Bologna

LINQ

I dati su cui lavorano le applicazioni sono disponibili in formati diversi: tabelle relazionali, XML, oggetti in memoria, …

L’accesso a dati diversi tradizionalmente viene fato con modalità diverse (SQL, Xparse, … ).

Language-INtegrated Query (LINQ) permette di usare lo stesso formalismo, simile a SQL, per interrogare sorgenti dati diverse.

LINQ definisce un insieme di operatori che possono essere usati per interrogare, proiettare e filtrare dati in matrici, classi enumerabili, XML, database relazionali e sorgenti dati di terze parti.

Consente l'interrogazione di ogni sorgente di dati che rappresenti i dati sotto forma di oggetti.

Page 52: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

52

103Vittorio Maniezzo – Università di Bologna

WCF

Windows Communication Foundation è il supporto .Net per lo sviluppo di applicazioni distribuite (cfr. Service-Oriented Applications, SOA).

WCF è un "sottosistema applicativo" che offre la struttura API per la creazione di applicazioni distribuite in ambienti Windows.

Ogni protocollo di rete (HTTP, FTP, SMTP, ecc.) ha un suo modello di programmazione, e necessita quindi di una conoscenza specifica da parte degli sviluppatori per poter essere utilizzata: WCF è stato realizzato con l'intento di ricondurre ad un unico modello diverse tecnologie, rendendo più semplice ed uniforme la programmazione in ambiente Windows.

104Vittorio Maniezzo – Università di Bologna

WPF• Windows Presentation Foundation è una libreria per lo sviluppo

dell'interfaccia grafica delle applicazioni: approccio unificato a diverse tecnologie per la definizione di interfacce utente.

• Rimozione di ogni legame con il modello di sviluppo tradizionale di Windows. Tutti i controlli sono stati riscritti.

• WPF è basato su un sistema di grafica vettoriale che si appoggia alle DirectX per sfruttare l'accelerazione hardware delle moderne schede grafiche.

• WPF permette di sviluppare interfacce tradizionali a menu, ma anche includere video, animazioni, grafica 2D E 3D, visualizzare diversi tipi di documenti (word, pdf, ecc.) in una unica finestra.

• WPF permette di realizzare applicativi eseguibili anche all'interno di browser web. Il linguaggio usato per la creazione dell’interfaccia utente è XAML (eXtensible Application Markup Language), basato su XML.

Page 53: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

53

Framework 4.0

105Vittorio Maniezzo – Università di Bologna

• Parallel Extensions: supporto per parallel computing, target su multi-core o sistemi distribuiti. Verra’ incluso PLINQ (Parallel LINQ), e la Task Parallel Library che espone costrutti paralleli via invocazione di metodi.

• Nuovi elementi dei linguaggi Visual Basic .NET e C#, come statement lambdas, implicit line continuations, dynamic dispatch, named parameters, e parametri opzionali.

• Supporto completo IronPython, IronRuby e F#.

• Supporto per Code Contracts.

• Nuovi tipi per aritmetica a precisione arbitraria (System.Numerics.BigInteger) e numeri complessi (System.Numerics.Complex).

106Vittorio Maniezzo – Università di Bologna

Benefici promessi da .NET

Facilità di utilizzo

— Modelli object-oriented (Tutto è un oggetto)

— Namespace e Framework structure

—Facile da capire e usare

—Lo schema di denominazione dei namespace riflette le funzionalità derivate

Possibilità di scegliere:

— Il linguaggio preferito

— I tool di sviluppo più adatti

— Le funzionalità predefinite a cui collegarsi

Page 54: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

54

107Vittorio Maniezzo – Università di Bologna

Benefici promessi da .NETStabilità

— Impossibile avere perdite di memoria (mem. allocata e non rilasciata)

— La memoria è gestita da un garbage collector

— Gli assembly eliminano i problemi di compatibilità delle DLL

— Gli elementi di deploy si limitano agli assembly

Sicurezza

— Si limitano e vincolano i riferimenti illegali alla memoria

— Modello di sicurezza globale

—Specifico di un assembly

—A livello di sistema

—Possibilità di ispezionare il codice MSIL

Critiche

108Vittorio Maniezzo – Università di Bologna

• La applicazioni gestite richiedono piu’ risorse di quelle native che

accedono direttamente al SO.

• MSIL non obfuscated e’ piu’ semplice da disassemblare che codice

nativo. Problemi di perdita di proprieta’ industriale e di aggiramento di

metodi di controllo della licenza. Da Visual Studio .NET (2002),

Microsoft ha incluso un tool per offuscare il codice (Dotfuscator

Community Edition).

• Le nuove versioni del framework (da 3.5 in poi) non sono preinstallate

in versioni di Windows precedenti a Windows 7. Le applicazioni che lo

usano devono supportare gli utenti nella sua istallazione.

• Dimensioni eccessive degli installatori del .NET framework runtime per

end-users. Dimensioni: 54 MB per .NET 3.0, 197 MB per .NET 3.5 e 250

MB per .NET 3.5 SP1 (mentre usando web installer il download per

Windows XP e’ di 50 MB, per Windows Vista di 20 MB). Questo

problema e’ risolto con il .NET 4 installer (x86 + x64), che e’ di 54 MB

ma non comprende i runtime per le versioni precedenti.

Page 55: NETintroFULL [modalit compatibilit ]isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Gestione dell’esecuzione del codice: •Il CLR gestisce le referenze agli oggetti , rilasciandoli

55

Critiche

109Vittorio Maniezzo – Università di Bologna

• I framework ancora non supportano chiamate a Streaming SIMD

Extensions (SSE). Mono le ha incluse dalla versione 2.2 nel

namespace Mono.Simd. Il capo sviluppo di Mono, Miguel de Icaza,

spera di fare includere il suo SIMD support nello standard CLR ECMA

standard. Streaming SIMD Extensions sono disponibili nelle CPU x86

fin dal Pentium III. Senza supporto, queste istruzioni sono eseguite

via software.

• Mentre gli standard alla base del .NET sono cross platform,

Microsoft implementa solo per Windows. Microsoft fornisce

implementazioni parziali per altre piattaforme quali XNA for

Windows, XBOX 360 e Windows Phone 7, oltre a Silverlight per

Windows, Mac OSX e Windows Phone 7. Implementazioni

alternative del CLR, base class libraries e compilatori sono sempre

incomplete.