This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Passaggio dei Passaggio dei parametriparametri
Principali metodi di passaggio di parametri & procedure,Principali metodi di passaggio di parametri & procedure,SOAP & CORBASOAP & CORBA
l-value ed r-valueDue modi per riferirsi al significato-valore di una stessa espressione:
Il suo l-value (left-value):si riferisce alla locazione rappresentata dall'espressione a sinistra del simbolo d’assegnazione: a[i] := 5+2 (l ≈ location)
Il suo r-value (right-value):si riferisce al risultato dell’espressione a destra del simbolo d’assegnazione: a[i] := 5+2 (r ≈ result)
4
Parametri attuali e formali
Ci può essere confusione tra parametro inteso come "parametro ricevuto dalla funzione chiamata" e parametro come "parametro passato dalla funzione chiamante".Avremo allora due modi di vedere un parametro:
Parametro attuale: è il parametro che la funzione chiamante passa alla funzione chiamata, nel contesto della funzione chiamante.
Parametro formale: è il parametro che la funzione chiamata riceve, nel contesto dell'esecuzione della funzione chiamata.
5
Call By Value
E' usata per default in C ed in Pascal. I parametri attuali sono valutati, ed il loro r-value
è passato alla procedura chiamata. Il Call-by-value può essere implementato come
segue:1. Un parametro formale è trattato esattamente come un
nome locale, così una locazione per il parametro passato viene riservata nel record d'attivazione della procedura chiamata.
2. Per ogni parametro attuale, il chiamante ne valuta l'r-value e lo mette nella locazione del corrispondente parametro formale.
6
Call By Reference
Quando i parametri sono passati per riferimento, il chiamante passa alla procedura chiamata un puntatore per ognuno dei parametri passati.
Il Call-by-reference può essere implementato come segue:1. Se un parametro attuale è un nome o un'espressione
con gia’ un l-value (locazione) proprio, allora il suo l-value è passato direttamente come parametro.
2. Altrimenti, se il parametro attuale non ha un l-value, l'espressione è valutata e salvata in una nuova locazione, e l'indirizzo della nuova locazione è passato come parametro.
7
Emulare il Call By Referencecon il Call By Value Una procedura chiamata per valore può
cambiare lo stato della sua procedura chiamante attraverso variabili globali oppure attraverso puntatori esplicitamente passati come valori.
Utilizzando il passaggio di valori per accedere direttamente a locazioni fuori della visibilità della funzione chiamata, si crea di fatto un passaggio per riferimento.
8
Copy-Restore
Si tratta di una via di mezzo tra il Call-by-value e il Call-by-reference.
E' usato in Ada e da alcune implementazioni del Fortran, mentre altre usano il Call-By-Reference.
Può essere implementato come segue:1. Prima che il controllo passi alla procedura chiamata, gli r-
value dei parametri attuali sono valutati.I valori già di tipo r-value vengono passati alla procedura chiamata come per il call-by-value.In più, i parametri attuali che hanno un l-value proprio vengono determinati prima della chiamata.
2. Prima che il controllo ritorni, gli r-value dei parametri formali sono ricopiati negli l-value dei rispettivi parametri attuali, usando gli l-value calcolati prima della chiamata.I parametri che non avevano l-value al momento di essere passati non vengono ricopiati.
9
Esempio di caso in cui il programma si comporta diversamente a seconda che il passaggio sia Copy-Restore o Call By Reference:
program copyout(input,output);//variabile globale
var a : integer;procedure unsafe(var x, : integer);
beginx := 2;
//Call-By-Reference: sia 'x' che 'a' prendono r-value 2.//Copy-Restore: 'x' vale 2, 'a' verrà aggiornato al ritorno dalla procedura.
a := 0;//Call-By-Reference: sia 'x' che 'a' prendono r-value 0.//Copy-Restore: 'a' vale 0 e viene aggiornato subito perchè è una variabile globale, 'x' resta 2.
end;//Call-By-Reference: nessun cambiamento: 'a' resta con r-value 0.//Copy-Restore: 'a' prende l'ultimo valore di 'x', cioè 2.
begina := 1;unsafe(a);writeln(a);
//Viene stampato a seconda che si usi il Copy-Restore: “2” o il Call-By-Reference: “0”end.
10
Call By Name Call-By-Name è usato per il passaggio
parametri dell'Algol e per l’uso delle macro in C:1. La procedura è trattata come se ci fosse una macro,
cioè il suo corpo viene sostituito alla corrispondente chiamata nella procedura chiamante, con i parametri attuali sostituiti letteralmente (per nome) dai parametri formali.Questa sostituzione è chiamata Macro-Expansion o In-Line-Expansion.
2. I nomi locali della procedura chiamata vengono mantenuti distinti dai nomi della procedura chiamante, rinominando sistematicamente ogni nome locale con un nuovo nome distinto.
3. I parametri attuali vengono chiusi tra parentesi se necessario per preservare la loro integrità.
11
Parametri di tipo procedura
Alcuni linguaggi permettono di dichiarare variabili di tipo procedura o funzione.
Un esempio: OberonPascal
Oberon
Modula
Oberon è un linguaggio degli anni ’90, discendente del Pascal e orientato agli oggetti, che permette la dichiarazione e il passaggio di variabili di tipo funzione, nelle modalità Call-By-Value e Call-By-Reference.
Luca ColombiLuca Colombi
12
Passaggio by-value e by-reference (variable) Passaggio di una funzione per valore:
La variabile di tipo funzione passata può essere usata all’interno della funzione chiamata ma non subisce modifiche permanenti.
Passaggio di una funzione per riferimento: La variabile di tipo funzione passata può essere usata
all’interno della funzione chiamata, in più può ricevere l’assegnamento di un’altra funzione dello stesso tipo, che al ritorno dalla funzione chiamata rimane al posto di quella passata come parametro attuale.
Il tipo della funzione sostituita deve coincidere con quello della funzione che la sostituisce, cioè i tipi, il numero e la posizione dei parametri delle due funzioni devono coincidere.
JavaJavaRemote Method Remote Method
InvocationInvocation
Fabio FazioFabio Fazio
14
Rendere trasparente l’invocazione remota di metodi su oggetti Java che risiedono su diverse Virtual machines
Offrire un modello distribuito che preservi maggiormente la semantica degli oggetti Java
Rendere il piu’ semplice possibile la scrittura di applicazioni distribuite
E’ il procedimento opposto rispetto al Marshalling: trasforma rappresentazioni serializzate in oggetti “vivi”, in memoria
I parametri serializzati dallo Stub in fase di richiamo dei metodi vengono decodificati dallo Skeleton, i valori di rirorno codificati dallo Skeleton vengono decodificati dallo Stub
Valgono le stesse considerazioni sulla serializzazione degli oggetti fatte parlando del marshalling
Passaggio parametri by remote Passaggio parametri by remote reference (1/3)reference (1/3)
A volte sarebbe comodo mantenere sempre la coerenza tra le copie dei parametri del server e del client.
Occorre però un meccanismo che aggiorni automaticamente gli oggetti del client quando le rispettive copie presenti nel server subiscono una modifica.
Occorre allora che la copia presente nel server notifichi alla rispettiva copia nel client ogni variazione, cioè un meccanismo RMI con client e server invertiti.
Passaggio parametri by remote Passaggio parametri by remote reference (2/3)reference (2/3)
29
Quando il meccanismo di marshalling riconosce un oggetto che implementa l’interfaccia java.rmi.Remote, invece che inviare una copia dell’oggetto in questione ne invia uno Stub
Per ottenere un passaggio valori by remote reference, occorre dichiarare come parametro formale un’interfaccia che deriva da java.rmi.Remote
È possibile che un oggetto server implementi più interfacce
Si può così costruire un oggetto server che venga istanziato una volta sola e si comporti diversamente a seconda di come venga richiamato, ovvero che esporti metodi diversi a seconda di come vengano richiesti
Server che implementano Server che implementano interfacce multipleinterfacce multiple
SOAP:Simple Object Access Protocol SOAP è progettato come “protocollo leggero per lo scambio di
informazioni in ambiente distribuito”.In particolare uno dei suoi scopi più utili è come protocollo per chiamate di metodi remoti tra macchine diverse con sistemi diversi, fornendo la capacità di integrare sistemi che prima non erano facilmente in grado di comunicare e scambiarsi risorse.
SOAP prende i parametri di una procedura nella forma nativa binaria e li trasporta al server remoto come informazioni XML, in genere tramite protocollo HTTP.
Una volta a destinazione SOAP prende le informazioni XML e le riporta alla struttura binaria per l’elaborazione.
Alcuni vantaggi particolari di SOAP sono: essere basato su testo (XML) non essere legato a soluzioni proprietarie I firewall spesso possono essere configurati facilmente per lasciar
passare il protocollo HTTP.
Luca ColombiLuca Colombi
33
Struttura di un pacchetto SOAP Http utilizza l’header per
indirizzare il pacchetto, notificarne il contenuto (testo XML) e mantenere altre informazioni.
L’Envelope SOAP funziona come wrapper per le informazioni passate, in questo caso i parametri delle procedure.
L’Header SOAP è progettato per contenere meta-informazioni, per esempio un numero di account o l’algoritmo usato per crittografare le informazioni.
Il Body contiene le informazioni che vogliamo trasportare.
Pacchetto (http)
Header (http)
Soap XML Envelope
Header Soap (opzionale)
Body (il messaggio)
Eventuali elementi personalizzati
34
Envelope SOAP:Chiamata tradotta in xml<?xml version =”1.0” encoding=”utf-8”?><soap:Envelope
<Val>informazioni su Val</Val></GestisciOrdineResult>
</GestisciOrdineResponse></soap:Body>
</soap:Envelope>
37
CORBA: Common Object Request Broker Architecture L’architettura CORBA è un ambiente standard a che permette
l’interoperabilità tra oggetti in sistemi distribuiti eterogenei.I concetti base di CORBA sono: Object Services:
Sono una collezione di servizi di sistema predefiniti.Uno dei principali Object Services è il servizio di naming.
Naming Service:Il servizio di naming è il principale meccanismo che CORBA rende disponibile per l’identificazione degli oggetti.
Object Request Broker (ORB):L’ORB è l’entità che riceve la richiesta dal client, identifica il percorso necessario per raggiungere l’oggetto target, provvede al suo inoltro e riporta l’eventuale risposta all’oggetto client.
IDL:Interface Definition Language: serve a definire interfacce intese come insieme dei servizi disponibili.
Object implementation:E l’insieme di codice e dati che effettivamente implementa un oggetto server.
Luca ColombiLuca Colombi
38
ORB:chiamata di un metodo Il client esegue l'invocazione tramite un Object Reference, ottenibile ad
esempio con il servizio di naming, che identifica univocamente l'interfaccia dell'oggetto server.
Lavorare su un Object Reference ci permette di avere una sorta di “puntatore in remoto” e a livello di codice specificare le chiamate come locali.
La chiamata può avvenire tramite uno stub o essere costruita dinamicamente tramite la DII (Dynamic Invocation Interface).
L'ORB localizza l'oggetto server, trasmette i parametri e trasferisce il controllo al server tramite la server stub (o skeleton).
CORBA ammette anche chiamate in modalita’ oneway:Sono chiamate remote che non hanno riscontro lato client.
ORB
Object Adapter
Skeleton (server stub)Stub DII
Client Object implementation
39
IDL:scopo Gli oggetti CORBA sono visti come
“interfacce” specificate tramite l’IDL (Interface Definition Language).
L’Interface Definition Language è un linguaggio dichiarativo usato per descrivere le operazioni di un componente software accessibili esternamente (interfacce).
Nell’ambito di CORBA, IDL è usato per specificare i servizi offerti da ciascun oggetto server ad eventuali client.
40
IDL:gli stub Il mapping dell'IDL in un linguaggio descrive come si
traducono la sintassi e semantica dell'IDL in quel particolare linguaggio.Dalla definizione di un'interfaccia in IDL è possibile derivare (tramite un compilatore che soddisfa il mapping prescritto da CORBA) gli stub lato client e server. Il processo di conversione delle strutture dati in messaggi è
detto “marshaling”. Il processo di decodifica dei dati dal messaggio è detto
“unmarshaling”. Gli stub realizzano le funzionalità di marshalling e
unmarshalling dei paramentri e del valore di ritorno e rendono trasparente l’interazione dell'applicazione con l'ORB.
41
Parametri in IDL IDL supporta diversi tipi di dato semplici, tra cui Boolean, integer, string,
sequences(array monodimensionali), eccezioni.
Esempio: impiegato.idlinterface impiegato {
long numero();};interface registroImpiegati {
impiegato trova(in long imp_num);};
registroImpiegati.trova(<long>) restituisce l’Object Reference di un oggetto di tipo impiegato.
IDL permette di specificare le seguenti modalità: in: il parametro va solo dal client all’oggetto sul server out: il parametro viene usato come un ulteriore valore di ritorno, non viene
passato dal client all’oggetto sul server ma fa solo il viaggio inverso Inout: il parametro è inizializzato dal client e mandato all’oggetto sul server, che