Le componenti di un calcolatore

CPU


Memoria volatile


Hard disk, dispositivi USB, PC Card
Rete



RAM
Memorie di massa


Intel x86, AMD
Wired e wireless LAN
Bluetooth
Altri dispositivi

Porte di comunicazione (seriale, parallela, USB, firewire, ecc.)
Il linguaggio della CPU
31
22 21
12 11
PDE (10 bit)
20 bits
PTE (10 bit)
12 bits
1023
20 bits
OFFSET (12 bit)
12 bits
0
Page Directory
0
4GB
1023
0
PAGE 4KB
Page Table
CR#3
ix86
FA 00 08
CF
AA 21 88
……….
RAM
0
Il linguaggio della CPU

Codici operativi e dati




Indirizzi di memoria, porte di comunicazione, ecc.
Istruzioni direttamente eseguibili dal processore
Molto difficili da ricordare… 
Molta potenza… nessun controllo!!



Estrema possibilità di fare errori nella scrittura
Nessuno strumento di verifica del codice
Nessun approccio “logico” alla scrittura del codice

Solo istruzioni di basso livello
Il sistema operativo


Windows, Unix/Linux, VMS, OS/400, ecc.
Inizialmente



Un insieme di servizi per consentire alle applicazioni di
non dover “reinventare tutte le volte la classica ruota”
Una serie di controlli per evitare che le applicazioni
possano “danneggiarsi” tra loro
Oggi



Tutto quello appena detto più..
Una interfaccia grafica sulle risorse del sistema
Un punto di controllo e configurazione del nostro PC
Come funziona Windows?


Parliamo ovviamente di Windows NT/2000/XP!! 
Un kernel che fornisce tutti i sistemi di base




Un insieme di interfacce di programmazione (API) per
accedere ai servizi del kernel



Gestione dei processi in esecuzione
Gestione della memoria
Controllo su tutti i dispositivi attraverso drivers
Librerie di funzioni: USER, GDI, KERNEL, ecc.
Diffici da utilizzare direttamente
Una shell, o interfaccia grafica, per permettere
l’interazione con l’utente
Le caratteristiche fondamentali

Windows è un sistema multi-threading


Windows è un sistema basato sul concetto di memoria
virtuale




Programmi e operazioni diverse possono essere eseguite in
parallelo (se abbiamo più CPU..)
Ogni programma ha a disposizione 4Gb di memoria “fittizia”
Il sistema operativo si occupa di assegnare lo spazio nella
memoria fisica e nel file di paginazione ai vari programmi
I programmi non possono “danneggiare” il kernel
I programmi sono “isolati” e non possono danneggiarsi
tra loro
Come si programma Windows?




Dipende dal tipo di applicazione che vogliamo realizzare
 Basata su finestre grafiche
 Web
 Un servizio di sistema
Scrivendo un programma in un linguaggio di programmazione che
viene trasformato in “codice macchina”
 Compilato
 Interpretato
Il programma interagisce con il sistema operativo attraverso le API
 Per disegnare una finestra
 Per scrivere sulla stampante, ecc.
Un esempio di applicazione Windows
L’introduzione delle macchine virtuali

Inizialmente i programmi Windows erano scritti in
linguaggio C, poi C++




Molta potenza per il programmatore
Poco controllo sull’accesso ai servizi di sistema
Molto difficile da utilizzare in modo corretto
Ogni linguaggio aveva le sue caratteristiche



I suoi tipi di dati
Le sue librerie di funzioni
Il suo modo di gestire la memoria, gli errori, ecc.
L’introduzione delle macchine virtuali

C’era la necessità di trovare qualcosa che
funzionasse da “astrazione” dal sistema operativo
per permettere al programmatore di concentrarsi su
un “modello virtuale” di sistema



Concetto apparso inizialmente in ambito accademico
Java è probabilmente l’implementazione più famosa di
questo concetto
Il .NET Framework di Microsoft è la soluzione creata
per tutta la famiglia Windows
Applicazioni monolitiche
Applicazion
e
Codice e
strutture dati
L’era di COM / CORBA
C++ / Java / VB
IDL
Marshaling
COM e CORBA consentono
di integrare dei componenti.
Ogni componente deve però
fornire dei “punti di
contatto” e gli oggetti non
possono interagire
direttamente
.NET: oltre l’era di COM
Con “.NET Framework
Common Language Runtime”,
i componenti sono costruiti su
uno strato comune. Gli oggetti
interagiscono direttamente.
Perché .NET




Difficile effettuare sviluppo omogeneo
Molto tempo viene dedicato a far comunicare i
vari “strati”
Serve un salto qualitativo per semplificare lo
scenario
Ma non c’era COM ?
Architettura .NET Framework
VB
C++
C#
J#
…
Common Language Specification
User
Interface
Data and XML
Base Class Library
Common Language Runtime
Visual Studio.NET
Web
Services
Cosa è .NET


È un ambiente di esecuzione (runtime environment)
È una serie di librerie e di strumenti per lo sviluppo di
applicazioni








Per client Windows
Per il Web
Per la realizzazione di Web Services
Semplifica lo sviluppo e il deployment
Aumenta l’affidabilità del codice
È completamente indipendente da COM
È fortemente integrato con COM
Unifica il modello di programmazione
Ambiente di esecuzione

Concetti chiave:




MSIL: Microsoft Intermediate Language
CLR: Common Language Runtime
CTS: Common Type System
CLS: Common Language Specification
Codice MSIL
Sorgenti
Compilatore
.NET
Codice
MSIL
(Assembly)
.EXE/.DLL
Compilatore
JIT
Codice
nativo
Output
Codice MSIL
Sorgenti
Compilatore
.NET
Codice
MSIL
(Assembly)
.EXE/.DLL
Codice +
metadati
Compilatore
JIT
Codice
nativo
Output
Codice MSIL
Sorgenti
Compilatore
JIT
Ambiente di
Compilatore
esecuzione
.NET
.NET Runtime
Codice
nativo
Codice
MSIL
(Assembly)
.EXE/.DLL
Output
Common Language Runtime

IL CLRcode
offre
vari
Managed
(MSIL)
servizi alle applicazioni
Common Language
Runtime (CLR)
Funzionalità specifiche di CLR
(es. Garbage Collection)
Sistema operativo (Win32, …)
Funzionalità esistenti (es. I/O
su file) mediate da CLR
Common Language Runtime
Base Class Library Support
Thread Support
COM Marshaler
Type Checker
Exception Manager
Security Engine
Debug Engine
IL to Native
Compilers
Code
Manager
Class Loader
Garbage
Collector
Runtime Host

Esecuzione di un’applicazione .NET
MYCOMCLASS.DLL
Managed World
KERNEL.DLL
MYNETCLASS.DLL
MSCOREE.DLL
Marshaling
MSCORLIB.DLL
Processo Win32 (app.exe)
Runtime Host

MSCOREE.DLL

“Ultima” DLL COM rimasta...


MSCORLIB.DLL




_CorDllMain: Entry-point del loader per caricare ed eseguire
il codice IL
Implementa CTS (Common Type System)
Contiene BCL (Base Class Library)
Non si vede con DEPENDS.EXE, usare ADEPENDS.EXE
Diversi tipi processi host

Shell exe, ASP.NET, Internet Explorer, Servizi NT
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 non gestiti
Meno memory leak: Garbage Collector
Indipendenza dalla piattaforma

.NET è un’implementazione di CLI


CLI è uno standard ECMA, definito con C#


Common Language Infrastructure
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)
…
Distribuzione semplificata delle applicazioni

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
Assembly
Modulo
(file PE)
Codice IL
Metadati
Manifest
Assembly a modulo singolo
Sicurezza e affidabilità del codice


Separazione spazi di memoria in un processo con
AppDomain
Controllo del codice e sicurezza dei tipi



Sono impediti cast non sicuri, variabili non inizializzate,
accessi ad array oltre i limiti di allocazione
Garbage Collector per tutti gli oggetti .NET
Gestione delle eccezioni


Miglioramento della diagnostica di errore
Integrata con Windows SEH
Type safety

Isolamento della memoria


Type safety (sicurezza dei tipi)




Consente l’esecuzione sicura di più applicazioni nello
stesso processo
Assicura isolamento della memoria
Assicura operazioni corrette rispetto
al sistema di sicurezza
Non è richiesta dal Runtime
Verification

Assicura type safety
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
Application Domain





Unità di elaborazione in .NET
Un processo può avere più AppDomain
Si può scaricare un AppDomain, non un assembly
Relazione thread – AppDomain
Runtime host creano AppDomain


ASP.NET, Internet Explorer, Shell, …
Gestione diretta degli AppDomain
Garbage Collector


Gli oggetti vengono distrutti automaticamente
quando non sono più referenziati
A differenza di COM, non ci si basa sul
Reference Counting




Maggiore velocità di allocazione
Consentiti i riferimenti circolari
Perdita della distruzione deterministica
Algoritmo Mark-and-Compact
Garbage Collector - fase 1: Mark
NextObjPtr
Root set
Oggetti “vivi”
Oggetti non raggiungibili
Spazio libero
Garbage Collector - fase 2: Compact
Spazio recuperato
NextObjPtr
Root set
Oggetti “vivi”
Spazio libero
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 “Code coverage”, ecc.
CTS: Common Type System

Sistema di tipi comune


Progettato per linguaggi object-oriented, procedurali
e funzionali




Alla base di tutti i linguaggi .NET
Esaminate caratteristiche di 20 linguaggi
Tutte le funzionalità disponibili con IL
Ogni linguaggio utilizza alcune caratteristiche
Common Language Specification (CLS)


Sottoinsieme di CTS
Regole di compatibilità tra linguaggi
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
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)


Tipi value (valore)


Allocati su heap gestito
Allocati su stack o in oggetti gestiti (reference)
Tutti i tipi value possono essere visti come tipi
reference

Boxing
Estendibilità tipi value

I value type comprendono:


Tipi primitivi (built-in)
Tipi definiti dall’utente
Enum
 Strutture


I tipi value definiti dall’utente hanno le stesse
capacità dei tipi primitivi
Tipi value e reference in memoria
public struct Size {
public int height;
public int weight;
}
public class CSize {
public int height;
public int weight;
}
void Main() {
Size
v;
//
v.height = 100; //
CSize
r;
//
r.height = 100; //
r = new CSize(); //
r.height = 100; //
}
v.height
v.width
v istanza di Size
ok
r è un reference
illegale, r non assegnato
r fa riferimento a un CSize
ok, r inizializzata
height
width
r
Stack
Heap
Class CSize
Tipi nativi
CLR
C#
VB.NET
Object
object
Object
String
string
String
Boolean
bool
Boolean
Char
char
Char
Single
float
Single
Double
double
Double
Decimal
decimal
Decimal
SByte
sbyte
n.d.
Byte
byte
Byte
Int16
short
Short
UInt16
ushort
n.d.
Int32
int
Integer
UInt32
uint
n.d.
Int64
long
Long
UInt64
ulong
n.d.
Boxing

I tipi value si possono sottoporre a “boxing”
per supportare le funzionalità tipiche degli
oggetti



Un tipo value “boxed” è un clone indipendente
Un tipo value “boxed” può tornare
ad essere value (unboxing)
System.Object è il tipo universale
Boxing
Stack
i
int i = 123;
object o = i;
int k = (int)o;
Heap
123
int i = 123;
o
int
123
object o = i;
k
Boxing
123
int j = (int)o;
Unboxing
Gestione degli errori


Uniforme per tutte le classi
Gestione strutturata delle eccezioni



Concetto implementato nel CTS
Disponibile in tutti i linguaggi con sintassi diverse
Concetti universali:
Lanciare un’eccezione
 Catturare un’eccezione
 Codice di uscita da un blocco controllato (finally)


Non ha costi elevati (codice/prestazioni)
Gestione strutturata delle eccezioni
a()
b()
Try
c()
d()
Catch e As Exception
f()
End Try
g()
Sub c
r()
s()
t()
End Sub
Sub s
Dim a As MyClass
a = null
a.z()
a.w()
a.x()
End Sub
Principali servizi del CLR

Garbage collector



Reflection



Analisi dei metadati di un assembly
Generazione di un assembly dinamico
Remoting


Gestione del ciclo di vita degli oggetti
Problema della distruzione deterministica
Chiamata di componenti remoti (.NET)
Interoperabilità (COM, Platform Invoke)
Elaborazione sincrona e asincrona
Elaborazione
sincrona
a()
b()
c()
d()
e()
f()
g()
h()
Tempo
Elaborazione
asincrona
a()
f
o
r
k
c()
e()
g()
b()
d()
f()
j
o
i
n
h()
Thread 1
Thread 2
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
Anche per gli sviluppatori VB!!
Dove sono gli assembly

Assembly privati


Assembly condivisi



Directory applicazione (e sub-directory)
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
Deployment degli assembly

XCOPY


.CAB


Applicazioni ASP.NET
Applicazioni Windows Forms - Code Download
.MSI (Windows Installer)



Applicazioni Windows Forms
Installazione in GAC di assembly condivisi
Configurazione shortcut
Metadati

Descrizione di un assembly





Descrizione dei tipi


Identità: nome, versione, cultura [, pubblic key]
Tipi esportati
Assembly da cui dipende
Permessi necessari per l’esecuzione
Nome, visibilità, classe base, interfacce implementate
Attributi custom



Definiti dall’utente
Definiti dal compilatore
Definiti dal Framework
Strong Name



Sinonimo: “shared name”
Traduzione ufficiale: “nome sicuro”
Lo scopo è garantire:




Identità dell’assembly
Nessuna modifica del codice
Riferimenti univoci
Non garantisce identità dell’autore

Nel caso usare tecnologie come la firma digitale
con certificati
Strong Name

Nome completo assembly:




Name (di solito è il nome del file)
Version (major/minor/build/revision)
CultureInfo* (lingua/zona)
Originator/PublicKey* (identità assembly)
Nome assembly visualizzato
* = opzionale
nomeassembly, Version=1.2.3.4, Culture=en-US,
PublicKeyToken=1234123412341234
Codice C#
using System.Reflection;
[assembly: AssemblyVersion(“1.2.3.4”)]
[assembly: AssemblyCulture(“en-US”)]
[assembly: AssemblyKeyFile(“mycompany.snk”)]
Strong Name




Assembly firmato digitalmente
Coppia di chiavi pubblica/privata
Chiave pubblica 1024 bit nell’assembly
Riferimenti all’assembly con Public Token




hash 64-bit della chiave pubblica completa
Hash di tutto il file  Digital Signature
SN.EXE per gestire file di chiavi
Attributi [AssemblyKeyFile()] e
[AssemblyDelaySign()] per associare chiavi agli
assembly
Firma digitale dell’assembly
Library.dll
Assembly
Codice IL
Public Key
Metadati
Private Key
Manifest
Public Key
Hash File
RSA Digital Signature
RSA Digital Signature
Public Key
RSA Digital Signature
Hash File
Firma digitale dell’assembly

Tool e attributi:




SN.EXE per gestire file di chiavi
Attributi [AssemblyKeyFile()] e
[AssemblyDelaySign()]
Integrazione con compilatori/VS.NET
In alternativa:

AL.EXE
Strong Name & Strong Reference
using System.Reflection;
[assembly: AssemblyKeyFile( “publicprivate.snk”)]
[assembly: AssemblyDelaySign( false )]
csc /t:library StrongLib.cs
StrongLib.dll
PE/COFF
Header
Public Key
(128 bytes +
header 32 bytes)
Private Key
(436 bytes)
Public Key (128 bytes
+ header 32 bytes)
Signature
CLR Header
Code
StrongApp.exe
stronglib
PE/COFF
Header
Publicprivate.snk
Public Key Token (8 bytes)
Assembly Reference
CLR Header
Code
Librerie di classi
VB
C++
C#
J#
…
Common Language Specification
User
Interface
Data and XML
Base Class Library
Common Language Runtime
Visual Studio.NET
Web
Services
Estendibilità delle classi


Il Framework non è una “scatola nera”
Qualsiasi classe .NET può essere estesa
mediante ereditarietà


Diversamente da COM, si usa e si estende la classe
stessa, non uno strato intermedio (wrapper)
L’ereditarietà è cross-language
.NET Framework
Web Services
User Interface
Data
Xml
Base Class Library
.NET Framework
System.Web
Compilation
System.Windows.Forms
UI
HtmlControls
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
Runtime
InteropServices
Remoting
Serialization
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


Consumer: Può usare .NET Framework
Extender: Può estendere .NET Framework
Linguaggi

Microsoft fornisce:


VB, C++, C#, J#
Linguaggi di terze parti:

APL, COBOL, Pascal, Eiffel, Haskell, ML,
Oberon, Perl, Python, Scheme, Smalltalk, …
Visual Studio .NET





Un solo tool per tutti i linguaggi
Creazione e consumo di servizi Web
Modello a oggetti del codice in editor
Debugger integrato
…
Considerazioni finali



Un nuovo modello di sviluppo per la piattaforma
applicativa Microsoft
Un nuovo ambiente di esecuzione integrato tra
diverse tipologie di applicazioni
Framework di classi già molto esteso




Ma soprattutto coerente!
Quasi tutto completamente estendibile
Alta integrabilità con il codice esistente
A prima vista è tutto semplice, ma è bene andare a
dare uno sguardo dietro le quinte!!
Scarica

Concetti generali - Sito web di Carolina Schiattarella