U NIVERSITÀ DEGLI S TUDI DI N APOLI F EDERICO
II
Facoltà di Ingegneria
Corso di Laurea in Ingegneria Informatica
Tesi di Laurea
ANALISI E VALUTAZIONE DI MACCHINE
VIRTUALI JAVA PER DISPOSITIVI MOBILI
RELATORE
CANDIDATO
Ch.mo Prof. Ing. Stefano Russo
Francesco Esposito
Matricola 41/19
CORRELATORE
Ing. Domenico Cotroneo
ANNO ACCADEMICO 2002-2003
i
A mio
padre,
che ha lasciato un
vuoto incolmabile
dentro di me.
A mia madre.
ii
Ringraziamenti
Ancora non riesco a credere di essere giunto alla fine di un percorso così tortuoso e
travagliato. Sono stati molti i momenti di sconforto e più di una volta ho creduto di non
farcela. Presto molte delle mie ansie e angosce saranno rimosse e resterà solo la gioia di
aver reso fieri di me, le persone che mi vogliono bene e hanno avuto fiducia in me.
Ringrazio Dio, la cui benevolenza nei miei confronti è palese, per essere comunque
presente nella mia vita e per aver detto che gli ultimi saranno i primi.
Ringrazio mio padre che anche quando non stava affatto bene si preoccupava del fatto
che io non studiassi per stare vicino a lui, “perdonami per aver perso tanto tempo da non
poterti dare la gioia che sto donando a me stesso e agli altri. Spero tu sia fiero di me,
soprattutto per il modo in cui sto cercando di condurre avanti la nostra famiglia.”
Ringrazio mia madre per non avermi fatto mai pressioni, per aver gioito oltremodo ad
ogni esame, per aver sempre lavorato e lottato per i suoi figli, per le parole di lode e
ammirazione che ha proferito nei miei riguardi. “Spero che la gioia di questo momento
possa alleviare le tue tristezze e malinconie latenti.”
Ringrazio le mie sorelle: Anna, Lina e Pina per il loro amore e per le preghiere.
Ringrazio i miei nipotini e i membri della famiglia tutta.
Ringrazio Rossella per avermi costretto a sostenere esami che avrei altrimenti
rimandato, per il suo ottimismo contagioso, per il suo affetto.
Ringrazio Gaetano, amico sincero con il quale mi appresto a concludere la tormentata
epopea. Grazie per aver sopportato i miei costanti ritardi e per aver ascoltato i miei guai
con benevola comprensione.
Grazie al prof. Stefano Russo, mio relatore, e all’ing. Domenico Cotroneo, mio
correlatore e amico, per la preziosa assistenza.
Ringrazio: Paolo o’ purton; Giancarlo o’prucion; Ciro o’polemic; Laura anche detta
Maritton, anche detta Michel Jecksòn; Marco o’nano; Pepino tozzetto; Carmine
o’tupòn; o’Macciocc; e’ Milòn; Riccardin; o’Nunziat; i Grassi (che non sono miei
parenti); o’Iaccarin; o’Lerro; o’Rosell; o’Scellòn; Michele o’sapunar; Frenco; Ale detto
Jesus; Barbara wanna be good; Annabella a’ crostatin; Tina Robert; Gianni o’suggetton;
Alex il cane solatore; Bruno ex playboy; Foffy o’diggei; Linda; Valentina; Lell’o’rull; il
braccio e il braccio; Laura a’barist; Nicola o’ginecologo; le pitone; Paolo o’pucuron;
Pierluigi o’frevon; Pippo a’pall; Rosaria donna del procione anche detto a’ svedes;
Rosario o’cloaca; Austin Funèl; Tore Marino, per il soprannome parola…
senza di voi non ce l’avrei mai fatta a invecchiare sui libri!
Grazie a tutte le donne che ho avuto, finalmente avrò i soldi per pagare ancora; grazie a
telecapri, per i cattivi pensieri; grazie ai miei pochi capelli rimasti.
Grazie ai cari ingegneri del laboratorio: Carletto, chi s’assumigl’s’pigl’; Vincenzo forza
Barra, Cristiano; Generoso, Armando, Carmine e Marcello.
Un grazie agli amici: Carmine; Imma, anche detta Concetta; Paolo, better known as
Muppet; Stanislao e Gianluca SuperWaba.
Grazie a tutti…
Addà venì baffon!
iii
Introduzione
Cenni preliminari
1
3
Capitolo 1 – Le piattaforme Java per dispositivi mobili
7
1.1 Cenni storici
7
1.2 Architettura
8
1.2.1 Java Virtual Machine
9
1.2.2 Configurazioni
10
1.2.3 Profili
11
1.3 CLDC e CDC
12
1.3.1 Confronto tra le configurazioni
12
1.3.2 Dettagli di CLDC
13
1.3.2.1 Differenze di linguaggio
15
1.3.2.2 Differenze nelle Virtual Machine
16
1.3.3 Dettagli di CDC
1.3.3.1 Differenze di linguaggio
18
19
1.3.4 I Profili nel dettaglio
23
1.3.4.1 Il profilo MIDP
24
1.4 Sviluppo di applicazioni J2ME
27
Capitolo 2 – Le Virtual Machine CDC
28
2.1 Jeode
29
2.1.1 Disponibilità
29
2.1.2 Caratteristiche
30
2.1.3 Ciclo di Sviluppo
32
2.1.4 Le API di Jeode
33
2.2 CrEme
34
2.2.1 Disponibilità
34
2.2.2 Caratteristiche
35
2.2.3 Ciclo di Sviluppo
37
2.2.4 Le API di CreMe
38
2.3 SuperWaba
39
2.3.1 Disponibilità
40
2.3.2 Caratteristiche
42
2.3.3 Ciclo di Sviluppo
44
iv
2.3.4 Le API di SuperWaba
2.4 Ewe
46
48
2.4.1 Disponibilità.
49
2.4.2 Caratteristiche
50
2.4.3 Ciclo di Sviluppo
51
2.4.4 Le API di Ewe
53
2.5 Considerazioni comparative
54
Capitolo 3 – Definizione ed implementazione dei test sperimentali
55
3.1 Il modello di qualità
55
3.1.1 Gli attributi e le entità
56
3.2 Le metriche
57
3.3 I test sperimentali: definizione e implementazione
59
3.3.1 Il multithreading
59
3.3.1.1 Considerazioni preliminari
59
3.3.1.2 Livello di multithreading
62
3.3.1.3 Prestazioni di uno stesso algoritmo multithread
63
3.3.2 Il tempo di chiamata ai metodi
64
3.3.3 Operazioni di Input/Output su file
65
3.3.4 Operazioni di Input/Output su rete
66
Capitolo 4 – Analisi e valutazione dei risultati sperimentali
68
4.1 Metriche quantitative: risultati
69
4.1.1 Impronta di memoria
69
4.1.2 Multithreading
69
4.1.2.1 Livello di Multithreading
70
4.1.2.2 Prestazioni di un algoritmo multithread
72
4.1.3 Tempo di chiamata a metodi
73
4.1.4 Overhead delle macchine virtuali
74
4.1.5 Operazioni di I/O su file
75
4.1.6 Operazioni di I/O su rete
77
4.2 Metriche quantitative: confronto
78
4.2.1 Impronta di memoria.
78
4.2.2 Multithreading
79
4.2.2.1 Livello di multithread
79
v
4.2.2.2 Prestazioni di un algoritmo multithread
82
4.2.3 Tempo di chiamata a metodi
84
4.2.4 Overhead delle macchine virtuali
86
4.2.5 Operazioni di I/O su file
87
4.2.5.1 Scrittura
87
4.2.5.2 Lettura
88
4.2.6 Operazioni I/O su rete
4.3 Metriche quantitative: valutazioni e confronto
89
90
4.3.1 Disponibilità
90
4.3.2 Ciclo di sviluppo
91
4.2.3 Classi supportate
92
4.2.4 Interfaccia utente
93
4.2.5 Compatibilità con Java
94
Conclusioni
95
Appendice A
96
A.1 Istallazione di SuperWaba su PC Desktop (Windows 98 e superiori)
96
A.2 Installazione di SuperWaba sul palmare (Compaq iPAQ 3970)
97
A.3 L’ applicazione
98
A.4 Compilazione e generazione degli eseguibili
99
A.5 Esecuzione
100
Appendice B
102
B.1 Istallazione di Ewe su PC Desktop (Windows version)
102
B.2 Installazione di Ewe sul palmare (Compaq iPAQ 3970)
103
B.3 L’ applicazione
103
B.4 Compilazione e generazione degli eseguibili
104
B.5 Esecuzione
106
Bibliografia
107
vi
Introduzione
Scopo del seguente lavoro di tesi è il confronto tra differenti macchine virtuali, destinate
ai cosiddetti “small connected devices”, cioè ai piccoli dispositivi dotati di proprietà di
connettività. L’attenzione è focalizzata in particolare sui palmari con sistema operativo
basato su WindowsCE.
Al fine di conseguire l’obiettivo si valuteranno le diverse macchine virtuali mediante la
definizione di un modello di qualità [Pressman]. La qualità si caratterizza attraverso un
insieme finito e definito di attributi, quindi un modello di qualità è composto da
attributi, ciascuno considerato con un suo peso, aventi la finalità di rappresentare la
qualità posseduta dal prodotto software considerato.
Nel definire il modello consideriamo il fatto che i palmari attuali hanno raggiunto
un’evoluzione tale, da avvalersi dell’appellativo di piccoli dispositivi principalmente in
termini relativi, cioè se rapportati agli odierni computer desktop. Per cui il numero di
applicazioni client-based realizzate per tali dispositivi è cresciuto enormemente.
In tabella 1 è mostrato l’insieme di attributi scelto per la caratterizzazione del modello
proposto e, per ciascun attributo, l’insieme delle entità che, a loro volta, caratterizzano
gli attributi.
Attributo
Efficienza
Interoperabiltà
Usabilità
Portabilità
Entità
Multithreading; Chiamate a metodi;
Overhead;
Operazioni di Input-Output su file e su rete;
Compatibilità con Java
Ciclo di sviluppo, Interfaccia grafica, Classi
supportate
Disponibilità su differenti piattaforme
hardware-software.
Tabella 1 – Modello di qualità per la valutazione delle macchine virtuali.
Definito il modello, è possibile introdurre le metriche software. Esse rappresentano lo
strumento attraverso il quale è possibile misurare le entità che caratterizzano gli attributi
del modello considerato.
Le metriche definite, sono sia qualitative sia quantitative. Esse sono descritte nella
tabella 2.
1
Metrica qualitativa
Il numero di piattaforme hardware-software che supportano le VM.
Il ciclo di sviluppo per la realizzazione delle applicazioni.
Usabilità
La tipologia di classi supportate da ciascun ambiente.
La tipologia del supporto alle Graphical User Interface.
Interoperabilità Compatibilità con java.
Portabilità
Metrica quantitativa
L’impronta di memoria (footprint memory);
Il multithreading, in termini di:
• Livello di multithreading;
• Tempo di esecuzione di uno stesso algoritmo multithread,
senza politiche di sincronizzazione.
Le chiamate a metodi, in termini di:
• Tempo medio di chiamata senza parametri;
• Tempo medio di chiamata con parametro elementare;
• Tempo medio di chiamata con parametro strutturato;
L’overhead, in termini di:
• Quantità media di memoria occupata, per l’esecuzione della
macchina virtuale.
Interoperabilità Le operazioni di Input/Output su file, in termini di:
• Tempo medio di scrittura al variare delle dimensioni del file;
Efficienza
•
Tempo medio di lettura al variare delle dimensioni del file
Le operazioni di Input/Output su rete, in termini di delay.
Tabella 2 – Metriche qualitative e quantitative.
Il
processo di misurazione passa attraverso la realizzazione di varie applicazioni
concernenti le aree di interesse menzionate in precedenza. Il dispositivo su cui saranno
eseguite le applicazioni è il palmare Compaq iPAQ 3970, con sistema operativo
PocketPC2002. Le virtual machine, oggetto della valutazione, sono le seguenti:
•
Jeode, della Insigna [Jeode];
•
CreMe, della NSICom [CrEme];
•
Superwaba [SWaba];
•
Ewe [Ewe].
2
Cenni preliminari
Considerato il recente e quanto mai crescente interesse riguardo l’uso di Java su piccoli
connected devices può sorprendere pensare che le origini di Java derivino dal progetto e
lo sviluppo di un limitato dispositivo wireless di nome “*7” [HaOCon].
Quest’ultimo è stato realizzato dalla Sun alle metà degli anni ’90. Il sistema operativo di
tale macchina, denominato “Dubbed”, ha contribuito alla formalizzazione di base del
linguaggio Java. Quindi impiantare Java sui piccoli device può considerarsi, seppur
modestamente, una sorta d’onorificenza nei riguardi delle origini di Java.
Cominciamo ad esaminare le limitazioni che caratterizzano i piccoli dispositivi poiché
tali si traducono in altrettante sfide per l’utilizzo di Java in tale ambito.
L’attenzione è rivolta a quei dispositivi mobili, quali telefoni cellulari e PDA ( Personal
Digital Assistent ), caratterizzati da consistenti limitazioni in termini di funzionalità e
risorse se confrontati ai desktop computer.
Come accennato il linguaggio Java era stato inizialmente concepito come tecnologia di
interconnessione per piccoli dispositivi, ma col tempo si è sviluppato fino a supportare
programmi per computer desktop e applicazioni mission critical server based.
Di conseguenza, al progetto iniziale, sono state aggiunte un numero considerevole di
API (Application Program Interface), incrementando significativamente le funzionalità
offerte da Java.
E’ facile intuire che le numerose API messe a disposizione da Java non possono essere
integrate in quei dispositivi caratterizzati dai vincoli di cui sopra.
Nel 1999 alla JavaOne Conference fu presentata KVM (Kilobyte Virtual Machine) per
il Palm OS, successivamente con l’arrivo di J2ME, Java è ritornato ad essere destinato
ai piccoli dispositivi.
Ci si può porre la questione se Java abbia la caratteristica di essere “suitable” per i
piccoli dispositivi. Ebbene il recente sviluppo di Java come vero e proprio linguaggio di
programmazione accompagnato dallo sviluppo del mercato dei piccoli device risponde a
tale interrogativo in maniera inequivocabilmente affermativa, ma molte caratteristiche
del linguaggio e le API devono essere adattate per rispondere ai requisiti di tali piccoli
dispositivi.
3
Gli aspetti che maggiormente sono da tenersi in considerazione riguardano le seguenti
aree chiave:
•
capacità di elaborazione in termini di CPU e memoria;
•
alimentazione;
•
connettività;
•
interfaccia utente.
Analizziamo con ordine ciascuna delle aree summenzionate.
Capacità di elaborazione
La computing capability è in diretta correlazione con il modo in cui un dispositivo
elabora le informazioni per l’utilizzatore finale. Essa è da ritenersi un attributo
composto le cui parti fondamentali sono: la velocità della CPU, la memoria totale, la
capacità delle unità di memorizzazione di massa e gli altri fattori concernenti
l’hardware.
Purtroppo la capacità di elaborazione varia notevolmente nell’ambito dei piccoli
dispositivi e l’unico denominatore comune è il fatto di essere molto limitati se
confrontati con i desktop computer.
La limitata natura dei piccoli dispositivi vincola pesantemente il Java Environment, data
la vastità delle librerie standard di Java è impossibile infatti pensare di portare
interamente le API standard su di un piccolo dispositivo.
Pertanto impiantare API che abbiano la caratteristica di essere usabili, in un piccolo
dispositivo, necessita di un oculato adattamento, d’altra parte la limitazione nelle API
porta ad una limitazione nella portabilità dei relativi programmi. Gli sviluppatori Java
hanno infatti imparato a produrre codice indipendentemente dalla specifica piattaforma
a cui una applicazione può essere destinata e questo ha incrementato, dal punto di vista
dello programmatore, la gradevolezza (appeal) nei confronti dell’ambiente Java.
L’approccio di ridimensionamento del Java Environment è tuttavia inevitabile ed
influisce sull’ appeal dell’intero ambiente poiché costringe gli sviluppatori a conoscere
le “nuove” API, ma risulta essere l’unico approccio possibile al fine di conciliare le
esigenze di tutte le parti in causa.
4
Fortunatamente, come in ogni altro campo dell’ industria dei computer, anche per i
piccoli dispositivi c’è una rapida crescita della capacità di elaborazione, basti pensare
che il Palm1000 presentato nel 1996 era equipaggiato con una memoria RAM di appena
128kb e che dopo circa quattro anni le versioni del PalmOS includevano una memoria
RAM di 8Mb. Oggigiorno siamo ad una dimensione della memoria di 64Mb. Anche la
velocità della CPU aumenta vertiginosamente con gli anni: i PalmOS del 2000 avevano
un clock intorno ai 25MHz mentre attualmente si hanno handheld che lavorano anche a
frequenze di 400MHz. Al miglioramento della capacità di elaborazione concorrono
diversi fattori, tra i quali l’integrazione dei componenti elettronici e il miglioramento
delle architetture dovuto alla crescita del mercato dei piccoli dispositivi, tale crescita è
stata favorita anche dal diffondersi delle tecnologie wireless network tra cui è in forte
ascesa Bluetooth.
Alimentazione
Diversamente dai computer desktop i piccoli dispositivi hanno, per loro natura, la
caratteristica di dover essere self-sufficient dal punto di vista dell’alimentazione. Cioè si
assume che essi possano operare senza l’ausilio diretto di una fornitura di energia
elettrica e sono dotati di una batteria ricaricabile che ha una limitata autonomia e che
rappresenta una risorsa da ottimizzare con cura, dato che la natura mobile dei device
conduce all’assunzione che essi operino lungo tempo senza poter essere ricaricati.
La necessità di conservazione della batteria influenza in maniera indiretta il processo di
acquisizione di Java sui piccoli dispositivi: chip che lavorano a frequenza più basse
richiedono meno potenza e quindi prolungano la vita della batteria e il loro uso, ciò si
riflette nella necessità di avere API ottimizzate per avere tempi di risposta accettabili dal
punto di vista dell’utilizzatore.
5
Connettività
Dato il crescente espandersi dei piccoli dispositivi, la banda delle reti wireless non è più
da considerarsi limitata . Nel 2000 la maggior parte delle applicazioni wireless based
potevano contare su di una banda di 9600 Kbps o anche meno, questo perché l’impiego
di Java era maggiormente rivolto ai telefoni cellulari, oggi siamo intorno a 10÷54 Mbps.
Comunque per i piccoli dispositivi che supportano Java, reti lente e inconsistenti, in
termini di disponibilità, possono ostacolare funzionalità che si affidano ad un
connessione a larga banda.
Le applicazioni sui piccoli dispositivi wireless devono quindi portare in conto le diverse
reti e le difficoltà di comunicazione che si incontrano su di una rete lenta e
limitatamente affidabile.
Interfaccia utente
Una delle aree in cui è più difficile standardizzare, passando attraverso varie
piattaforme, è l’interfaccia utente. La storia di Java, del resto, ci illustra quale lento
processo abbia alla fine portato ad una matura GUI ( Graphical User Interface ).
I piccoli dispositivi presentano altrettante difficoltà in questa area chiave, data la
molteplicità e la diversità dei metodi di input – output. Si pensi ad esempio alle
differenti dimensioni degli schermi di un telefonino cellulare e di un palmare o alle
diverse modalità di immissione dati di questi ultimi.
Per tale motivo non è consigliabile portare su di un piccolo dispositivo le API Swing o
AWT integralmente, anche perché queste sono state pensate per computer aventi
dimensioni degli schermi ben delineate.
Sarebbe preferibile quindi pensare ad una GUI che fosse in grado di aderire alle
caratteristiche “look and feel” dei singoli dispositivi in questione. D’altra parte, in
particolar modo per gli handheld, è possibile alleggerire le API del Java Environment,
per esempio le API AWT, lasciando al programmatore il compito di adattare la propria
applicazione alle dimensioni del device cui è destinata l’applicazione stessa.
6
Capitolo 1
Le piattaforme Java per dispositivi mobili
Il primo sforzo concreto, finalizzato alla realizzazione di piattaforme Java per i piccoli
dispositivi, è stato compiuto dalla Sun attraverso il progetto della tecnologia J2ME
(Java 2 Micro Edition) [J2ME], [HaOCon].
J2ME nasce come strumento in grado di fornire funzionalità multi-piattaforma su
piccoli dispositivi orientati alla connessione. Le stesse che hanno caratterizzato
l’infrastruttura Java standard e che ne hanno decretato il successo. In poche parole la
mission era portare Java su tali device, per cui l’obiettivo principe si può identificare
nella portabilità delle applicazioni.
Abbiamo già discusso dell’impossibilità di portare integralmente le API standard sulle
svariate tipologie di dispositivi, per cui si è dovuto affrontare un attento processo di
riduzione delle “core API” attraverso semplice soppressione e ottimizzazione.
Quest’ultima realizzata, però, lasciando inalterate le specifiche dei metodi (bisognava
cambiare il “come”, non il “cosa”).
I dispositivi in questione non hanno tutti le stesse caratteristiche, per cui, al fine di
fornire compatibilità con una platea tanto eterogenea, si è deciso di progettare
l’infrastruttura J2ME in maniera modulare. Ciascun modulo fornisce una serie si servizi
(attraverso le API), cosicché una applicazione è in grado di essere eseguita su diverse
piattaforme a patto che esse supportino gli stessi moduli dell’infrastruttura.
1.1 Cenni storici
J2ME fu presentata al mondo per la prima volta nel 1999 durante i lavori della JavaOne
conference.
Era l’epoca in cui la Sun annunciò la realizzazione della prima Virtual Machine per il
PalmOS: si trattava di Kilobyte Virtual Machine (KVM).
Nel corso del 2000 prese corpo l’intento di modularizzare l’infrastruttura J2ME con
l’introduzione, per la prima volta, di un’architettura basta su configurazioni e profili. In
tal modo, partendo da una realizzazione basata su KVM, il J2ME environment è stato
7
esteso fino ad includere numerose famiglie di dispositivi. La cosa che rende
profondamente diverso J2ME dai suoi predecessori, tra cui Personal Java e Embedded
Java, è proprio il fatto di rendere possibile la personalizzazione di J2ME per specifici
dispositivi in un modo rigorosamente standardizzato, prevenendo così il proliferare di
differenti e ridondanti versioni e garantendo un’elevata flessibilità.
1.2 Architettura
Le specifiche di J2ME hanno imposto, fin dal concepimento, la strutturazione delle API
in due livelli, in grado di fornire comunione e flessibilità. Essi sono definiti,
rispettivamente, configurazioni e profili e formano, unitamente ad una Java Virtual
Machine (JVM) un completo Java Runtime Environment per una determinata tipologia
di dispositivi.
Applicazione J2ME
Profilo
Applicazione J2ME
Profilo
opzionale
Java
API
specifiche
Applicazione
Nativa
Configurazione
Java Virtual Machine
Sistema Operativo Nativo
Figura 1.1 - Architettura J2ME
In figura 1.1 è mostrata la stratificazione dei livelli software di un dispositivo che
supporta l’ambiente J2ME:
•
Il sistema operativo fornisce i servizi di base per accedere all’hardware del
dispositivo, consente l’accesso alla memoria e gestisce l’ archiviazione delle
8
informazioni sulla memoria di massa. Inoltre esso supporta le applicazioni
native;
•
La Java virtual machine fornisce l’ambiente di esecuzione necessario ad
interpretare il bytecode Java e può eventualmente supportare le Java API
specifiche del costruttore;
•
Al di sopra della macchina virtuale si trovano le API appartenenti alla
particolare famiglia di dispositivi e le API specifiche del singolo dispositivo,
realizzate dal costruttore. Le prime sono contenute nella configurazione e nel
profilo, mentre le seconde consentono di accedere alle funzionalità proprie di
quel dispositivo e non della famiglia;
•
infine troviamo l’applicazione J2ME realizzata mediante l’utilizzo delle API
fornite ai livelli sottostanti.
1.2.1 Java Virtual Machine
Come già accennato la macchina virtuale Java fornisce un ambiente di esecuzione per
l’esecuzione dei programmi Java. Essa si pone al disopra del sistema operativo fornendo
un interprete nativo per il bytecode. Le JVM per i piccoli dispositivi hanno a
disposizione solo una quantità molto limitata di memoria per svolgere il loro compito,
inoltre necessitano di essere ottimizzate per fornire un accettabile livello di prestazioni,
in quanto la velocità di elaborazione dei piccoli dispositivi è altrettanto ridotta quanto la
memoria.
I requisiti di una siffatta macchina virtuale sono definiti da un lato dalla limitata
natura del dispositivo in questione e dall’altro dalla definizione della particolare
configurazione, la quale definisce una serie di funzionalità che la JVM deve
implementare.
La Kilobyte Virtual Machine, progettata per lavorare sui PalmOS, deve il suo nome alla
ridotta quantità di memoria di cui necessita per essere installata su di un piccolo
dispositivo. E’ sufficiente una quantità di memoria di 160kb e lavora su processori
CISC o RISC a 16 e 32 bit.
Simile alla precedente è la HVM, Hotspot Virtual Machine, la quale rappresenta una
specializzazione della KVM per i processori ARM. Essa consente un cospicuo aumento
di prestazioni dovuto all’adattabilità della compilazione a scapito di un ridotto aumento
del fabbisogno di memoria. Infine possiamo citare la CVM, C Virtual Machine,
9
progettata per supportare tutte le caratteristiche di J2SE e destinata, per tale ragione, ai
dispositivi con consistenti risorse hardware.
1.2.2 Configurazioni
Le configurazioni definiscono un insieme di API base che accomunano una serie di
dispositivi simili dal punto di vista hardware. Tali dispositivi possono essere, in realtà,
abbastanza differenti tra loro, ma sono tutti caratterizzati dall’avere alcune peculiarità
molto simili. Ad esempio la memoria disponibile, il tipo di processore e le network
capability, possono essere le stesse malgrado i differenti fattori di forma o gli ambiti
applicativi più disparati. Quindi le configurazioni hanno ragion d’essere nell’intento di
stabilire comunione tra diverse famiglie di dispositivi equipollenti, mediante la
realizzazione di un “core API” invariante da dispositivo a dispositivo.
Poiché il livello di configurazione poggia direttamente sulla JVM, può essere necessario
contemplare alcune dipendenze di basso livello, ad esempio una configurazione
potrebbe richiedere operazioni floating-point che alcune JVM, tra cui KVM, non
supportano. Ogni macchina virtuale coerente con una siffatta configurazione deve
quindi supportare gli oggetti float e double.
Quindi la configurazione oltre ad escludere API fortemente dipendenti dalla specifica
piattaforma, definisce i requisiti della macchina virtuale su cui poggia. Il concetto non
deve destare ambiguità: anche se configurazione e macchina virtuale sono strettamente
accoppiate, esse restano ben distinte.
Nonostante una configurazione sia generalmente distribuita assieme ad una macchina
virtuale, la prima non è necessariamente legata alla seconda e può funzionare con
qualsiasi JVM che sposa i suoi bisogni. La tabella 1.1 mostra le configurazioni correnti
di J2ME. In essa è indicata la versione e il numero della Java Specification Request
(JSR) definito dalla Java Community Process (JCP) [JCP].
Tecnologia
Descrizione
Release
CLDC v. 1.1 JSR-139
Connected Limited Device Configuration,
Marzo 2003
per dispositivi quali telefoni cellulari.
CDC v. 1.0a JSR-36
Connected Device Configuration, fornisce un
Agosto 2002
ambiente più esteso per dispositivi più complessi.
Tabella 1.1 - Le principali configurazioni J2ME attualmente disponibili
10
1.2.3 Profili
I profili differiscono dalle configurazioni poiché focalizzano l’attenzione su specifici
gruppi di dispositivi il cui denominatore comune è l’adesione completa ad una data
configurazione. Ad esempio il profilo MIDP (Mobile Information Device Profile),
specifico per i telefoni cellulari, differisce dal profilo PDA dedicato ai primi palmari,
ma entrambi poggiano sulla stessa configurazione (CLDC).
Le configurazioni, quindi, forniscono le funzionalità di base, mentre i profili supportano
funzionalità molto specifiche della particolare famiglia di dispositivi per cui sono stati
concepiti.
Con tale approccio modulare è possibile includere specificità in un programma
preservando la genericità delle funzionalità di base. Ciò favorisce un processo di
portabilità che, anche se non è immediato, è altamente flessibile: la migrazione di un
programma da una famiglia di dispositivi ad un'altra, consente il riuso del codice
prodotto usando una configurazione comune e impone la riscrittura del solo codice
specifico per il dispositivo, mediante l’utilizzo di un opportuno profilo.
Inoltre è possibile utilizzare profili opzionali per aggiungere funzionalità non disponibili
in quello standard. Ad esempio il profilo RMI aggiunge la funzionalità di Remote
Method Invocation alle funzionalità di base del profilo a cui si affianca. La tabella 1.2
mostra alcuni profili correnti e quelli futuri.
Tecnologia
Descrizione
MIDP v. 2.0 JSR-118
Estende la configurazione CLDC con classi Novembre
abstract per le UI e per il Networking.
Release
2002
Foundation Profile v. Estende CDC, richiede almeno un profile Marzo 2001
1.0JSR-46
addizionale per essere completo.
Personal Profile v. 1.0 Profilo per piccoli devices che sostiuisce Settembre 2002
JSR-62
Personal Java 1.1.x e 1.2.x.
RMI Profile v.1.0 JSR- Fornisce il supporto opzionale RMI.
Giugno 2002
66
PDA Profile JSR-75
Profilo più completo rispetto a MIPD, si ICDO
poggia su CLDC ed è destinato ai PDA.
Game Profile JSR-134
Pensato per lo sviluppo di giochi sul J2ME ICDO
environment
Tabella 1.2 – Alcuni profili disponibili e altri in corso d’opera (ICDO).
11
Le informazioni presenti nelle tabelle 1.1 e 1.2, sono aggiornate al marzo 2004.
Ulteriori informazioni sullo stato dei lavori e la descrizione delle specifiche, sono
reperibili al sito http://www.jcp.org/.
1.3 CLDC e CDC
Ci sono soltanto due configurazioni che coprono un largo range di famiglie di
dispositivi. Un numero così esiguo evita confusione, ma soprattutto limita fortemente la
ridondanza.
La prima è la Connected Limited Device Configuration (CLDC), essa è rivolta a
dispositivi piuttosto limitati, piccoli e di solito wireless, quali, ad esempio, telefoni
cellulari e PDA con limitate caratteristiche hardware.
La seconda configurazione è la Connected Device Configuration (CDC), che si rivolge
ai dispositivi aventi risorse tali da poter essere in grado di supportare un ambiente Java
quasi completo. La CDC rappresenta, quindi, una alternativa per quei dispositivi, come
navigatori satellitari o PDA di ultima generazione, che hanno maggiore capacità in
termini di memoria e velocità di elaborazione. I dispositivi che utilizzano la CDC hanno
inoltre la caratteristica di non dover essere necessariamente limitati dal punto di vista
dell’alimentazione ed hanno, in genere, una larghezza di banda consistente.
1.3.1 Confronto tra le configurazioni
La CDC è stata implementata mediante la realizzazione di API che formassero un
insieme più ampio che include l’insieme delle API della configurazione CLDC. Tale
scelta favorisce la portabilità delle applicazioni CLDC-based, infatti se si intende
portare un programma da CLDC a CDC, non è necessario modificare il codice
dipendente dalla configurazione.
CDC nasce, a sua volta, come un sottoinsieme dell’intero J2SE environment, differendo
da esso principalmente per l’assenza di vere e proprie API client-specific (AWT). In
aggiunta vi sono però classi addizionali, nel package javax.microedition, allo scopo di
fornire codice specifico per i client mobili.
La figura 1.2 mostra le relazioni di inclusione e di non appartenenza discusse, mediante
approccio insiemistico.
12
J2SE
CDC
CLDC
Figura 1.2 – Relazione tra gli environment CLDC, CDC, J2SE: da intendersi in senso lato.
CDC offre, come già detto, un ambiente Java quasi completo. Di seguito sono riportati
alcuni package di J2SE 1.3 non presenti nella configurazione CDC:
ü java.applet
ü java.awt.*
ü java.rmi.*
ü java.sql
ü javax.sound.*
ü javax.swing.*
Alcuni package non presenti nelle configurazioni sono forniti con i profili, mentre le
funzionalità tipo AWT sono incapsulate in profili specifici di interfaccia. Uno degli
equivoci più comuni è affermare che nella configurazione CDC sono presenti tutte e
sole le funzionalità di base che si trovano in J2SE. Niente di più falso: molti package
della configurazione CDC sono stati ridotti in numero di classi e in complessità di
queste ultime, l’environment CDC è più completo rispetto a quello offerto da CLDC,
ma resta sempre ottimizzato per poter afferire ad un ambito limitato.
1.3.2 Dettagli di CLDC
Le API appartenenti alla configurazione CLDC, sono state prodotte, come già
accennato, mediante un processo di riduzione delle API standard di J2SE, basato
sull’eliminazione e sulla ottimizzazione in termini di complessità. Nessuna classe e
nessun metodo sono stati aggiunti alle API base che la configurazione condivide con
13
J2SE, mentre il codice specifico, per CLDC , è stato inserito nel package
javax.microedition, proprio di J2ME.
CLDC ha due obiettivi supplementari, specifici per le famiglie di dispositivi cui è
destinata. Infatti molti di questi dispositivi, tra cui i telefoni cellulari, sono stati a lungo
limitati dalle funzionalità iniziali fornite con il device al momento della vendita, stiamo
parlando dell’OEM (Original Equipment Manufacturer). Un primo obiettivo è, quindi,
aggiungere flessibilità ad un dispositivo, in modo da adattarlo ai nuovi bisogni dei suoi
utilizzatori. Ciò rimuove i confini concernenti la staticità delle funzionalità del
dispositivo ed offre un concreto sbocco al concetto di updating.
Il secondo obiettivo è una diretta conseguenza del primo ed è il nascere di terze parti in
grado di sviluppare applicazioni per i dispositivi che supportino la configurazione
CLDC, creando di fatto un modo per accedere ad un mercato precedentemente
irraggiungibile.
A guidare la selezione di una configurazione, per una famiglia di dispositivi, sono le
capability della stessa che prescindono da fattori, quali ad esempio, l’interfaccia utente.
I requisiti di base, che un dispositivo deve possedere per supportare la CLDC, sono
davvero esigui se confrontati con quelli posseduti da un desktop computer, tra i
principali possiamo elencare i seguenti:
•
da un minimo di 160kb fino a giungere a 512kb di memoria totale;
•
processori a 16 o 32 bit con un clock di almeno 16MHz;
•
128kb di memoria non volatile destinata a contenere la JVM e le librerie CLDC;
•
32kb di memoria volatile per il Java Runtime, questo include lo stack e ogni
applicazione caricata a tempo di esecuzione;
•
bassi consumi e alimentazione a batterie;
•
connessione di rete, di solito wireless, che può essere intermittente e con vincoli
di banda stringenti (anche meno di 9600bps).
Il fattore chiave è la memoria: essa definisce i confini tra le famiglie di dispositivi che
usano la configurazione CLDC e quelle che usano la CDC.
La natura limitata della configurazione CLDC impone alcuni vincoli sia sul linguaggio
Java, sia sulla macchina virtuale, su cui poggia la configurazione stessa. Esploriamo, di
seguito, tali limitazioni nel dettaglio.
14
1.3.2.1 Differenze di linguaggio
La sintassi del linguaggio Java è rimasta invariata, le differenze nel linguaggio
riguardano principalmente la riduzione e l’eliminazione delle API. Riportiamo di
seguito queste ultime:
o Gruppi di thread: il supporto ai thread continua ed essere fornito e anzi, risulta
essere particolarmente utilizzato sui piccoli dispositivi. Ciò che è stato
sottoposto ad eliminazione è il supporto ai gruppi di thread, anche perché la
limitata natura del device consente di supportare generalmente solo pochi
thread.
o Oggetto finalization: in ogni classe in ambiente Java standard, è possibile
definire un metodo finalize, il quale, un istante prima che l'oggetto venga
eliminato dal garbage collector, è richiamato dalla JVM per rilasciare ogni altra
risorsa allocata all’oggetto oltre alla memoria (ad esempio file aperti o
connessioni socket). Tale funzionalità è stata rimossa poiché complica
notevolmente il processo di garbage collection.
o Weak references: tali funzionalità consentono al programmatore di segnalare alla
JVM che un dato oggetto può essere sottoposto a garbage collection. Anch’esse
sono state eliminate poiché complicano la garbage collection.
o Numeri floating-point: gli oggetti floating-point, double e float, sono stati
rimossi nella configurazione CLDC. Questo può sembrare strano, ma c’è da
osservare che, il supporto ai numeri floating-point è assente nella maggior parte
dei piccoli device e che, una emulazione software, sarebbe troppo costosa.
o Serialization: essa consente la conversione di un oggetto Java residente in
memoria, in una successione di byte. Tale tecnica è molto utilizzata quando
occorre trasferire oggetti attraverso la rete. Gli oggetti che possono essere
serializzati implementano l’interfaccia serializable ed includono solo oggetti che
sono
dichiarati
come
serializzabili.
Nella
configurazione
CLDC
la
serializzazione non è possibile poiché necessita di API a loro volta eliminate.
Conseguentemente funzionalità dipendenti dalla serializzazione, quali ad
esempio la RMI, sono assenti nella CLDC.
o Java Native Interface: la JNI fornisce un approccio standardizzato per accedere
a librerie e applicazioni native. La richiesta di memoria, necessaria per tale
funzionalità, preclude la sua implementazione nei dispositivi CLCD-based.
15
o Reflection: Le reflection API forniscono un modo molto flessibile per esaminare
oggetti e interagire con essi a runtime. Esse generano meta-informazioni e
consentono ad un programma di interagire dinamicamente con oggetti atempo di
esecuzione. La reflection è particolarmente utile per quei programmi, tipo
debugger, che hanno bisogno di esaminare a tempo di esecuzione lo stato degli
oggetti in memoria. E’ immediato osservare che la reflection aggiunge un
overhead consistente e per questo è stato sottoposta ad eliminazione.
o Eccezioni ed errori: il supporto alle eccezioni e agli errori è presente nella
CDLC, ma il loro numero è stato ridotto come conseguenza dell’eliminazione di
parte delle API. Le classi rimaste continuano a lanciare le stesse eccezioni e
sotto le stesse condizioni, questo per favorire la compatibilità tra J2SE e J2ME.
o AWT e Swing: tutte le API di interfaccia utente sono state rimosse nella
configurazione CLDC: Graphical User Interface API, sono state progettate per
specifiche famiglie di device, nei vari profili.
o Collections: pur implementando le classi Hashtable, Vector, Stack ed
Enumeration , la CLDC non fornisce le API per tutte le collezioni di oggetti,
data la loro vastità.
o Networking e I/O: la configurazione CLDC non fa nessuna assunzione riguardo
la natura delle connessioni di rete, per cui molte networking API non sono
incluse in tale configurazione. Al loro posto è stato introdotto un framework di
connessione generica.
o Sicurezza: il modello di security della J2SE è molto complesso, richiede molto
spazio fisico e consistente tempo di CPU, per tale motivo le security API hanno
subito una drastica riduzione. Quest’ultima ha portato all’impiego di un modello
di sicurezza in J2ME semplificato che prende il nome di sandbox model.
1.3.2.2 Differenze nelle Virtual Machine
Molti dei cambiamenti della configurazione CLDC, sono il risultato delle limitazioni
imposte dal tipo di dispositivo e dalle capability dei livelli sottostanti. La macchina
virtuale, di conseguenza, è stata modificata per aderire al modello semplificato.
Analizziamo i cambiamenti:
o Nessun class loader definito dall’utente: le classi Java sono caricate a runtime
mediante class-loader. La VM possiede un class-loader di default ma, in J2SE,
16
è possibile creare un loader costruito interamente in Java. Quest’ultimo può
essere caricato dal loader di default ed essere utilizzato per caricare le classi in
modo ottimizzato. Nell’environment J2ME ciò non è consentito, inoltre il classloader di default non consente il caricamento di quegli oggetti che tentano di
fare l’override delle API base.
o Assenza di verifica dei classfile: ogni classfile Java, caricato dalla macchina
virtuale, è sottoposto a verifica prima di essere utilizzato. Tale azione assicura la
correttezza del bytecode e previene tentativi di caricare codice malizioso. Per
diminuire l’overhead conseguente, il processo di verifica è stato ottimizzato
grazie all’utilizzo di un preverificatore.
o Nessun supporto diretto per il Java environment/application setup: la CLDC non
fornisce supporto alcuno per il controllo dell’installazione di nuove applicazione
e per la loro esecuzione. Tale supporto è invece realizzato in un modo devicespecific dipendente, quindi, dall’implementazione J2ME per il dato device.
L’Application Management Software (AMS) abilita l’utente finale a caricare,
eseguire e rimuovere applicazioni J2ME sul dispositivo su cui è installato
o Preloading e prelinking: le classi possono essere prelinkate e immagazzinate su
memoria non volatile per un caricamento più veloce.
17
In tabella 1.3 sono illustrati i packages facenti parte della configurazione CLDC,
accompagnati da una breve descrizione.
Package
Funzione
java.io
Consente la lettura e la scrittura dei flussi di di
classi:
11
interfacce: 5
eccezioni: 5
java.lang
classi:
I/O. Non supporta le classi BufferedStream ma
fornisce 5 implementazioni delle classi astratte
InputStream e OutputStream.
Fornisce classi che sono il cuore del linguaggio
15
interfacce: 1
Java. Nel package sono inclusi gli oggetti
System, Thread e Runtime e la classe Math.
eccezioni: 19
java.util
classi:
Contiene utility per la manipolazione delle
7
interfacce: 1
informazioni di data e ora e supporta le Java
Collection di base.
eccezioni: 2
javax.microedition.io
E’ l’unico package specifico: implementa
classi:
classi supplementari di I/O e fornisce le
1
interfacce: 8
funzionalità del package java.net di J2SE.
eccezioni: 1
Tabella 1.3 – I package di CLDC v.1.0 (JSR-30 – Release maggio 2000).
1.3.3 Dettagli di CDC
La configurazione CDC è rivolta a quei dispositivi maggiormente performanti rispetto
ai dispositivi a cui è rivolta la CLDC, come ad esempio i PDA di ultima generazione.
Anche la CDC ha un insieme di API che è stato sottoposto a riduzione, ma include una
vasta collezione di classi derivanti dall’ ambiente J2SE. La configurazione CDC si
propone, quindi, di colmare il gap esistente tra la CLDC e la versione standard di Java,
mantenendo la piena compatibilità verso il basso, attraverso la riproposizione di tutte le
classi della configurazione CLDC.
E’ importante tener presente che CDC è stata progettata rivolgendo particolare
attenzione all’interoperabilità con Personal Java. In tal modo, le applicazioni che
correntemente girano su Personal Java, possono essere facilmente trasportate
nell’environment CDC, mediante utilizzo di profili appropriati.
18
I requisiti di base, che un dispositivo deve possedere per supportare la CDC si possono
riassumere, nei seguenti:
•
Più di 2Mb di memoria totale disponibile per il Java environment;
•
Processori a 32 bit
•
Connessione di rete, spesso wireless, che può essere intermittente e con vincoli
di banda non molto stringenti.
•
Una Java Virtual Machine completa, che supporti tutte le funzionalità standard.
Così come la CLDC è generalmente accoppiata al profilo MIDP, di cui parleremo tra
breve, la CDC si accompagna ad un profilo che complementa la sua configurazione
base. Tale profilo, il foundation profile, non include le GUI API che sono viceversa
fornite a mezzo di profili opzionali. La configurazione CDC è distribuita assieme alla
CVM (C Virtual Machine). Essa è una JVM completa, supporta tutte le funzionalità
tipiche di ogni JVM standard ed è perciò profondamente diversa dalla KVM.
Conseguenza dell’impiego della CVM è il fatto che i vincoli sulla CDC riguardano solo
il linguaggio e non la virtual machine.
1.3.3.1 Differenze di linguaggio
Anche nella configurazione CDC la sintassi del linguaggio Java è rimasta invariata, le
differenze di linguaggio, dovute al processo di riduzione delle API, sono, in tale
configurazione, più esigue che nella CLDC. Di seguito sono riportate le principali
differenze tra le due configurazioni in merito al linguaggio. Anticipiamo il fatto che
molte delle limitazioni presenti in CDLC non hanno ragione di esistere in tale ambito:
o Gruppi di thread: poiché i requisiti minimi dei dispositivi che supportano la
configurazione CDC, sono considerevolmente più robusti, rispetto al caso dei
dispositivi CLDC-based, i gruppi di thread prendono posto in tale
configurazione.
o Oggetto finalization: la finalization era stata rimossa dalla CLDC per via
dell’overhead insostenibile per i dispositivi cui la configurazione era destinata e
perché complicava la garbage collection da parte della sottostante JVM. Visto
che la CDC è rivolta a dispositivi più performanti e che la macchina virtuale su
19
cui poggia è conforme allo standard Java per le JVM, la configurazione CDC
supporta l’oggetto finalization.
o Weak references: la CDC rimuove tale limitazione e anzi, supporta l’intero
package java.lang.ref che contiene, tra l’ altro, la weak reference.
o Numeri floating-point: diversamente da quanto accade per la CLDC, il supporto
ai numeri floating-point è fornito nella CDC. Questo grazie alle maggiori
potenzialità disponibili nei dispositivi a cui è rivolta la configurazione e
all’impiego della CVM, la quale supporta i tipi double e float.
o Serialization: la serializzazione non è stata sacrificata all’interno della
configurazione CDC. Tale funzionalità è, anzi, necessaria in una architettura più
flessibile rispetto alla CLDC e la sua implementazione è resa possibile grazie
alle caratteristiche fisiche dei dispositivi cui la configurazione CDC stessa è
rivolta.
o Java Native Interface: la configurazione CDC implementa la JNI, ma non solo.
Essa supporta anche altre interfacce quali l’ interfaccia di debug (JVMDI) e la
profiling interface (JVMPI). Queste tre interfacce, si basano su interfacce C e
poiché la CVM del livello sottostante è scritta in C, il loro mantenimento nella
configurazione è stato possibile.
o Reflection: la configurazione CDC supporta le reflection API, diversamente da
quanto accade nella CLDC. Tali API sono contenute nel package
java.lang.reflect.
o Eccezioni ed errori: in CDC sono contenuti errori ed eccezioni in numero minore
rispetto al J2SE environment. Tale numero è, d’altra parte, maggiore rispetto al
caso CLDC, ciò è una conseguenza del maggior numero di API che trovano
posto in tale configurazione.
o AWT e Swing: così come accade per la CLDC, le API di interfaccia utente sono
state rimosse nella configurazione CDC: il compito è delegato ai profili. Come
vedremo tra breve, il Personal Profile prevede le stesse funzionalità presenti in
Personal Java, tra cui l’implementazione di API AWT-based.
o Collections: nella configurazione CDC è presente un supporto completo alle
collezioni di oggetti.
o Networking e I/O: la CDC contiene un insieme di I/O API molto più espanso
rispetto alla CLDC. Inoltre è implementato un sottoinsieme delle API del
package java.net di J2SE. CLDC fornisce il solo package javax.microedition.
20
o Sicurezza: è presente in CDC il modello di security della J2SE, anche se,
ovviamente, in forma ridotta. La CLDC, diversamente, supporta solo un modello
semplificato di sicurezza.
In tabella 1.4 sono illustrati i package facenti parte della configurazione CDC insieme
con una breve descrizione delle funzionalità che questi offrono:
Package
java.io
Funzione
Consente la lettura e la scrittura dei flussi di di I/O.
Tale package contiene molte delle classi omesse in
CLDC.
classi:
36
interfacce: 10
eccezioni: 16
java.lang
Fornisce classi che sono il cuore del linguaggio Java.
Nel package sono inclusi gli oggetti System, Thread
e Runtime. Inoltre sono incluse le classi Double e
Float.
Contiene i reference types tra cui weak refernces.
classi:
30
interfacce: 3
eccezioni: 24
java.lang.ref
classi:
5
interfacce: 0
eccezioni: 0
java.lang.reflect
Fornisce le API di reflection
classi:
8
interfacce: 2
eccezioni: 2
java.math
Contiene la sola classe BigInteger e i metodi per
lavorare con oggetti del tipo BigInteger.
classi:
1
interfacce: 0
eccezioni: 0
java.net
Sottoinsieme dell’omonimo package di J2SE.
Consente
connessioni
http
url-based
e
comunicazioni connectionless con datagrammi.
classi:
12
interfacce: 5
eccezioni: 6
java.security, java.security.cert
Supporta le funzionalità di sicurezza
classi:
21
interfacce: 6
eccezioni: 13
java.text, java.text.resources
classi:
11
interfacce: 0
eccezioni: 1
java.util,
java.util.zip
Fornisce caratteristiche di internazionalizzazione per
il supporto di lingue multiple
java.util.jar, Contiene ultilities per la manipolazione di data e ora
e implementa le java collections di base.
classi:
44
interfacce: 11
eccezioni: 7
javax.microedition.io
Implementa classi supplementari di I/O
classi:
1
interfacce: 8
eccezioni: 1
Tabella 1.4 – I packages di CLC v.1.0 (JSR-36 – Release marzo 2001).
Allo scopo di dare un’idea al lettore di quanto siano distanti le configurazioni CLDC e
CDC, dalle API base dell’ambiente J2SE, riportiamo di seguito la tabella 1.5 che mostra
21
i package di J2SE v.1.3.1, di CLDC v.1.0 e CDC v.1.0. Per ciascun package è indicato
il numero di classi, di interfacce e di eccezioni:
J2SE
CDC
CLDC
Package
C
I
E
C
I
E
C
I
E
java.io
50
10
16
36
10
16
11
2
5
java.lang
31
3
24
30
3
24
15
1
19
java.lang.ref
5
-
-
5
-
-
-
-
-
java.lang.reflect
8
2
2
8
2
2
-
-
-
java.math
2
-
-
1
-
-
-
-
-
java.net
21
6
8
12
5
6
-
-
-
java.security
39
9
15
19
6
11
-
-
-
java.security.cert
8
1
6
2
-
2
-
-
-
java.text
20
2
1
11
-
1
-
-
-
java.util
36
13
5
32
11
4
7
1
2
java.util.jar
7
-
1
6
-
1
-
-
-
java.util.zip
14
1
2
6
-
2
-
-
-
-
-
1
8
1
1
8
1
Javax.microedition.io -
Tabella 1.5 – Java Environment a confronto (C - Classi; I - Interfacce; E - Eccezioni).
22
1.3.4 I Profili nel dettaglio
Per disporre di un ambiente J2ME su di un particolare device, è necessario avere
almeno una virtual machine, una configurazione e un profilo. Profili opzionali possono
poi essere installati per offrire funzionalità aggiuntive.
I profili realizzano la specificità, necessaria all’ambiente, attraverso tre strade:
•
Fornendo il supporto alle GUI
•
Consentendo la persistenza
•
Implementando le Abstract Networking API, della configurazione sottostante.
Data la flessibilità che i profili conferiscono all’architettura J2ME, vi sono molteplici
progetti che sono stati portati a termine, per sposare le necessità di svariate famiglie di
dispositivi, e altri in corso d’opera.
Di seguito riportiamo alcuni profili CLDC – based, corredati da una breve descrizione:
o Mobile Information Device Profile (MIDP): è il primo reso disponibile dalla
Sun, esso fornisce la GUI ed altre funzionalità proprie dei dispositivi mobili,
quali i telefoni cellulari. Il MIDP è anche disponibile per i palmari PalmOS.
o Personal Digital Assistano Profile (PDAP): ancora in via di sviluppo, tale
profilo sostituirà il MIDP sui PDA, adattandosi all’hardware e alla interfaccia
utente propria dei palmari.
o Altre API: tra i profili opzionali per la configurazione CLDC, evidenziamo:le
API relative alla riproduzione di popolari formati audio: Mobile Media API
(JSR-135) ; le API per il supporto dello standard Bluetooth e le API USB
(Universal Serial Bus).
Elenchiamo ora alcuni profili basati sulla configurazione CDC:
o Foundation Profile: forma uno strato indispensabile per molti profili CDCbased. Tale profilo è il primo ufficialmente rilasciato dalla Sun per la
configurazione CDC.
o Personal Bases Profile: implementa le funzionalità di base per il Personal
Profile. Esso non fornisce compatibilità con l’ambiente Personal Java.
23
o Personal Profile: completa il Personal Bases Profile apportando piena
compatibilità con Personal Java.
o Altri profili: tra quelli opzionali citiamo il profilo RMI (Remote Method
Invocation), le Mobile Media API (JSR-135) e il Game Profile. Quest’ultimo
richiede l’impiego del Foundation Profile e non è stato ancora portato a termine.
1.3.4.1 Il profilo MIDP
Il Mobile Information Device Profile, è in assoluto il profilo più diffuso, essendo tra
l’altro orientato a dispositivi, come i telefoni cellulari, che hanno una diffusione quasi
capillare nei paesi industrializzati.
Le funzionalità che il MIDP apporta alla configurazione su cui poggia, la CLDC, si
possono riassumere nelle seguenti:
•
GUI di basso livello;
•
Persistenza;
•
Connettività di rete HTTP-based;
•
Supporto temporale alle applicazioni;
•
Gestione del ciclo di vita delle applicazioni (MIDlet).
Le API introdotte nel profilo, basate sull’implementazione delle precedenti aree chiave,
completano i package della CLDC e ne formano di nuovi.
I requisiti dei dispositivi che sposano il profilo MIDP sono quelli della configurazione
CLDC, in aggiunta essi devono avere:
•
Un piccolo display;
•
Un modo per fornire input al device, ad esempio una piccola tastiera o un touch
screen;
•
Memoria non volatile sufficiente a contenere, oltre alla macchina virtuale e alla
configurazione, anche il profilo. In realtà i 128k, indicati come requisito della
CLDC, possono essere sufficienti allo scopo;
•
Almeno 8k di memoria di memoria non volatile per l’archiviazione dei dati delle
applicazioni;
24
Nella tabella 1.6 sono riportati i package del profilo MIDP 1.0 con la sola descrizione
delle funzionalità aggiunte alla configurazione CLDC.
Package
Funzione
java.io
Invariata rispetto alla CLDC.
java.lang
Identica alla CLDC con la sola aggiunta dell’ eccezione
IllegalStateException.
java.util
Aggiunge i timer e un modo standardizzato per schedulare
task da eseguirsi in background o in maniera pianificata.
javax.microedition.lcdui
Fornisce GUI APIs high-level e low-level.
javax.microedition.rms
Il package Record Management System aggiunge il
supporto per la persistenza per le Midlet.
javax.microedition.midlet
Definisce l’interfaccia midlet.
javax.microedition.io
Aggiunge una connessione http.
Tabella 1.6 – Package inclusi nel profilo MIDP.
Dei precedenti, descriviamo solo il package che definisce l’interfaccia Midlet:
javax.microedition.midlet
Il termine MIDlet deriva da Mobile Information Device e dal termine Applet.
Quest’ultima si riferisce alla tecnologia web-based che per prima ha catalizzato
l’attenzione sul linguaggio Java.
Le midlet, quindi, devono il loro nome alla similitudine con le applet e come queste, le
interfacce MIDlet definiscono le classi necessarie per la gestione del ciclo di vita delle
applicazioni MIDP.
La partenza e la terminazione reale di una midlet non sono manipolate dall’utente finale:
così come accade per un’applet che è gestita da un web browser, esiste una applicazione
ospite che gestisce il ciclo di vita di una midlet. Tale applicazione è l’ Application
Manager Software (AMS), esso è platform-specific e interagisce con le midlet
attraverso i metodi definiti nell’interfaccia MIDlet.
25
L’AMS facilita l’interazione tra l’applicazione MIDP e il sottostante Java runtime,
attraverso la gestione del caricamento, l’inizializzazione e la terminazione delle midlet.
Questo
significa
che
le
responsabilità
del
programmatore
finiscono
con
l’implementazione della classe astratta MIDlet.
Il package javax.microedition.midlet definisce una sola classe: la Midlet class. Essa
contiene tutti i metodi, necessari all’ambiente Java del dispositivo, per lanciare,
sospendere e terminare tutte le midlet caricate. Attraverso l’interfaccia MIDlet è
possibile definire gli stati in cui la midlet stessa può trovarsi e fornire i callback method
all’ AMS che controlla le transizioni tra stati.
Gli stati in cui una midlet può trovarsi sono tipicamente: active, paused e destroyed.
Al momento della creazione di una midlet, essa si trova nello stato di pausa e in tale
stato ritorna ogni qualvolta l’AMS decide che la midlet non ha bisogno di essere attiva.
Si passa allo stato attivo, quando l’AMS chiama il metodo startApp della midlet. Infine,
quando una midlet non è più in memoria, il sistema di gestione chiama il metodo
destroyApp della midlet.
Una eccezione MIDletStateChangeException può essere lanciata se si verifica un errore
di transizione tra gli stati.
Active
pauseApp()
destryApp()
startApp()
Paused
Destroyed
constructor
Figura 1.3 – Ciclo di vita di una MIDlet: transizioni degli stati.
26
1.4 Sviluppo di applicazioni J2ME
Per sviluppare le applicazioni rivolte all’ambiente J2ME, ci si può avvalere dell’uso di
toolkit, disponibili gratuitamente su internet.
In tale ambito, riveste particolare
importanza il J2ME Wirelss Toolkit, messo a disposizione dalla Sun e reperibile al sito
http://java.sun.com/j2me/download.html.
La versione corrente del J2MEWT è la 2.0 che ha la particolarità di supportare il MIDP
2.0. Dalla pagina web precedente, è inoltre possibile scaricare le configurazioni e i
profili di interesse, al fine di costruire un ambiente J2ME completo e adatto ai propri
scopi.
Riportiamo di seguito i file che è possibile scaricare dal sito della Sun, in riferimento
alla tecnologia J2ME:
Wireless Toolkit
§
Wireless Toolkit 2.0
CLDC Technology
§
Connected Limited Device Configuration (CLDC) 1.1
§
Connected Limited Device Configuration (CLDC) 1.0.4
§
Mobile Information Device Profile (MIDP) 2.0
§
Mobile Information Device Profile (MIDP) 1.0.3
§
Optional Package
§
Mobile Media API for J2ME
§
Wireless Messaging API
CDC Technology
§
Connected Device Configuration (CDC) and Foundation Profile 1.0
§
J2ME Personal Basis Profile 1.0
§
J2ME Personal Profile 1.0
§
J2ME Personal Profile Runtime Environment
§
Optional Package
§
J2ME RMI Optional Package
27
Capitolo 2
Le Virtual Machine CDC
La configurazione CDC, Connected Device Configuration, è stata introdotta nell’ambito
del progetto modulare di J2ME, il quale è organizzato in configurazioni e relativi
profili.
Essa si rivolge ai quei dispositivi le cui caratteristiche hardware consentono di
supportare un ambiente Java completo, per cui l’insieme di API di CDC, pur essendo
stato sottoposto ad un processo di riduzione, include una vasta collezione di classi
derivanti dall’ ambiente J2SE. Tale configurazione, completata dall’insieme delle classi
contenute nei profili e da una JVM, costituisce un ambiente Java completo.
Per macchine virtuali CDC intendiamo quelle macchine che offrono un ambiente Javacompliant1 oppure un ambiente Java-based. Il primo si riferisce ad un ambiente
conforme allo standard Java della Sun. Il secondo, invece, si riferisce ad un ambiente,
destinato alla stessa classe di dispositivi a cui si rivolge la CDC, il cui linguaggio abbia
una sintassi Java ma le cui API siano completamente ridefinite e potenzialmente
incompatibili con le API standard di Java.
Nei paragrafi successivi descriveremo le seguenti macchine virtuali:
Java-compliant
ü Jeode PDA Edition;
ü CrEme versione 4.0
Java-based
ü SuperWaba versione 4.11
ü Ewe versione 1.3
1
la configurazione CDC è stata progettata rivolgendo particolare attenzione all’interoperabilità con
Personal Java.
28
2.1 Jeode
La prima piattaforma Jeode prodotta dalla Insigna, per i sistemi basati su WindowsCE,
supportava le specifiche Personal Java e Embedded Java della Sun. Essa ebbe infatti
superato i relativi test di compatibilità diventando una Java Virtual Machine autorizzata.
La macchina virtuale Jeode PDA Edition rappresenta invece, una implementazione
certificata della specifica Personal Java 1.2 di Sun.
La piattaforma fornisce un vero e proprio ambiente di sviluppo affiancando al Jeode
Runtime, alcuni tool di sviluppo che aiutano il programmatore nell’implementazione e
nella configurazione delle proprie applicazioni, in modo da aderire alle specifiche
imposte dalle limitazioni dei piccoli dispositivi. Il Runtime è composto dalla Virtual
Machine (EVM) e dall’insieme delle classi che l’ambiente fornisce.
2.1.1 Disponibilità
Il runtime di Jeode è disponibile per varie tipologie di processori e di sistemi operativi.
Tra i primi assumono rilievo: x86, MIPS, ARM, Hitachi SH e PowerPC. Mentre
l’insieme dei sistemi operativi che supportano il runtime, include tra gli altri:
WidowsCE, PocketPC, Linux, VxWorks, Windows, WindowsNT Embedded e Itron.
Infine il runtime è stato integrato, come plug-in, nei browser per WindowsCE,
PocketPC e WindowsNT Embedded, in modo da consentire il caricamento e
l’esecuzione delle applet Java.
29
2.1.2 Caratteristiche
Nella tabella 2.1, sono riportate alcune caratteristiche dell’ambiente Jeode, suddivise per
aree chiave:
Virtual Machine
Supportata da molte piattaforme hardware
Sofisticata combinazione di interpretazione e compilazione
Garbage Collection di tipo concorrente
Consente le creazione di librerie native C
Supporto completo ai thread, alle eccezioni, e ai tipi double e long
Input/Ouput
Supporto per il protocollo TCP/IP, UDP
Supporto per serial port, socket API
User Interface
Supporto per le AWT
Tabella 2.1 – Caratteristiche salienti della piattaforma Jeode.
Le caratteristiche di maggiore interesse della piattaforma, sono quelle che riguardano la
macchina virtuale. La Jeode Embedded Virtual Machine (EVM) ottimizza le prestazioni
delle applicazioni attraverso:
ü una speciale tecnica di generazione del codice nativo;
ü un’implementazione concorrente della garbage collection.
ü un’implementazione completa dei thread (green model).
La macchina virtuale realizzata dalla Insigna implementa una tecnologia ADC, Adaptive
Dynamic Compilation. Essa prende spunto dalla tecnologia di compilazione JIT (Just In
Time), ma differisce da essa in quanto richiede meno memoria, non fa uso di memoria
virtuale e compila dinamicamente solo il codice che rappresenta il corrente collo di
bottiglia per le prestazioni dell’applicazione, cioè solo il codice ritenuto critico per il
programma in esecuzione. La restante parte di codice è tradotto mediante
interpretazione, come mostrato in figura 2.1.
30
Figura 2.1 – La tecnologia ADC implementata da Jeode.
Quando un’applicazione viene lanciata, la traduzione del codice è realizzata mediante
interpretazione, in tal modo, rispetto alla compilazione JIT, si riduce il tempo di startup. Successivamente la macchina virtuale determina i segmenti di codice che occorrono
più di frequente, li compila e li memorizza in un buffer di memoria.
La garbage collection è cruciale in quanto, tale è la gestione della memoria, specie per i
dispositivi aventi consistenti limitazioni hardware. La Jeode EVM implementa una
tecnologia concorrente che è in grado, tra l’altro, di evitare la frammentazione della
memoria. La realizzazione del garbage collector è realizzata attraverso un thread
prelazionabile, così come la realizzazione del compilatore dinamico-adattativo.
Infine resta da evidenziare il fatto che a ciascun thread Java, la macchina virtuale fa
corrispondere un thread di basso livello nei sistemi operativi real-time, fornendo
integrazione con i thread nativi e sinergia con lo schedulatore del sistema operativo.
Java Thread X
Java Thread Y
RTOS
Task A
Task B
Task C
Figura 2.2 – Java thread su un sistema operativo real-time (RTOS).
31
2.1.3 Ciclo di Sviluppo
Il ciclo di sviluppo di un’applicazione, destinata ad essere eseguita sulla macchina
virtuale Jeode, coincide in pratica, con quello di un’applicazione destinata al Java
runtime.
Di conseguenza è necessario disporre dell’ambiente di sviluppo Java (JDK), sulla
propria macchina [J2SE].
Il ciclo di sviluppo può, quindi, espletarsi nei seguenti passi:
•
Generazione del codice sorgente, della propria applicazione, mediante un editor
di testo o un qualsiasi tool di sviluppo. Bisogna comunque avere l’accortenza di
utilizzare le API messe a disposizione dell’ambiente.
•
Compilazione del file sorgente, attraverso il compilatore java ed eventualmente,
archiviazione delle classi in un archivio “jar”.
•
Creazione del link per l’esecuzione dell’applicazione sulla macchina virtuale.
•
Installazione dei file dell’applicazione, sul dispositivo palmare.
.
32
2.1.4 Le API di Jeode
Le librerie di classi della piattaforma Jeode, che costituiscono le core API, sono quelle
definite nella specifica Personal Java 1.2 e sono descritte in tabella 2.2. Per una
descrizione dettagliata, si rinvia alla documentazione ufficiale, disponibile sul sito della
Sun.
java.lang
Fornisce le classi core del linguaggio Java.
java.util
Contiene classi di utilità.
java.io
Classi base per l’I/O.
java.net
Fornisce un’infrastruttura flessibile per il networking.
java.util.zip
Classi per la compressione e la decompressione dei dati.
java.lang.reflect
Consente ai programmi Java di ispezionare e manipolare oggetti a
runtime.
java.math
Fornisce i tipi long, float e double.
java.text
Consente la conversione di numeri, data e ora.
Java.rmi
Remote Method Invocation
java.security
Contiene le classi per la crittazione e la computazione di firme digitali
java.sql
Fornisce le classi per la gestione delle interrogazioni ai database.
java.applet
Supporto per l’implementazione delle applet Java
java.awt
Abstract Window Toolkit
Tabella 2.2 – Classi base della piattaforma Jeode.
33
2.2 CrEme
CrEme è una macchina virtuale prodotta dalla NSICom e rappresenta la versione CE di
JSCP, una macchina virtuale Java sviluppata per i sistemi operativi real-time.
Il runtime di CrEme è basato sulla configurazione CDC di J2ME della Sun, corredata
dai profili Foundation Profile e Personal Profile, quindi CrEme è pienamente
compatibile con la specifica Personal Java.
Anche CrEme, così come Jeode, fornisce un vero e proprio ambiente di sviluppo
affiancando al runtime, alcuni tool che aiutano il programmatore nell’implementazione
delle proprie applicazioni, in modo da aderire alle specifiche imposte dalle limitazioni
dei piccoli dispositivi. In particolare è disponibile un emulatore della macchina virtuale
CrEme per computer desktop.
2.2.1 Disponibilità
Il runtime di CrEme è disponibile per varie tipologie di processori e di sistemi operativi.
Tra i primi assumono rilievo: x86, MIPS, ARM, SH3, XSCALE e PowerPC. Mentre
l’insieme dei sistemi operativi che supportano il runtime, include tra gli altri:
WidowsCE, PocketPC, WidowsCE.net, per i restanti è comunque disponibile la Virtual
Machine JSCP.
34
2.2.2 Caratteristiche
Nella tabella 2.3, sono riportate alcune caratteristiche dell’ambiente CrEme, suddivise
per aree chiave:
Virtual Machine
Supportata da molte piattaforme hardware
generazione del codice nativo basata sulla tecnologia Just In Time
Garbage Collection di tipo asincrona
Consente le creazione di librerie native C
Supporto completo ai thread, alle eccezioni, e ai tipi double e long
Input/Ouput
Supporto per il protocollo TCP/IP, UDP
Supporto per serial port, socket API.
User Interface
Truffle (default), tinyAWT, package opzionale Swing
Tabella 2.3 – Caratteristiche salienti della piattaforma CreMe.
Gli aspetti di maggiore interesse della CreMe Virtual Machine sono i seguenti:
ü tecnica di generazione del codice nativo basata sulla tecnologia Just In Time;
ü implementazione asincrona della garbage collection.
ü implementazione dei thread secondo un modello definito “blue threads”
[JSCPTM].
La macchina virtuale CreMe implementa, per la generazione del codice nativo, una
tecnologia JIT (Just In Time), chiamata JBooster; che è in grado di limitare la
compilazione alle porzioni di codice più rilevanti all’interno dei metodi. JBooster
aggiunge in media tra i 100KB e i 200KB ai requisiti di memoria di CreMe, a favore di
un significativo aumento delle prestazioni.
Il garbage collector è implementato attraverso un thread con tre livelli di priorità:
green, yellow e red. Quando i requisiti di memoria sono blandi, il thread in questione
viene eseguito con una bassa priorità, green, e non è prevista alcuna compattazione per
arginare il fenomeno della frammentazione della memoria; al diminuire della
35
disponibilità di memoria il thread cambia la sua priorità diventando yellow; infine
quando la situazione diventa critica il thread assume la priorità più alta, red, ed effettua
la compattazione della memoria. Il motivo di tale soluzione tecnica deriva dal modello
di gestione dei thread, denominato blue threads.
Il modello blue threads prevede che tutti i thread Java siano incapsulati nella Virtual
Machine. Ciò vuol dire che la macchina virtuale CreMe, unitamente a tutte le
applicazioni Java che girano su di essa, sono trattate dal sistema operativo real-time
come un unico task. Uno scenario di tale situazione è mostrato in figura 2.3.
Java Thread X
Java Thread Y
CrEme Task
RTOS
CrEme
Kernel
OS Task A
OS Task B
Java Thread Z
Java Thread U
Java Thread V
OS Task C
OS Task D
Figura 2.3 – Il modello dei thread della piattaforma CreMe.
In altre parole non c’è una corrispondenza biunivoca tra i thread del sistema operativo e
i thread Java, per cui la gestione e la schedulazione di questi ultimi è a carico della
macchina virtuale.
In particolare lo schedulatore di CreMe è senza prelazione ed usa una tecnica di polling.
Esso interroga ciclicamente un timer al fine di determinare la terminazione di un quanto
di tempo. Ciò rende la macchina virtuale più piccola e meno complicata, dal momento
che i cambi di contesto avvengono in istanti di tempo ben determinati e conosciuti dallo
schedulatore, per cui non sono necessari meccanismi di protezione del codice.
36
2.2.3 Ciclo di Sviluppo
Il ciclo di sviluppo di un’applicazione, destinata ad essere eseguita sulla macchina
virtuale CreMe, è molto simile a quello di un’applicazione destinata al Java runtime e
coincide, in pratica, con il ciclo di sviluppo di Jeode.
È necessario anzitutto disporre dell’ambiente di sviluppo Java (JDK), sulla propria
macchina.
Il ciclo di sviluppo può, quindi, espletarsi nei seguenti passi:
•
Generazione del codice sorgente, della propria applicazione, mediante un editor
di testo o un qualsiasi tool di sviluppo. Bisogna comunque avere l’accortenza di
utilizzare le API messe a disposizione dell’ambiente.
•
Compilazione del file sorgente, attraverso il compilatore java ed eventualmente,
archiviazione delle classi in un archivio “jar”.
•
Creazione del link per l’esecuzione dell’applicazione sulla macchina virtuale.
•
Installazione dei file dell’applicazione, sul dispositivo palmare.
37
2.2.4 Le API di CreMe
Le librerie di classi della piattaforma CrEme includono quelle definite nelle specifiche
di Personal Java e offrono, come package opzionale, il supporto alle Swing:
java.lang
Fornisce classi core del linguaggio Java.
java.util
Contiene classi di utilità.
java.io
Classi base per l’I/O.
java.net
Fornisce un’infrastruttura flessibile per il networking.
java.util.zip
Classi per la compressione e la decompressione dei dati.
java.lang.reflect
Consente ai programmi Java di ispezionare e manipolare oggetti a
runtime.
java.math
Fornisce i tipi long, float e double.
java.text
Consente la conversione di numeri, data e ora.
Java.rmi
Remote Method Invocation
java.security
Contiene le classi per la crittazione e la computazione di firme digitali
java.sql
Fornisce le classi per la gestione delle interrogazioni ai database.
java.applet
Supporto per l’implementazione delle applet Java
java.awt
Abstract Window Toolkit
javax.swing
Swing v 1.1.1 (package opzionale)
Tabella 2.4 – Classi base della piattaforma CrEme.
38
2.3 SuperWaba
SuperWaba è una piattaforma Open Source, nata da un progetto brasiliano e finalizzata
allo sviluppo di applicazioni destinate ai palmari,. La sua realizzazione risale agli inizi
del 2000 e rappresenta un’estensione di Waba, una progetto anch’esso open source,
nato inizialmente per applicazioni sui telefoni cellulari e successivamente destinato al
mercato dei PDA.
La piattaforma SuperWaba definisce un linguaggio, una macchina virtuale, un formato
per i class file e un insieme di classi base.
Il linguaggio ha una sintassi Java, di conseguenza gli sviluppatori possono utilizzare il
tool di sviluppo che preferiscono. Sfortunatamente le API di SuperWaba hanno poco in
comune con le API standard di Java, anzi, è necessario precisare che SuperWaba non ha
alcuna relazione con la Sun e non implementa nessuna delle specifiche di Java. Questo
può sembrare, a primo impatto, un consistente freno alla diffusione di SuperWaba, ma
c’è da considerare il fatto che anche le API di J2ME derivano da un processo di
riduzione delle API standard di Java. Ciò è indispensabile date le caratteristiche limitate
dei piccoli dispositivi e obbliga, in ogni caso, il programmatore a conoscere i
sottoinsiemi che derivano da tale processo di riduzione.
Sono molte le ragioni della diffusione di SuperWaba , tra queste spicca il fatto che la
piattaforma è rilasciata con la licenza GNU LGPL che consente, tra l’altro, ai
programmatori di sviluppare applicazioni per fini commerciali.
39
2.3.1 Disponibilità
SuperWaba sposa il concetto “write once, run anywhere ” che ha permesso la diffusione
a larga scala di Java. Le applicazioni realizzate mediante tale piattaforma, possono
essere eseguite sui dispositivi basati su PalmOS e su quelli basati su WindowsCE,
inoltre è possibile anche l’esecuzione su computer desktop, mediante emulatori, e sui
web browser, mediante applet.
Di seguito è riportata una lista di dispositivi su cui è stato verificato il corretto
funzionamento di SuperWaba2:
PalmOS devices
•
AlphaSmart: Dana, Dana.wireless
•
Handspring: Treo 180, Visor Pro (PalmOS 3.5), Visor Platinum, Visor Prism,
Treo 600
•
Palm:
o
Professional, III, IIIx, IIIc, IIIe, V, Vx
o
M105, M500, M505, M515, M125, Palm 130
o
Zire, Zire 71, Zire21
o
Tungsten C, Tungsten W, Tungsten T, Tungsten T2, Tungsten T3,
Tungsten E
•
Samsung: SPH-I330, Kyocera Smartphone 6035, Kyocera 7135
•
Sony CLIE: S300, T-615, S360, TG50, N770C/E, NX70V, NX60, SJ30, SL10,
SJ33, SJ20
•
Symbol: SPT 1500, 1550 and 1700
2
L’assenza di un particolare modello nella lista, non vuol dire che SuperWaba non sia istallabile su di
esso.
40
Windows CE/PocketPC device
•
Compaq: iPaq 3670, iPaq H3970, iPaq 3900, iPaq 2210, iPaq 1910, Pocket PC
Aero 1550
•
Dell: Axim A5, Axim X5
•
HP: Jornada 540 (SH3), Jornada 680/690
•
HTC: Falcon
•
Symbol: PDT8100 (Pocket PC 3.0), PDT8146 (Pocket PC 2002)
•
Toshiba: e350 Intel PXA
•
Vandem: Clio (HPC 2.11) - Installazione manuale, file per MIPS
•
ViewSonic: V35, V37
32-bit Windows
•
Windows 98
•
Windows NT
•
Windows XP
•
Windows 2000
Linux
•
Mediante WINE (Windows Emulator)
41
2.3.2 Caratteristiche
Nella tabella 2.5, sono riportate le principali caratteristiche dell’ambiente SuperWaba,
suddivise per aree chiave:
Virtual Machine
Supportata da molte piattaforme hardware
Consente le creazione di librerie native C
Supporto Unicode
Supporto per i display grayscale (Palm OS 2.0 and up) e colore. Alta risoluzione in tutti i PDA
Supporto ai thread, alle eccezioni, e ai tipi double e long
Extension libraries
Classi per la visualizzazione di informazioni GPS, basate sul protocollo Garmin GPS
Supporto per la lettura dei formati di file PalmoDoc e PalmZip
Supporto per gli algoritmi di crittografia: Blowfish, MD5, SHA1, TEA
Personal Information Abstract Layer (PIMal) : fornisce accesso ai dati PIM su Pocket PC e Palm OS
Game API, che supportano Sprites, buttoni animati, etc.
Input/Ouput
Supporto per il protocollo TCP/IP, serial port, USB, InfraRed, Bluetooth.
Supporto per Secure Digital e Memory Stick card
Supporto per il formato file PDB su Pocket PC, ciò rende i database Palm intercambiabili tra le piattaforme
Database Connectitivity Specification(WDBC): driver per IBM Db2e e PDB SQL manipulation (PDB Driver)
Capabilities di stampa.
User Interface
Due differenti stili per Palm OS e Windows CE.
In entrambi gli stili, tutti i controlli posseggono lo stato di visible e disable
Finestre di popup trascinabili
Posizionamento relativo
Tabella 2.5 – Caratteristiche salienti del SuperWaba Development Kit (SuperWaba SDK).
42
Una caratteristica che va approfondita riguarda la gestione dei thread realizzata da
SuperWaba. La piattaforma implementa un modello molto semplificato dei thread,
infatti essi sono senza prelazione e non forniscono alcun tipo di concorrenza.
Il modello prevede che il metodo run venga invocato ogni volta che il sistema è in stato
di Idle. Una importante conseguenza di tale scelta implementativa è che il metodo run
deve essere il più semplice e veloce possibile, pena il degrado delle prestazioni del
piccolo device o addirittura il blocco della macchina virtuale. Ciò significa che la
semantica del metodo run è cambiata: esso non può avere al suo interno un ciclo
infinito, dovrà essere cura del programmatore fare in modo che questo sia egualmente
implementato considerando che il metodo run dell’oggetto di tipo thread è invocato
ogni volta che il sistema è Idle.
Inoltre ci sono altri due metodi che devono essere sempre presenti anche se non hanno
istruzione al loro interno: started e stopped. Quest’ultimo, in particolare, può essere
invocato per determinare la terminazione thread.
Figura 2.4 -
Alcuni dei componenti dell’ interfaccia utente, in stile Windows CE e Palm OS
rispettivamente (risoluzione 160X160).
43
2.3.3 Ciclo di Sviluppo
Innanzitutto è necessario disporre dell’ambiente di sviluppo Java (JDK), sulla propria
macchina. Il JDK è indispensabile ai fini della generazione del file con estensione
“class”, a partire dal file della propria applicazione con estensione “java”. Il bytecode di
SuperWaba è infatti compatibile con il bytecode Java e può essere eseguito, mediante
applet, su di una qualsiasi macchina virtuale Java standard.
Inoltre il runtime di java è utilizzato per generare i file eseguibili, destinati ai palmari.
Per quest’ultimo motivo, è consigliabile copiare l’intera cartella del kit di sviluppo di
SuperWaba, sull’unita disco della propria postazione di lavoro
È possibile eseguire il download del kit, gratuitamente e previa registrazione, dal sito
ufficiale: http://www.superwaba.com.br/. Il kit contiene, oltre al necessario per
l’installazione di SuperWaba sui dispositivi, un’ampia documentazione comprensiva
delle API messe a disposizione dall’ambiente e la licenza d’uso.
Il ciclo di sviluppo di un’applicazione SuperWaba si articola nei seguenti passi:
•
Generazione del codice sorgente, della propria applicazione, mediante un editor
di testo o un qualsiasi tool di sviluppo3. La sintassi è quella del linguaggio java,
mentre le API da considerare sono quelle messe a disposizione dall’ambiente.
•
Installazione dell’emulatore SuperWaba sul proprio Computer Desktop. Tale
operazione, pur non essendo strettamente necessaria, facilita il processo di
realizzazione e testing della applicazione.
•
Compilazione del file sorgente, attraverso il compilatore java. La versione del
JDK da utilizzare è, preferibilmente, la 1.2.x, ma è possibile utilizzare anche le
versioni 1.1.x, 1.3.x e superiori. In questi ultimi due casi, bisogna compilare con
l’opzione “-target 1.1”.
•
Generazione del file con estensione “pdb”. Esso rappresenta un archivio
contenente le classi utente di cui alla fase precedente e ogni altro file contenuto
nell’applicazione, quali ad esempio file immagine o sonori. Tale file di archivio
è prodotto mediante l’esecuzione di un programma java, Warp, fornito nel kit di
sviluppo della piattaforma SuperWaba.
•
Generazione dei file eseguibili destinati ai PDA. Attraverso l’esecuzione del
programma java, Exegen, è possibile ottenere, in un sol passo, il file eseguibile
3
Tutti i programmi SuperWaba, con interfaccia utente, devono necessariamente avere una ed una sola
“main window”, realizzata mediante la classe MainWindow.
44
per i dispositivi basati su PalmOS, quello per i dispositivi basati su WindowsCE
e il link a quest’ultimo.
•
Installazione del file archivio con estensione “pdb”, del file eseguibile e del
relativo link, sul dispositivo palmare. I primi due devono essere copiati in una
cartella creata nella directory contenente la macchina virtuale, mentre l’ultimo
può essere copiato laddove si ritiene più opportuno.
I dettagli sulle installazioni e la sintassi dei comandi “Warp” e ”Exegen”, sono contenuti
nel file “SuperWaba.pdf” che è fornito assieme alla documentazione della piattaforma
SuperWaba.
In appendice A è descritto un esempio di installazione della piattaforma SuperWaba e lo
sviluppo, comprensivo del testing sull’emulatore, di un esempio semplice.
45
2.3.4 Le API di SuperWaba
Le
API
base,
fornite
dall’ambiente
SuperWaba,
sono
archiviate
nel
file
“SuperWaba.pdb”. Esso contiene le classi base suddivise nei package mostrati nella
tabella 2.6:
Package Inclusi nel file SuperWaba.pdb
java.lang
waba.fx
waba.io
Tale package contiene alcune delle classi del package originale
java.lang, e di queste possiede solo un sottoinsieme dei metodi.
Contiene classi per i fonts, classi geometriche e classi per la gestione
delle immagini e dei suoni.
Classi base per l’I/O, per accedere ai file PDB, per la gestione delle
socket e delle porte seriali.
Tale package contiene le classi che si interfacciano con le
waba.sys
caratteristiche del Sistema Operativo sottostante e le classi per la
conversione degli oggetti.
waba.ui
Questo rappresenta uni dei package più importanti, contiene tutti gli
oggetti e I controlli per la creazione delle interface utente.
Classi di utilità per la gestione delle date e per la generazione dei
waba.util
numeri casuali. Contiene inoltre gli oggetti per le strutture di dati
(Vettori e Hashtable).
Tabella 2.6 – Classi base di default della piattaforma SuperWaba.
Nel caso in cui si dovessero usare classi che non sono contenute nei package di default,
è necessario installare i package di estensione corrispondenti alle classi utilizzate. Nella
tabella 2.7 sono indicati i package supplementari ed una loro descrizione, in tabella 2.8
sono invece descritti i package opzionali a pagamento.
46
Package di estensione (installazione opzionale)
Tratta con applicazioni proprie di Palm OS:
superwaba.ext.palm.io.builtin
Agenda, Mail, etc.
superwaba.ext.xplat.game
Framework per la creazione di giochi.
superwaba.ext.xplat.io
Classi extra per la gestione dell’I/O.
superwaba.ext.xplat.io.gps
Classi per la visualizzazione dei dati GPS.
superwaba.ext.xplat.io.gps.garmin
Implementa il protocollo Garmin GPS.
Classi per supportare il simbolo scanner per Palm
superwaba.ext.xplat.io.scanner
OS e Pocket PC.
superwaba.ext.xplat.sql
Sottoinsieme delle classi del package java.sql.
superwaba.ext.xplat.sql.db2e
Estensione del package xplat.sql.
superwaba.ext.xplat.sql.db2e.db2ex
Implementa una interfaccia nativa alternativa a
WDBC.
Classi di interfaccia utente, forniscono funzionalità
superwaba.ext.xplat.ui
supplementare.
superwaba.ext.xplat.util
Classi di utilità aggiuntive.
superwaba.ext.xplat.util.crypto
Classi per la crittazione e la decrittazione dei dati.
superwaba.ext.xplat.util.datergf
Classi per la manipolazione avanzata di data e ora.
superwaba.ext.xplat.util.props
Classi che definiscono proprietà.
superwaba.ext.xplat.util.xml
Fornisce un parser xml leggero e veloce.
Tabella 2.7 – Packages di estensione la cui installazione è opzionale. Sono disponibili gratuitamente.
Package di estensione a pagamento (installazione
opzionale)
superwaba.ext.xplat.io.print
superwaba.ext.xplat.io.search
Definiscono il comportamento per le librerie di stampa.
Contiene una classe usata per accelerare l’accesso
sequenziale di un PDB (per Palm OS).
Tabella 2.8 - Package supplementari di installazione opzionale. Sono disponibili a pagamento.
47
2.4 Ewe
Ewe è una piattaforma Open Source finalizzata allo sviluppo di applicazioni destinate ai
palmari. La piattaforma definisce un linguaggio, una Virtual Machine interpretata e un
insieme di classi base.
Il linguaggio ha una sintassi Java, per cui gli sviluppatori, come nel caso di SuperWaba,
possono utilizzare il tool di sviluppo che preferiscono, ma la macchina virtuale non usa
nessuna delle librerie standard di Java, al contrario essa utilizza librerie di classi definite
e implementate dalla piattaforma Ewe.
Una differenza sostanziale, con SuperWaba, riguarda la compatibilità con le API Java,
infatti, pur non definendo librerie conformi alle specifiche Java standard, Ewe ha
dedicato particolare attenzione al processo di migrazione delle applicazioni Java in
applicazioni Ewe.
Infatti per la conversione di un programma Java in uno Ewe, spesso è sufficiente
sostituire i package Java con i package Ewe e aggiungere, o modificare, poche linee di
codice dell’applicazione.
Ewe, così come SuperWaba , è rilasciata con la licenza GNU LGPL, per cui è possibile
sviluppare le proprie applicazioni, corredarle con la Ewe Vitual Machine e distribuire il
tutto anche per scopi commerciali.
48
2.4.1 Disponibilità.
La piattaforma Ewe è disponibile per diverse classi di sistemi:
dispositivi Windows CE/PocketPC
•
Dispositivi con sistema operativo PocketPC e PocketPC 200x
•
Casio Cassiopeia BE-300 PDA
•
PalmPC
•
HandHeld PC Pro/2000
32-bit Windows Computer Desktop
•
Windows 95
•
Windows 98
•
Windows ME
•
Windows NT
•
Windows 2000
•
Windows XP
Linux devices
•
Macchine Linux con la libreria GTK+1.2
•
Macchine Linux con la libreria Qt
•
Sharp Zaurus PDA
Inoltre sono in via di sviluppo versioni della macchina virtuale per i PDA PalmOS 5 e
per il PDA Simputer Linux.
49
2.4.2 Caratteristiche
Nella tabella 2.9, sono riportate alcune caratteristiche dell’ambiente Ewe, suddivise per
aree chiave:
Virtual Machine
Supportata da diverse piattaforme hardware
Consente le creazione di librerie native C
Supporto ai thread, alle eccezioni, e ai tipi double e long
Extension features
API per l’accesso ai registri di sistema
Supporto per gli algoritmi di crittografia: Blowfish, SHA1
Implementazione di database portabili e sincronizzabili
API di comunicazione tra dispositivo mobile e Computer desktop
Input/Ouput
Supporto per il protocollo TCP/IP, serial port, InfraRed.
User Interface
Libreria di GUI comparabili, a livello di funzionalità, alle Swing GUI disponibili per il JDK 1.2.
Tabella 2.9 – Caratteristiche salienti della piattaforma Ewe.
Per quanto riguarda l’implementazione dei thread, la piattaforma Ewe propone un
modello sostanzialmente analogo al modello dei thread di SuperWaba. Ewe fornisce un
ambiente a singolo thread che non consente prelazione e non supporta alcun tipo di
concorrenza.
Anche se il sistema operativo sottostante la virtual machine supporta il multithreading,
il runtime consente l’esecuzione di uno ed un solo thread per volta.
Le API per la gestione dei thread Ewe, sono virtualmente le stesse contenute nel
package java.lang.Thread. La differenza sta nel fatto che un thread utente Ewe, deve
necessariamente invocare una serie di metodi sleep, per consentire l’aquisizione del
controllo da parte degli altri thread. D’altra parte, poiché molte operazioni di I/O e di
interfaccia utente hanno delle chiamate implicite al metodo suddetto, non sempre
occorre intervenire nell’implementazione dei metodi dei thread.4
4
La piattaforma Ewe non fornisce il supporto alla concorrenza dei thread utente, ma quest' ultima può
essere comunque realizzata da programma.
50
2.4.3 Ciclo di Sviluppo
Innanzitutto è auspicabile disporre dell’ambiente di sviluppo Java sulla propria
macchina. In realtà ad essere indispensabile è la presenza di un compilatore java,
disponibile anche sul sito della piattaforma. Il compilatore è necessario per la
generazione del bytecode e deve utilizzare, per tale scopo, le librerie di classi
proprietarie della piattaforma.
A partire dal bytecode è possibile ottenere il file eseguibile destinato al dispositivo
palmare e alla propria postazione desktop. Allo
scopo è necessario installare, sul
computer desktop, la Ewe virtual machine, la quale consente di poter eseguire
un’applicazione, Jewel.ewe, che è in grado di produrre un file eseguibile che funge
anche da archivio per le classi utente. È da notare che tale operazione è indispensabile
se si intende collocare la propria applicazione in una qualsiasi posizione all’interno del
file system del dispostivo palmare. Per capire meglio tale affermazione, è necessario
descrivere la macchina virtuale Ewe in corso di esecuzione. Essa si presenta sottoforma
di Launcher che è in grado di generare collegamenti alle applicazioni e di mostrarli su
di un pannello. Le classi appartenenti ad una specifica applicazione, per poter essere
riferite dal Launcher, devono essere necessariamente installate in una cartella di nome
“classes”. In genere tale modo di procedere è utilizzato per scopi di debug, cioè per
provare l’applicazione sul dispositivo prima di generare il file eseguibile. Una volta
generato l’eseguibile, che per la Ewe virtual Machine ha estensione “ewe”, esso può
essere riferito dal Launcher, ma può anche essere eseguito cliccando semplicemente su
di esso, qualora il programma fosse privo di parametri.
Tutto quanto occorre per lo sviluppo di applicazioni Ewe, è reperibile al sito web
ufficiale: http://www.ewesoft.com/.
Il ciclo di sviluppo di un’applicazione Ewe può espletarsi nei seguenti passi:
•
generazione del codice sorgente, della propria applicazione, mediante un editor
di testo o un qualsiasi tool di sviluppo. La sintassi è quella del linguaggio java,
mentre le API da considerare sono quelle messe a disposizione dall’ambiente.
•
Installazione della macchina virtuale Ewe sul proprio Computer Desktop. Tale
operazione, serve ad eseguire l’applicazione Jewel.ewe che produce i file
eseguibili;
51
•
Compilazione del file sorgente, attraverso un compilatore java;
•
generazione dei file eseguibili destinati al PDA e al computer desktop;
•
installazione del file eseguibile sul dispositivo palmare ed eventualmente sulla
postazione desktop;
•
creazione del collegamento all’applicazione, dalla console del Launcher della
macchina virtuale. Tale operazione è opzionale solo nel caso che l’applicazione
sia senza parametri d’ingresso e sia nel formato eseguibile.
In appendice B è descritto un esempio di installazione della piattaforma Ewe e lo
sviluppo, comprensivo del testing sulla macchina virtuale Ewe (PC version), di un
esempio semplice.
52
2.4.4 Le API di Ewe
Le API base, fornite dalla piattaforma Ewe, sono mostrate in tabella 2.10:
Package di Ewe
ewe.data
Fornisce classi per il trattamento dei dati.
ewe.database
Fornisce una implementazione indipendente dal dispositivo
di un database.
ewe.filechooser
Tale package fornisce un FileChooser.
ewe.fx
Fornisce le funzioni base del disegno 2D.
ewe.graphics
Fornisce le funzioni avanzate del disegno 2D tra cui quelle
necessarie per I giochi e le animazioni.
ewe.graphics.pagedisplay Classi per la visualizzazione delle pagine
ewe.io
Fornisce le librerie di I/O – molte classi si rispecchiano nella
java.io.
ewe.math
Fornisce il supporto per i tipi BigInteger e BigDecimal.
ewe.net
Fornisce il supporto alla comunicazione TCP/IP in modo
molto simile al package java.net.
ewe.reflect
Fornisce il supporto per la Java Reflection.
ewe.security
Fornisce il supporto per la crittazione simmetrica e a chiave
pubblica. Supporto per la firma digitale.
ewe.sys
Classi di sistemi, tra cui l’implementazione dei thread.
ewe.ui
Classi per le GUI Ewe.
ewe.ui.formatted
Fornisce il supporto per la visualizzazione del testo
formattato.
ewe.util
Classi di utilità.
ewe.util.zip
Supporto per i file Zip.
ewex.registry
Supporto per l’accesso ai registri di sistema nei sistemi
Windows.
java.lang
Tale package contiene alcune delle classi del package
originale java.lang, e di queste possiede solo un sottoinsieme
dei metodi.
Tabella 2.30 – Classi della piattaforma Ewe.
53
2.5 Considerazioni comparative
In tabella 2.11 è riportata una comparazione tra i package messi a disposizione dagli
ambienti di esecuzione delle piattaforme considerate.
Java.lang
Util
I/O
Net
Zip
Reflect
Math
trattamento dei dati
RMI
Security
SQL
Applet
User Interface
Game API
Accesso registri di sistema
Visualizzazione dati GPS
Protocollo Garmin GPS
Classi specifiche per PPC e PalmOS
API di comunicazione tra PC e PDA
Jeode
a
a
a
a
a
a
a
a
a
a
a
a
a
CrEme
a
a
a
a
a
a
a
a
a
a
a
a
a
SuperWaba
a
a
a
a
a
a
a
Ewe
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
Tabella 2.11 – API a confronto.
Le macchine virtuali Jeode e CrEme sono molto simili dal punto di vista delle classi
supportate, d’altra parte sono entrambe Java-compliant.
Da notare, inoltre, che le macchine virtuali Java-based controbilanciano la loro limitata
compatibilità con Java, fornendo API specifiche per i dispositivi su cui sono disponibili.
54
Capitolo 3
Definizione ed implementazione dei test sperimentali
A monte del processo di valutazione delle differenti macchine virtuali, c’è la definizione
di un modello di qualità per un sistema software. Esso è caratterizzato da un insieme di
attributi che sia
rappresentativo del prodotto software, macchina virtuale, e che
costituisca la base per poter discriminare tra le macchine virtuali considerate.
La scelta degli attributi è legata allo stato attuale della tecnologia dei palmari, il quale
consente l’impiego di tali dispositivi per applicazioni client-based, grazie anche al
proliferare di infrastrutture di rete wireless.
A valle di tutto il discorso ci sono le entità che caratterizzano gli attributi e le metriche,
qualitative e quantitative, costruite su di esse.
In tale capitolo è presentato, nel dettaglio, il modello di qualità proposto e sono definite
le metriche e le applicazioni che consentono di effettuare le misure in relazione alle
metriche quantitative definite.
3.1 Il modello di qualità
In figura 3.1 è mostrato lo schema del modello proposto, per la valutazione delle
differenti macchine virtuali:
Modello
Efficienza
Interoperabilità
Usabilità
Portabilità
Figura 3.1 - La qualità caratterizzata attraverso un insieme finito e definito di attributi.
55
3.1.1 Gli attributi e le entità
Gli attributi che caratterizzano il modello di qualità proposto, a loro volta sono definiti
da un insieme di entità. In tale paragrafo è data una definizione degli attributi presenti
nel modello, corredata dalle entità scelte per caratterizzarli.
•
Efficienza: è il grado con il quale il software esegue le funzioni per le quali è
stato progettato, con il minimo spreco di risorse di calcolo. Essa rappresenta,
quindi, il livello di utilizzazione delle risorse hardware del dispositivo.
Le entità caratterizzanti sono le seguenti:
o Impronta di memoria;
o Multithreading;
o Chiamate a metodi;
o Overhead
•
Interoperabilità: rappresenta la capacità di un sistema software di integrarsi e
interagire con altri sistemi. In tale ottica, particolare rilievo assumono gli
standard di comunicazione. Le entità coinvolte sono le seguenti:
o Operazioni di I/O su file;
o Operazioni di I/O su rete;
o Compatibilità con Java standard.
•
Usabilità.
•
Portabilità: rappresenta la facilità con la quale un prodotto software può essere
trasferito da un sistema di elaborazione, o ambiente, ad un altro. Tale attributo
misura, quindi, il grado di indipendenza dalla macchina e il grado di
indipendenza dal software.
L’entità caratterizzante scelta è la seguente:
o Disponibilità su differenti piattaforme hardware-software
56
3.2 le metriche
Le metriche definite per la valutazione delle macchine virtuali, sono di carattere sia
quantitativo sia qualitativo. Nella tabella 3.1 seguono le metriche del primo tipo, con
l’indicazione degli attributi di qualità a cui afferiscono.
Metrica quantitativa
Efficienza
L’impronta di memoria (footprint memory).
Il multithreading.
Il tempo di chiamata ai metodi.
L’overhead per l’esecuzione della macchina virtuale.
Interoperabilità Il tempo per le operazioni di Input/Output su file.
Il tempo per le operazioni di Input/Output su rete.
Tabella 3.1 – Metriche quantitative.
•
L’impronta di memoria rappresenta la quantità di memoria di archiviazione,
necessaria alla installazione delle macchine virtuali, sul dispositivo palmare.
•
Il multithreading è espresso in termini di:
o Livello di multithread.
o Tempo di esecuzione di uno stesso algoritmo multithread, senza politiche
di sincronizzazione.
•
Il tempo di chiamata a metodi, si particolarizza in:
o Tempo medio di chiamata di un metodo senza parametri.
o Tempo medio di chiamata di un metodo con un parametro elementare.
o Tempo medio di chiamata di un metodo con un parametro strutturato.
•
L’overhead è inteso in termini di:
o Quantità media di memoria occupata, per l’esecuzione della macchina
virtuale.
•
Il tempo per le operazioni di Input/Output su file si riferisce a:
o Tempo medio di scrittura al variare delle dimensioni del file
o Tempo medio di lettura al variare delle dimensioni del file.
•
Le operazioni di Input/Output su rete, sono da intendersi in termini di delay.
57
Nella tabella 3.2 sono elencate le metriche di carattere qualitativo:
Metrica qualitativa
Portabilità
Il numero di piattaforme hardware-software che supportano le VM.
Usabilità
Il ciclo di sviluppo per la realizzazione delle applicazioni.
La tipologia di classi supportate da ciascun ambiente.
La tipologia del supporto alle Graphical User Interface.
Interoperabilità Compatibilità con java.
Tabella 3.2 – Metriche qualitative.
58
3.3 I test sperimentali: definizione e implementazione
In tale paragrafo sono definiti i test sperimentali ed è proposta una loro
implementazione [Herbert]. Per la valutazione dell’impronta di memoria, footprint
memory, e per la valutazione dell’overhead generato da ciascuna macchina virtuale, non
è necessario sviluppare alcuna applicazione. Infatti per la prima è sufficiente osservare
la quantità di memoria di archiviazione, del dispositivo palmare, prima e dopo
l’installazione di ciascuna macchina virtuale. Per la seconda valutazione si utilizza un
monitor software.
3.3.1 Il multithreading
Si è già discusso, nel precedente capitolo, del fatto che le macchine virtuali Ewe e
SuperWaba, non forniscono un vero e proprio supporto al multithread. Tali ambienti
sono a thread singolo, non consentono prelazione e non supportano alcun tipo di
concorrenza. Per tali ragioni il livello di multithread, è verificato per le macchine
virtuali Jeode e CrEme. Invece le prestazioni, in termini di tempo di esecuzione di uno
stesso algoritmo multithread, sono valutate in riferimento a tutte le macchine virtuali,
dal momento che, anche per quanto riguarda Ewe e SuperWaba, è possibile che un
thread ceda volontariamente il controllo in favore degli altri thread (modello
cooperativo).
3.3.1.1 Considerazioni preliminari
Per meglio definire e implementare l’applicazione che consente di stimare il livello di
multithread, si è reso necessario lo studio del comportamento di Jeode e CrEme in
relazione alla priorità dei thread. Allo scopo si sviluppata una applicazione (di cui si
riportano in questo stesso paragrafo i risultati) in cui il thread principale istanzia due
thread figli, hiThread e loThread, ciascuno dei quali incrementa una propria variabile
membro intera, fino a quando il principale non invoca su di essi un metodo che causa la
terminazione dei thread stessi. Successivamente il thread principale invoca il metodo
run dei due thread, si sospende per dieci secondi e al suo risveglio provoca la
terminazione dei thread figli e attende la loro effettiva terminazione (metodo join).
59
Infine il thread padre visualizza, sullo standard output, il valore di ciascuna variabile.
Da tali valori è possibile ottenere un stima della percentuale di utilizzo del processore
da parte dei due thread figli.
Lo schema dell’algoritmo è il seguente:
ü il thread principale imposta la propria priorità, istanzia due thread figli e ne
imposta la priorità;
ü il thread principale avvia l’esecuzione dei thread figli, in successione;
ü ciascun thread figlio incrementa la propria variabile membro (intera) fino a
quando non viene invocato il metodo che ne causa la loro terminazione;
ü il thread principale si sospende per dieci secondi (sleep) dopodiché chiama il
metodo per la terminazione dei figli, in successione.
ü infine il thread principale aspetta la reale terminazione dei figli (join) e
visualizza sullo standard output il valore di ciascuna variabile membro dei suoi
figli.
Al variare della priorità dei thread figli, si ottengono i seguenti risultati:
•
Thread con la stessa priorità: la specifica Java non impone alcun comportamento
in caso di thread a priorità eguale, consiglia solo che essi siano implementati in
modo tale da cedere occasionalmente il controllo, per dare una possibilità di
esecuzione agli altri thread. La tabella 3.3 mostra il risultato di una esecuzione
dell’applicazione summenzionata, nelle condizioni di precedenza appena
discusse:
J2SE
Jeode
CrEme
loThread 201148849
185547214
21015895
hiThread 200972548
189014587
21152192
Tabella 3.3 – Thread figli a priorità uguale.
Dall’analisi dei risultati, si può assumere che i thread ad uguale priorità sono
eseguiti a turno: sia Jeode sia CrEme gestiscono i thread di pari priorità con una
politica di scheduling round-robin.
60
•
Thread con priorità differente: al thread loThread è assegnata una priorità più
bassa rispetto alla priorità data al thread hiThread. In tabella 3.4 sono riportati i
risultati ottenuti dall’esecuzione dell’applicazione in tale condizioni:
J2SE
Jeode
CrEme
loThread 9200243
0
0
hiThread 393097456
371094429
42304385
Tabella 3.4 – Thread figli a priorità differente.
Dai risultati di cui alla tabella precedente si evince che, sulle piattaforme Jeode e
CrEme, i thread a priorità più bassa vanno in starvation alla presenza di thread a
priorità più alta, che non cedano mai il controllo. Inoltre osservando i valori in
tabella 3.3 e 3.4, si nota che i thread della macchina virtuale Jeode hanno un
utilizzo dei cicli di CPU molto maggiore rispetto a quelli sulla macchina CrEme.
•
Thread con priorità differente, la prelazione: inserendo una sospensione di
cinque millisecondi tra l’invocazione dei metodi start dei due thread figli, si può
determinare il comportamento di Jeode e CrEme nei riguardi della prelazione.
In tabella 3.5 si riportano i risultati:
Jeode
CrEme
LoThread 13
31745
HiThread 377425962
42203007
Tabella 3.5 – Jeode, CrEme e la prelazione.
L’analisi dei risultati conferma quanto è riportato nella documentazione ufficiale
delle piattaforme Jeode e CrEme: entrambe hanno una gestione dei thread basata
sulle priorità, ma la macchina virtuale Jeode implementa un modello di gestione
con prelazione. Evidentemente il thread a maggior priorità, nel caso di CrEme,
attende che termini un quanto di tempo prima di acquisire definitivamente il
controllo. Jeode invece prelazione il thread a priorità più bassa a favore di quello
a priorità più alta. La percentuale di utilizzo della CPU del thread “loThread” è,
nel caso di Jeode, lo 0.0000031% (praticamente zero) mentre per CrEme è circa
lo 0.075%.
61
3.3.1.2 Livello di multithreading
Definizione del test:
si vuole dare una stima del massimo numero di thread supportati da ciascuna delle due
piattaforme. Tale stima si può ottenere osservando il numero di thread in
corrispondenza del quale si verifica uno dei due eventi:
ü il sistema solleva una eccezione del tipo out of memory;
ü il sistema va in trash.
Implementazione:
l’applicazione prevede che il thread principale istanzi due classi di thread, una classe
FaiQualcosa e una classe FaiNulla. La prima ridefinisce il metodo run in modo da
eseguire operazioni che abbiano una certa rilevanza temporale, in tal modo è alta la
probabilità che, in presenza di più thread aventi tutti la stessa priorità, quando il thread
FaiQualcosa acquisisca il controllo del processore, esso non esaurisca il suo compito in
un unico quanto di tempo. Nella fattispecie tale thread avvalora una matrice di grandi
dimensioni per un determinato numero di volte e calcola il tempo impiegato per farlo.
La classe FaiNulla ridefinisce il metodo run in modo da realizzare un ciclo indefinito
che semplicemente “consumi” cicli del processore.
Si è scelta una strategia di tipo controllato, cioè il numero di thread presenti nel sistema
è immesso come parametro da riga di comando. In tale modo è possibile ottenere stime
temporali, dell’esecuzione del thread FaiQualcosa, quando si presume che il sistema sia
in condizioni di regime, cioè quando tutti i thread sono stati schedulati.
In particolare il thread principale compie le seguenti azioni:
ü Istanzia e avvia il thread FaiQualcosa per un numero fissato di volte (in maniera
sincronizzata), in modo tale da avere più rilevazioni temporali senza che vi siano
altri thread nel sistema.
ü Istanzia e lancia i thread FaiNulla e determina il tempo necessario a compiere
tale azione. Tale tempo concorre a determinare lo stato di trash del sistema.
ü Istanzia e avvia il thread FaiQualcosa per un numero di volte proporzionale al
numero di thread FaiNulla (sempre in maniera sincronizzata), in tale modo si
cerca di avere valutazioni temporali a regime.
62
Dalla conoscenza dei tempi di esecuzione del thread FaiQualcosa, in condizioni di
monopolio della CPU, è possibile osservare il degrado delle prestazione del thread in
questione, quando nel sistema vi siano un certo numero di thread FaiNulla.
Se l’andamento delle stime temporali è non lineare, al crescere del numero totale di
thread del sistema, allora si può assumere che il sistema sia andato in trash.
Come già detto anche il tempo necessario a lanciare il numero fissato di thread
FaiNulla, concorre a determinare tale stato di deterioramento della prestazioni generali
del sistema. D’altra parte se in un’applicazione si istanziano un certo numero di thread,
non è per mero divertimento.
Da notare che ogni stima di tempo è memorizzata in un file distinto, questo per evitare
che i thread siano in competizione sullo stesso dispositivo di output.
3.3.1.3 Prestazioni di uno stesso algoritmo multithread
Definizione:
Si intende dare una stima delle prestazioni, in termini di tempo di esecuzione, di uno
stesso algoritmo multithread, che non adoperi politiche di sincronizzazione.
Implementazione:
L’applicazione sviluppata, per assolvere allo scopo preposto, è il prodotto tra due
matrici. La scelta è stata polarizzata dalla considerazione che un algoritmo parallelo, per
essere eseguito efficientemente, deve godere delle proprietà commutativa e associativa
[Fadini].
Questo è proprio il caso dell’algoritmo del prodotto matriciale, infatti ciascun elemento
della matrice prodotto è espresso come sommatoria di mintermini.
A tale considerazione si aggiunga il fatto che, trovandoci in ambiente multithread, è
nullo il tempo di comunicazione, visto che i dati possono condividere lo stesso spazio di
indirizzamento.
L’algoritmo proposto è a grana fine, cioè se la matrice è di ordine n, allora sono
istanziati n2 thread ciascuno dei quali calcola un elemento della matrice prodotto. Tale
scelta è motivata dal fatto che lo scopo del test non è realizzare un algoritmo
multithread efficiente, ma valutare l’efficienza dell’algoritmo all’aumentare del numero
di thread, in tal modo è possibile osservare, ad esempio, quanto incide il cambio di
contesto nelle prestazioni generali dell’algoritmo.
63
3.3.2 Il tempo di chiamata ai metodi
Definizione:
Si vuole calcolare il tempo medio di chiamata di un metodo di una classe, nei seguenti
casi:
ü l’oggetto chiamante non passa alcun parametro all’oggetto chiamato;
ü l’oggetto chiamante passa un parametro elementare all’oggetto chiamato;
ü l’oggetto chiamante passa un parametro strutturato all’oggetto chiamato.
Per tempo di chiamata di un metodo si intende, in tale contesto, il tempo che intercorre
tra l’invocazione del metodo di un oggetto e il ritorno del controllo al chiamante. In
particolare il metodo chiamato non esegue alcuna istruzione.
Implementazione:
L’applicazione realizzata esegue le seguenti azioni per ciascun tipo di chiamata:
ü fissa un istante di tempo prima dell’invocazione del metodo.
ü invoca il metodo in questione, per un numero prefissato e sufficientemente
grande di volte.
ü calcola il tempo trascorso a partire dall’istante di tempo fissato in precedenza.
ü calcola il tempo medio.
Si osservi che iterare per un elevato numero di volte, in realtà, fornisce un valore medio
come effetto collaterale. Questo perché il tempo da calcolare è talmente piccolo da non
essere adatto alla sensibilità del meccanismo di rilevazione offerto dalle librerie delle
varie piattaforme.
64
3.3.3 Operazioni di Input/Output su file
Definizione:
si vuole calcolare il tempo medio di esecuzione delle operazioni su file, nei seguenti
termini:
ü Tempo medio di scrittura al variare delle dimensioni del file.
ü Tempo medio di lettura al variare delle dimensioni del file.
Implementazione:
L’applicazione realizzata prevede che si possa immettere, da riga di comando, la
dimensione del file espressa in byte. L’applicazione realizzata esegue le seguenti azioni:
ü fissa un istante di tempo di riferimento per l’operazione di scrittura;
ü esegue la scrittura del file delle dimensioni specificate;
ü calcola il tempo trascorso a partire dall’istante di tempo fissato in precedenza e
lo memorizza in un file di testo;
ü fissa un nuovo istante di tempo di riferimento;
ü esegue le lettura del file scritto precedentemente;
ü calcola il tempo impiegato per effettuare la lettura;
ü memorizza il tempo di lettura in un file testuale;
ü itera i passi precedenti un numero di volte pari al numero di campioni scelto per
determinare la caratterizzazione sintetica dei tempi di lettura e scrittura.
65
3.3.4 Operazioni di Input/Output su rete
Definizione:
Il ritardo di rete rappresenta il tempo che intercorre tra l’invio e la effettiva ricezione di
un flusso di byte [Tanenbaum]. Si intende calcolare una stima del ritardo di rete da
punto a punto (end-to-end delay) e a livello TCP.
Implementazione:
La soluzione implementata si propone di calcolare il round trip time, inteso come il
tempo impiegato dallo stream per arrivare a destinazione e da lì ritornare. Il ritardo di
rete può quindi essere stimato dimezzando tale valore.
Il vantaggio di tale approccio risiede nella semplicità dell’algoritmo e nel modesto
overhead computazionale. E’ difatti sufficiente fissare un riferimento temporale a invio
effettuato ed un secondo non appena il flusso di dati è ritornato, la differenza tra i due
timestamp rappresenta proprio il round trip delay.
La struttura dell’applicazione è di tipo client-server, il cliente viene mandato in
esecuzione sul dispositivo palmare ed effettua le seguenti operazioni:
ü Crea il canale di comunicazione con il servente (Socket TCP).
ü Crea il flusso di dati, di lunghezza fissa, da trasmettere al server.
ü Definisce il numero di campioni sulla base dei quali è possibile ottenere una
caratterizzazione sintetica del ritardo di rete.
ü Stima il ritardo di rete a partire dal round trip time, così come descritto in
precedenza.
ü Memorizza la stima ottenuta in un vettore e si sospende per un secondo.
ü Ripete le ultime due azioni per un numero di volte pari al numero di campioni.
ü Calcola la media delle stime memorizzate nel vettore di stime, escludendo dal
calcolo il massimo e il minimo valore.
La sospensione del client, rappresenta un ragionevole margine di sicurezza affinché non
vi siano conflitti sul canale di comunicazione, infatti alla ricezione di un messaggio
segue sempre l’invio del successivo, fino al raggiungimento del numero di campioni.
66
Il server è mandato in esecuzione su di un computer desktop, esso è implementato
mediante estensione della classe Thread e ridefinisce il metodo run in modo da eseguire
le seguenti operazioni:
ü Creazione di un canale di comunicazione (ServerSocket TCP).
ü Accettazione delle richieste di connessione da parte dei client.
ü Realizzazione di un ciclo infinito in cui si effettua la ricezione dei messaggi
provenienti dai client e la trasmissione degli stessi messaggio, al mittente
(echoing)
67
Capitolo 4
Analisi e valutazione dei risultati sperimentali
In tale capitolo sono presentati e analizzati i risultati dei test sperimentali, in relazione
alle metriche quantitative e qualitative. Inoltre è proposta un’analisi comparativa dei
risultati ottenuti per le differenti macchine virtuali.
In figura 4.1 è presentato lo schema delle metriche del modello di qualità proposto.
Metriche
Quantitative
•
•
•
•
•
•
Impronta di memoria.
Multithreading.
Tempo di chiamata a
metodi.
Overhead delle VM.
Tempo per le operazioni
di Input/Output su file.
Tempo per le operazioni
di Input/Output su rete.
Qualitative
•
•
•
•
•
Piattaforme hw-sw che
supportano le VM.
Ciclo di sviluppo
Tipologia di classi
supportate
Tipo di supporto alle
Graphical User Interface.
Compatibilità con java.
Figura 4.1 – Metriche quantitative e qualitative.
68
4.1 Metriche quantitative: risultati
Nel precedente capitolo è stata data una definizione dei test sperimentali ed è stata
descritta l’implementazione proposta. Tutte le applicazioni sono state eseguite sul
palmare Compaq iPAQ 3970, con sistema operativo PocketPC2002 e 33Mb di
memoria. In tale paragrafo si riportano i risultati ottenuti nel processo di misurazione.
4.1.1 Impronta di memoria
L’impronta di memoria (footprint memory) rappresenta la quantità di memoria
necessaria all’istallazione di ciascun macchina virtuale. I risultati ottenuti sono indicati
nella tabella 4.1:
Footprint Memory
Jeode
CrEme
SuperWaba
Ewe
2736 Kb
4448 Kb
360Kb
2048 Kb
Tabella 4.4 - Impronta di memoria
4.1.2 Multithreading
I test sperimentali che riguardano il multithreading sono espressi in termini di:
•
Livello di multithread.
•
Tempo di esecuzione di uno stesso algoritmo multithread, senza politiche di
sincronizzazione.
E’ necessario sottolineare, ancora una volta, che le macchine virtuali Ewe e SuperWaba,
non forniscono un vero e proprio supporto al multithreading, per tale motivo la
valutazione del livello di multithreading ha senso solo per le macchine virtuali javacompliant considerate. Invece la stima delle prestazioni, in termini di tempo di
esecuzione di uno stesso algoritmo multithread, contempla anche le due macchine
virtuali java-based, dal momento che esse sono consentono ad un thread di cedere
volontariamente il controllo a favore degli altri.
69
4.1.2.1 Livello di Multithreading
Il livello di multithread è espresso mediante il calcolo di una stima del massimo numero
di thread che una piattaforma può supportare. L’algoritmo implementato sul testbed ha
prodotto i risultati riportati nelle tabelle 4.2 e 4.3. In esse è indicato:
•
il numero di thread presenti nel sistema (NThread), escluso il thread principale;
•
il tempo impiegato dalle macchine virtuali per istanziare il numero di thread di
cui al punto precedente (TFN);
•
media e deviazione standard dei campioni (TFQ e DTFQ). Questi ultimi sono
ricavati dalle misurazioni dei tempi di esecuzione del thread FaiQualcosa,
quando nel sistema sono presenti un numero di thread pari a NThread. I tempi
sono espressi in millisecondi.
NThread
0
5
10
20
50
100
Jeode
TFN
TFQ
DTFQ
TFN
TFQ
DTFQ
TFN
TFQ
DTFQ
TFN
TFQ
DTFQ
TFN
TFQ
DTFQ
TFN
TFQ
DTFQ
560.3
10.62
5211
3196.5
36.93
24299
5831.9
9.10
107427
11091.4
12.83
640798
26856.1
4.36
2927444
53125.2
11.20
CrEme
4177.8
34.50
25
5640.9
58.50
38
6624.1
27.14
60
9177.1
28.39
124
16879.3
17.13
644
29799.2
22.91
Tabella 4.2 – Risultati del test per il livello di multithreading: TFN – Tempo per istanziare un numero di
thred FaiNulla pari a NThread; TFQ, DTFQ – Tempo medio e deviazione standard, per l’esecuzione del
thread FaiQualcosa, quando nel sistema sono presenti un numero di thread pari a NThread. Tempi in
millisecondi (ms).
70
NThread
200
300
400
1000
1100
1200
TFN
TFQ
DTFQ
TFN
TFQ
DTFQ
TFN
TFQ
DTFQ
TFN
TFQ
DTFQ
TFN
TFQ
DTFQ
TFN
TFQ
DTFQ
Jeode
8962324
105709.5
46.91
15434686
158077.7
10.03
trash
trash
trash
trash
-
CrEme
922
55522.2
36.52
1222
81151.4
35.62
8587
106609.7
57.45
445742
324242.8
54.94
2348423
357896.8
56.36
o.o.m.
-
Tabella 4.3 – Risultati del test per il livello di multithreading: TFN – Tempo per istanziare un numero di
thred FaiNulla pari a NThread; TFQ, DTFQ – Tempo medio e deviazione standard, per l’esecuzione del
thread FaiQualcosa, quando nel sistema sono presenti un numero di thread pari a NThread; trash – Il
sistema è andato in trash; o.o.m. – out of memory. Tempi in millisecondi (ms).
.
71
4.1.2.2 Prestazioni di un algoritmo multithread
L’applicazione stima le prestazioni, in termini di tempo di esecuzione, dell’algoritmo
multithread del prodotto tra due matrici quadrate.
Nelle tabelle 4.4 e 4.5 sono riportati i tempi medi di esecuzione (espressi in
millisecondi) e la deviazione standard, al variare della dimensione delle matrici.
Dim
20
50
100
110
145
150
Jeode
CrEme
SuperWaba Ewe
5137,3
1650,4
416,2
1000
36122,8
11797,2
13771
20900
138166
47549,9
213377,8
218200
170229,8
o.o.m.
316321,5
304300
297889,5
o.o.m.
o.o.m.
948500
347803,1
o.o.m.
o.o.m.
o.o.m.
Tabella 4.4 - Tempi medi di esecuzione (in ms) dell’algoritmo multithread: o.o.m.- out of memory;
Dim – dimensioni delle matrici (quadrate).
Dim
20
50
100
110
145
150
Jeode
CrEme
SuperWaba Ewe
62.9
42.5
10.1
0.9
608.2
284.7
182.7
737.8
824.9
393.2
1504.4
1751.2
1161.6
o.o.m.
2526.2
1494.4
1950.4
o.o.m.
o.o.m.
5642.1
2635.1
o.o.m.
o.o.m.
o.o.m.
Tabella 4.5 – Deviazione standard dei tempi di esecuzione (in ms) dell’algoritmo multithread.
o.o.m.- out of memory; Dim – dimensioni delle matrici (quadrate).
72
4.1.3 Tempo di chiamata a metodi
Il tempo di chiamata a metodi, si particolarizza in:
•
Tempo medio di chiamata di un metodo senza parametri.
•
Tempo medio di chiamata di un metodo con un parametro elementare.
•
Tempo medio di chiamata di un metodo con un parametro strutturato.
Nelle tabelle 4.6 e 4.7 sono riportati i risultati ottenuti.
A
B
C
Jeode
CrEme
SuperWaba Ewe
1,40E-04
6,64E-04
1,59E-03
3,60E-03
1,45E-04
7,38E-04
1,75E-03
3,90E-03
1,43E-04
7,39E-04
1,75E-03
3,90E-03
Tabella 4.6 – Tempi medi di chiamata a metodi (in ms): A – senza parametri; B – con un parametro
elementare; C – con un parametro strutturato.
A
B
C
Jeode
CrEme
SuperWaba Ewe
9,95E-07
4,45E-06
3,43E-05
5,16E-04
7,25E-07
3,77E-06
5,29E-05
5,68E-04
3,30E-06
3,14E-06
8,18E-05
3,16E-04
Tabella 4.7 – Deviazione Standard dei tempi di chiamata a metodi (in ms): A – senza parametri; B – con
un parametro elementare; C – con un parametro strutturato
73
4.1.4 Overhead delle macchine virtuali
L’overhead delle macchine virtuali è stato valutato in termini di quantità media di
memoria, necessaria per l’esecuzione della macchina virtuale. Lo strumento utilizzato
per effettuare la stima è un monitor software di memoria, in particolare è stato utilizzato
il monitor in dotazione al sistema operativo del dispositivo.
In tabella 4.8 sono riportati i dati sperimentali ottenuti e la caratterizzazione sintetica
della quantità di memoria necessaria all’esecuzione delle macchine virtuali (runtime
memory).
Jeode
3,11
3,14
3,10
3,12
3,30
3,18
3,14
3,00
3,19
3,17
Media
Dev.Standard
CrEme SuperWaba
2,64
0,43
2,60
0,46
2,61
0,45
2,66
0,45
2,60
0,43
2,71
0,47
2,66
0,45
2,64
0,44
2,70
0,46
2,63
0,43
3,15
2,65
0,0766304 0,0383695
Ewe
1,31
1,28
1,33
1,28
1,27
1,32
1,33
1,29
1,28
1,34
0,45
1,30
0,0141814 0,0258414
Tabella 4.8 – Risultati sperimentali della valutazione del runtime memory (Mb).
Nonostante si sia utilizzato un monitor software, è stato necessario definire e
implementare una semplice applicazione che si sospendesse per un determinato lasso di
tempo prima di terminare. Tale scelta è stata motivata dalla considerazione che la
macchina virtuale Ewe si presenta come ambiente per l’esecuzione delle applicazioni,
quando viene eseguita (Launcher).
Si noti che la sospensione dell’applicazione facilita la rilevazione dei dati del monitor.
74
4.1.5 Operazioni di I/O su file
Il tempo per le operazioni di Input/Output su file si riferisce a:
•
Tempo medio di scrittura al variare delle dimensioni del file
•
Tempo medio di lettura al variare delle dimensioni del file.
L’applicazione realizzata calcola i tempi per le operazioni di scrittura e lettura di un file
delle dimensioni specificate di seguito:
•
1 Mbyte;
•
2 Mbyte;
•
4 Mbyte;
•
8 Mbyte.
Le tabelle 4.9 e 4.10 riportano i risultati ottenuti dalla misurazione, relativamente
all’operazione di scrittura su file.
1 Mb
2 Mb
4 Mb
8 Mb
Jeode
85942,4
173465,8
344502
684094,9
CrEme
SuperWaba
127163,5
68521,1
249476,3
150381,2
506416,4
302278,8
966851,8
539380,6
Ewe
583500
1089800
2188900
4644700
Tabella 4.9 – Tempi medi di scrittura su file (in ms).
1 Mb
2 Mb
4 Mb
8 Mb
Jeode
1234,97
2090,61
2477,91
6411,57
CrEme
SuperWaba
3854,18
3297,23
7532,56
4962,60
12856,52
8293,50
20692,25
22403,88
Ewe
13167,72
6779,05
19339,03
53564,19
Tabella 4.10 – Deviazione standard dei tempi di scrittura su file (in ms).
75
Le tabelle 4.11 e 4.12 riportano i risultati ottenuti dalla misurazione, relativamente
all’operazione di lettura su file.
1 Mb
2 Mb
4 Mb
8 Mb
Jeode
91498,1
201732,3
397884,6
769549,7
CrEme
SuperWaba
35272,7
68018
62568,8
138754,2
138718,9
282489,9
248284,7
548836,9
Ewe
57600
94900
196500
446900
Tabella 4.11 - Tempi medi di lettura su file (in ms).
1 Mb
2 Mb
4 Mb
8 Mb
Jeode
2898,88
8051,88
15342,55
37210,72
CrEme
SuperWaba
4174,11
1078,11
6768,23
1496,21
11481,81
7627,87
17074,49
23308,71
Ewe
6866,99
2079,00
6587,02
18917,66
Tabella 4.12 – Deviazione standard dei tempi di lettura su file (in ms).
76
4.1.6 Operazioni di I/O su rete
Il tempo medio per le operazioni di input-output su rete, è inteso in termini di delay end
to end ed è stato calcolato dimezzando una stima del round trip time.
Si è posta particolare attenzione affinché il testbed fosse lo stesso per ogni processo di
misurazione, in particolare è stata configurata una rete privata mediante l’utilizzo di due
schede di rete Wi-Fi: una installata sul dispositivo palmare e l’altra su di un PC
portatile. La posizione relativa dei dispositivi è rimasta inalterata durante l’intero
processo di misurazione e per evitare eventuali conflitti, sull’utilizzo del canale di
comunicazione, è stato inserito un margine di tempo di sicurezza, dal lato client, tra la
ricezione di un messaggio e la trasmissione del successivo.
I risultati ottenuti sono riportati nella tabella 4.13. Ciascun elemento della tabella
rappresenta una media su cento campioni, al fine di verificare che in durante il calcolo
di tale media non vi siano state interferenze di rilievo sul canale di comunicazione, il
calcolo è stato eseguito più volte per ciascuna macchina virtuale
Jeode
CrEme
Ewe
SuperWaba
4,85
6,63
5,1
3,4
4,93
6,57
5,1
3,31
4,56
6,25
5,1
3,57
4,96
6,59
5.1
3,81
4,91
6,27
5,1
3,55
6,45
5,1
3,61
4,97
6,5
5,1
3,49
4,61
6,61
5,1
3,35
4,77
4,87
6,49
5,13
3,37
4,79
6,53
5,1
3,46
Media
4,822
6,489
5,103
3,492
DevStand 0,14172 0,133204 0,009487 0,14987402
Tabella 4.13 – Stime del ritardo di rete (in millisecondi).
.
77
4.2 Metriche quantitative: confronto
In tale paragrafo sono riportate le caratterizzazioni sintetiche delle grandezze misurate
attraverso il processo di misurazione ed è presentata un’analisi comparativa dei valori
riportati.
4.2.1 Impronta di memoria.
Nella tabella 4.14 sono riportati i risultati relativi all’impronta di memoria, espressi in
kilobyte.
Footprint Memory
Jeode
CrEme
SuperWaba
Ewe
2736 Kb
4448 Kb
360Kb
2048 Kb
Tabella 4.14 – Footprint Memory.
In figura 4.2 è visualizzata la comparazione relativa del fabbisogno di memoria richiesto
da ciascuna macchina virtuale.
4500
4000
3500
Kb
3000
Jeode
2500
CrEme
2000
SuperWaba
1500
Ewe
1000
500
0
Virtual Machine
Figura 4.2 – Impronte di memoria a confronto.
Si osservino i due estremi:
SuperWaba ha un fabbisogno di memoria, per la sua installazione, tanto esiguo da
essere adatta anche a dispositivi con capacità di memoria davvero limitate.
78
CrEme presenta invece una situazione diametralmente opposta: la sua richiesta di
memoria per l’installazione è consistente al punto da doverne tener conto anche nei
PDA di ultima generazione.
4.2.2 Multithreading
In tale sezione è proposta un’analisi comparativa del livello di multithreading
supportato dalle macchine virtuali java-compliant e delle prestazioni dell’algoritmo
multithread del prodotto matriciale.
4.2.2.1 Livello di multithread
In tabella 4.15 sono riportati i tempi, espressi in millisecondi, per la generazione del
numero di thread, NThread, sulle macchine virtuali Jeode e CrEme.
NThread TJeode
TCrEme
5
5211
25
10
24299
38
20
107427
60
50
640798
124
100
2927444
644
200
8962324
922
300
15434686
1222
trash
400
8587
500
trash
8915
1000
trash 445742
1100
trash 2348423
o.o.m.
1200
trash
Tabella 4.15 – Numero di thread presenti nel sistema e tempo per istanziarli (in ms).
Dall’analisi dei dati è possibile stabilire dei maggioranti per la stima del livello di
multithreading, in particolare:
•
Jeode: lanciando l’applicazione con un valore del numero di thread pari a 400, il
sistema non è in grado di istanziare il numero di thread desiderato, quando è
trascorso un tempo superiore alle 24 ore dall’inizio dell’esecuzione. Per cui si
può ritenere che il sistema sia andato in trash.
79
•
CrEme: l’applicazione eseguita sulla piattaforma CrEme continua ad istanziare
thread, fino a quando il sistema non lancia una eccezione del tipo out of memory
(o.o.m.). Da tale osservazione si può desumere che il livello di multithreading è,
nel caso di CrEme, strettamente legato alla capacità di memoria del dispositivo.
Nel caso in esame, un maggiorante è fissato in 1200 thread, con una memoria
disponibile di circa 33Mb.
Il fatto che il livello di multithread, nel caso di CrEme, sia strettamente legato alla
memoria del dispositivo, è un risultato che non desta stupore e che anzi ci si poteva
aspettare. Si Ricordi infatti che il modello dei thread di CrEme, blue thread, prevede
una gestione del multithread totalmente a carico della macchina virtuale, mentre nel
modello di gestione dei thread di Jeode, a ciascun thread java corrisponde un thread del
sistema operativo real-time.
Si analizza di seguito la variazione del tempo di esecuzione del thread FaiQualcosa, al
crescere del numero di thread nel sistema. La tabella 4.16 riporta la media dei risultati
ottenuti dall’esecuzione dell’applicazione.
Nthread
0
5
10
20
50
100
200
300
400
1000
1100
1200
Jeode
560.3
3196,5
5831,9
11091,4
26856,1
53125,2
105709,5
158177,7
trash
trash
trash
trash
CrEme
4177.8
5640,9
6624,1
9177,1
16879,3
29799,3
55522,2
81151,4
106609,7
324242,8
357896,8
o.o.m.
Tabella 4.16 – Tempi di esecuzione del thread FaiQualcosa al variare del numero NThread di thread.
Per meglio evidenziare la differenza delle prestazioni del thread FaiQualcosa, al variare
del numero di thread, si consideri la figura 4.3.
80
120000
100000
80000
ms
60000
Jeode
CrEme
40000
20000
0
0
5
10
20
50
100
200
NThread
Figura 4.3 – Tempi medi di esecuzione del thread FaiQualcosa.
Si osservi che il tempo di esecuzione del thread FaiQualcosa sulla macchina virtuale
Jeode, è molto minore del tempo di esecuzione dello stesso thread eseguito su CrEme,
quando nel sistema non vi sono altri thread a parte il thread principale. Al crescere del
numero di thread nel sistema si può notare, dal grafico, che il bilancio è favorevole a
Jeode finquando NThread si aggira intorno alla decina. Da un certo punto in avanti,
CrEme risulta avere prestazioni temporali nettamente inferiori rispetto a Jeode, il che
lascia supporre che la piattaforma CrEme abbia un tempo di cambio di contesto molto
minore rispetto a quello della piattaforma Jeode. Questo perché il modello di gestione
dei thread di CrEme, essendo gestito dalla macchina virtuale, ha un contesto da salvare
più leggero. Tale aspetto risulta essere però controbilanciato da un uso intensivo della
memoria, come conferma l’utilizzo del monitor di memoria durante l’esecuzione
dell’applicazione realizzata e il fatto che il livello di multithreading sia limitato dalla
memoria disponibile del dispositivo palmare.
Le precedenti considerazioni spingono ad ipotizzare che, per quanto riguarda gli
algoritmi multithread, Jeode abbia un maggiore overhead in termini di utilizzo della
CPU rispetto a CrEme la quale sembra avere un overhead maggiore in termini di
utilizzo della memoria rispetto alla prima piattaforma.
81
4.2.2.2 Prestazioni di un algoritmo multithread
La tabella 4.17 mostra i risultati medi ottenuti, per le varie piattaforme, al variare delle
dimensioni delle matrici.
Dim
20
50
100
110
145
150
Jeode
CrEme
SuperWaba Ewe
5137,3
1650,4
416,2
1000
36122,8
11797,2
13771
20900
138166
47549,9
213377,8
218200
170229,8
o.o.m.
316321,5
304300
297889,5
o.o.m.
o.o.m.
948500
347803,1
o.o.m.
o.o.m.
o.o.m.
Tabella 4.17 Tempi medi di esecuzione (in ms) dell’algoritmo multithread (o.o.m.- out of memory).
Le figure 4.4 e 4.5 evidenziano le differenze di prestazioni quando l’algoritmo
multithread è eseguito su tutte le piattaforma considerate.
1000000
900000
800000
700000
600000
ms 500000
400000
300000
200000
100000
0
Jeode
CrEme
SuperWaba
Ewe
20
50
100
110
145
150
Dimensione matrici
Figura 4.4 – Prestazioni dell’algoritmo al variare delle dimensioni delle matrici. L’assenza di una barra
vuol dire che la macchina virtuale corrispondente, ha prodotto una eccezione del tipo out of memory.
82
40000
35000
30000
25000
Jeode
CrEme
SuperWaba
Ewe
ms 20000
15000
10000
5000
0
20
50
Dimensione matrici
Figura 4.5 - Particolare della figura 4.4.
Dall’analisi delle figure si osserva che fino a quando la dimensione delle matrici non
supera un certo valore, le prestazioni migliori, in termini temporali, le offrono le
macchine virtuali Java-based. Si ricordi però che esse non offrono un vero e proprio
supporto al multithreading.
Al crescere delle dimensioni delle matrici, si nota che le piattaforme Java-based
cominciano a peggiorare le loro prestazioni nei confronti delle macchine Javacompliant. Questo perché aumentare le dimensioni delle matrici equivale ad accrescere
quadraticamente il numero di thread.
Differenziando l’analisi per le due famiglie di macchine virtuali, sia ha:
•
Java-based: Ewe risulta avere prestazioni migliori dal punto di vista dell’utilizzo
della memoria, l’applicazione eseguita sulla piattaforma Ewe lancia infatti una
eccezione out of memory per un valore maggiore delle dimensioni delle matrici
rispetto a SuperWaba. Quest’ultima ha, però, prestazioni migliori, dal punto di
vista temporale, finquando la dimensione delle matrici si aggira intorno al
centinaio.
•
Java-compliant: i risultati confermano le ipotesi fatte nell’analisi del livello di
multithreading, in relazione all’overhead e al tempo di cambio di contesto, degli
algoritmi multithread.
83
4.2.3 Tempo di chiamata a metodi
Il tempo di chiamata a metodi, è inteso in termini di:
•
tempo medio di chiamata di un metodo senza parametri;
•
tempo medio di chiamata di un metodo con un parametro elementare;
•
tempo medio di chiamata di un metodo con un parametro strutturato.
Nella tabella 4.18 sono riportati i risultati sperimentali ottenuti per le varie macchine
virtuali.
A
B
C
Jeode
CrEme
SuperWaba Ewe
1,40E-04
6,64E-04
1,59E-03
3,60E-03
1,45E-04
7,38E-04
1,75E-03
3,90E-03
1,43E-04
7,39E-04
1,75E-03
3,90E-03
Tabella 4.18 – Tempi medi di chiamata a metodi (in ms): A – senza parametri; B – con un parametro
elementare; C – con un parametro strutturato
In figura 4.6 meglio si evidenzia la comparazione tra i risultati ottenuti dalle differenti
piattaforme
84
Jeode
CrEme
SuperWaba
Ewe
4,00E-03
3,50E-03
3,00E-03
2,50E-03
ms 2,00E-03
1,50E-03
Ewe
SuperWaba
CrEme
1,00E-03
5,00E-04
Un parametro
strutturato
Jeode
Un parametro
elementare
Senza parametri
0,00E+00
Figura 4.6 – Tempi medi di chiamata a metodi (in millisecondi).
La figura precedente si commenta da sola, piuttosto è interessante avanzare l’ipotesi che
Jeode abbia un maggiore overhead in termini di utilizzo della CPU, seguita nell’ordine
da CrEme, SuperWaba ed Ewe.
85
4.2.4 Overhead delle macchine virtuali
Nella figura 4.7 è mostrata la comparazione dell’overhead, in termini di quantità media
di memoria utilizzata, dalle varie macchine virtuali.
4,00
3,00
Mb 2,00
1,00
0,00
Virtual Machine
Jeode
3,15
CrEme
2,65
SuperWaba
0,45
Ewe
1,30
Jeode
CrEme
SuperWaba
Ewe
Figura 4.7 – Runtime Memory.
Si noti che la macchina virtuale che fornisce la stima più bassa è SuperWaba. Un valore
così contenuto del runtime memory ed una esigua impronta di memoria, hanno favorito
lo sviluppo della piattaforma SuperWaba in un momento in cui i dispositivi mobili
erano molto modesti dal punto di vista delle risorse hardware.
86
4.2.5 Operazioni di I/O su file
Il tempo per le operazioni di Input/Output su file sono relative al tempo medio di
scrittura e al tempo medio di lettura
di un file, al variare delle dimensioni di
quest’ultimo.
4.2.5.1 Scrittura
La tabella 4.19 mostra i risultati medi ottenuti lanciando la relativa applicazione sulle
differenti macchine virtuali.
1 Mb
2 Mb
4 Mb
8 Mb
Jeode
85942,4
173465,8
344502
684094,9
CrEme
SuperWaba
127163,5
68521,1
249476,3
150381,2
506416,4
302278,8
966851,8
539380,6
Ewe
583500
1089800
2188900
4644700
Tabella 4.19 – Tempi medi di scrittura su file (in ms).
Jeode
CrEme
SuperWaba
Ewe
5000000
4500000
4000000
3500000
3000000
ms 2500000
2000000
1500000
1000000
Ewe
SuperWaba
CrEme
500000
0
1 Mb
2 Mb
Jeode
4 Mb
8 Mb
Figura 4.8 – Comparazione dei tempi medi di scrittura.
87
La figura 4.8 evidenzia che i tempi medi di scrittura su file hanno un andamento lineare
con la dimensione del file stesso.
Le prestazioni migliori le offrono, in ordine, le piattaforme SuperWaba e Jeode. Ewe
risulta essere poco efficiente per quanto concerne la scrittura su file.
4.2.5.2 Lettura
La tabella 4.20 mostra i risultati medi, ottenuti eseguendo la relativa applicazione sulle
differenti piattaforme.
Jeode
91498,1
201732,3
397884,6
769549,7
1 Mb
2 Mb
4 Mb
8 Mb
CrEme
SuperWaba
35272,7
68018
62568,8
138754,2
138718,9
282489,9
248284,7
548836,9
Ewe
57600
94900
196500
446900
Tabella 4.20 - Tempi medi di lettura su file (in msec).
800000
700000
600000
500000
Jeode
CrEme
ms 400000
SuperWaba
Ewe
300000
200000
100000
0
1 Mb
2 Mb
4 Mb
8 Mb
Figura 4.9 - Comparazione dei tempi medi di lettura.
Dalla figura 4.9 è possibile notare l’andamento lineare anche per l’operazione di lettura,
inoltre la piattaforma Ewe presenta tempi medi di lettura molto minori rispetto ai tempi
medi di scrittura (circa un ordine di grandezza).
88
4.2.6 Operazioni I/O su rete
In figura 4.10 è mostrata la comparazione dei valori medi delle stime del ritardo di rete,
per le differenti macchine virtuali:
8
6
ms 4
2
0
Virtual Machine
Jeode
4,822
CrEme
6,489
SuperWaba
3,492
Ewe
5,103
Figura 4.10 – Ritardo di rete (msec).
Le prestazioni migliori, in termini di ritardo di rete, risultano essere quelle di
SuperWaba. In relazione a tale risultato è importante osservare che la piattaforma
SuperWaba implementa metodi di lettura e scrittura direttamente sull’oggetto di tipo
socket5. È possibile, quindi, ipotizzare che questo aspetto concorra ad ottimizzare il
ritardo di rete della macchina virtuale.
5
Il metodo della lettura sulla socket, è non bloccante.
89
4.3 Metriche quantitative: valutazioni e confronto
In tale paragrafo è riportata una valutazione delle metriche qualitative definite, in
un’ottica comparativa.
4.3.1 Disponibilità
In tabella 4.21 è riportata la disponibilità delle macchine virtuali, per i principali sistemi
operativi per dispositivi palmari.
WindowsCE/PocketPC
PalmOS
Linux
Jeode
a
CrEme
a
a
a
SuperWaba
a
a
Ewe
a
a
Tabella 4.21 – Disponibilità delle macchine virtuali.
Si osservi che SuperWaba è l’unica piattaforma ad essere disponibile sia per i
dispositivi basati su WindowsCE/PocketPC sia su quelli basati su PalmOS, per contro
non è stata ancora implementata una versione per i linux PDA.
Le restanti macchine virtuali presentano invece uniformità di disponibilità, se si
considera che CrEme è la versione CE di JSCP e che quest’ultima è disponibile anche
per i sistemi linux.
90
4.3.2 Ciclo di sviluppo
Le applicazioni destinate ad essere eseguite sulle varie macchine virtuali, hanno cicli di
sviluppo differenti. In tale paragrafo è presentato un confronto tra i cicli di sviluppo.
Innanzitutto è possibile osservare una similitudine, dei cicli di sviluppo, in dipendenza
del fatto che essi siano relativi alle macchine Java-compliant o Java-based.
•
Java-compliant: Il ciclo di sviluppo di un’applicazione destinata ad essere
eseguita sulle piattaforme Jeode e CrEme, è analogo a quello di un’applicazione
da eseguirsi sul Java runtime. Tale caratteristica è quindi da considerarsi un
requisito desiderabile per quei programmatori che sono soliti sviluppare
applicazioni in Java.
•
Java-based: tali macchine virtuali hanno un ciclo di sviluppo più articolato
rispetto alle precedenti. Trattiamo separatamente i due ambienti:
o SuperWaba: è indispensabile la generazione dei file eseguibili. Tale
operazione è realizzata attraverso l’esecuzione di due applicazioni Java
(da computer desktop) che non hanno ambiente grafico.
o Ewe: la generazione del file eseguibile è auspicabile ma non
obbligatoria. Una applicazione può essere eseguita, sul dispositivo
palmare, anche a partire dal bytecode. In tal caso, però, è necessario che
il file in questione sia contenuto in una cartella di nome classes. Inoltre
l’applicazione per la generazione del file eseguibile è dotata di ambiente
grafico, per cui ha un impatto più immediato, sull’utente, rispetto alla
piattaforma SuperWaba.
91
4.2.3 Classi supportate
In tabella 4.22 è riportata una comparazione tra le tipologie di package messi a
disposizione dagli ambienti di esecuzione delle piattaforme considerate.
Java.lang
Util
I/O
Net
Zip
Reflect
Math
trattamento dei dati
RMI
Security
SQL
Applet
User Interface
Game API
Accesso registri di sistema
Visualizzazione dati GPS
Protocollo Garmin GPS
Classi specifiche per PPC e PalmOS
API di comunicazione tra PC e PDA
Jeode
a
a
a
a
a
a
a
a
a
a
a
a
a
CrEme
a
a
a
a
a
a
a
a
a
a
a
a
a
SuperWaba
a
a
a
a
a
a
a
Ewe
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
Tabella 4.22 – API a confronto.
Le macchine virtuali Jeode e CrEme sono molto simili dal punto di vista delle classi
supportate, d’altra parte sono entrambe Java-compliant: Jeode PDA Edition è
un’implementazione certificata di Personal Java, CrEme 4.0 è una implementazione
della configurazione CDC con il Foundation Profile e Personal Profile.
Le macchine virtuali Java-based forniscono API molto specifiche per i dispositivi su cui
sono disponibili. Inoltre esse hanno il supporto per le Game API (profilo non ancora
implementato dall’ambiente J2ME).
92
4.2.4 Interfaccia utente
In tabella 4.23 è evidenziato il tipo di interfaccia utente messo a disposizione da
ciascuna macchina virtuale. Va precisato che le piattaforme Ewe e SuperWaba hanno
interfacce grafiche che non sono propriamente le java swing, ma che sono paragonabili
ad esse in termini di funzionalità.
Jeode
Truffle
AWT
Swing
a
CrEme
a
a
opt
SuperWaba
Ewe
a
a
Tabella 4.23 – Interfaccie utente disponili sulle macchine virtuali (opt - opzionale).
Da notare che Jeode e CrEme sono analoghe anche dal punto di vista dell’interfaccia
utente, se si considera che le GUI Truffle sono una versione particolarmente leggera
delle AWT e si prescinde dalle Swing API che, sulla piattaforma CrEme, hanno una
installazione opzionale.
93
4.2.5 Compatibilità con Java
Per compatibilità con Java si intende, in tale contesto, l’entità delle modifiche che
bisogna apportare ad un codice sorgente, concepito per essere eseguito sul runtime Java
standard, affinchè esso possa essere eseguito sulle macchine virtuali per i dispositivi
mobili.
Per quanto riguarda le macchine virtuali java-compliant, la compatibilità è completa a
patto che nel codice di partenza siano state utilizzate classi supportate dagli ambienti di
esecuzione delle PDA virtual machine. Offrendo Jeode e CrEme le stesse API, esse
hanno lo stesso livello di compatibilità.
Discorso a parte meritano le macchine virtuali java-based, esse infatti non
implementano alcuna libreria java standard, per cui seppure il linguaggio di
programmazione per lo sviluppo delle applicazioni ha una sintassi java, è sempre
necessaria una modifica del codice sorgente.
Nell’ambito delle macchine Java-based, Ewe e SuperWaba sono profondamente diverse
nei riguardi della compatibilità con Java.
SuperWaba necessita di una vera e propria ristrutturazione del codice, ciò è evidente fin
da subito considerando il fatto che le applicazioni scritte per essa devono
obbligatoriamente estendere una classe, MainWindow, che è l’equivalente del metodo
main di Java.
Ewe, invece, pur non definendo librerie conformi alle specifiche Java standard, ha
dedicato particolare attenzione al processo di migrazione delle applicazioni Java in
applicazioni Ewe. Per cui per la conversione di un programma Java in uno Ewe, spesso
è sufficiente sostituire i package Java con i package Ewe e aggiungere, o modificare,
poche linee di codice dell’applicazione.
In definitiva Ewe ha un grado di compatibilità con Java, nettamente superiore rispetto a
SuperWaba.
94
Conclusioni
Il recente sviluppo di Java come vero e proprio linguaggio di programmazione,
accompagnato dall’ evoluzione e dal conseguente sviluppo di mercato dei dispositivi
palmari, accresce l’interesse riguardo l’uso di Java sui piccoli dispositivi.
L’attuale stato della tecnologia propone uno scenario alquanto eterogeneo, infatti i test
sperimentali eseguiti sul testbed hanno dimostrato che, a parità di sistema operativo,
non si ha uniformità di risultati nelle prestazioni delle differenti macchine virtuali.
Risulta quindi fondamentale l’implementazione delle java virtual machine, ma è
altrettanto basilare l’ottimizzazione delle API messe a disposizione da ciascuna
piattaforma.
Non è possibile eleggere una macchina virtuale principe in assoluto, ma è possibile
discernere in termini relativi in base ai requisiti dei dispositivi e al relativo campo di
impiego.
Ad esempio, se si dispone di dispositivi palmari di prima generazione, la scelta è in
pratica obbligata verso la piattaforma SuperWaba, il cui ridottissimo fabbisogno di
memoria ha per anni favorito la sua diffusione.
Se invece si hanno a disposizione palmari di ultima generazione e si richiede un reale
supporto al multithreading, è possibile scegliere tra le piattaforme Jeode e CrEme.
La prima ha un livello di multithreading più spinto, ma presenta un elevato overhead in
termini di utilizzo della memoria (il livello di multithreading è strettamente correlato
con la memoria disponibile). Tale aspetto merita particolare attenzione dal momento che
l’impronta di memoria di tale piattaforma ha dimensioni ragguardevoli.
La seconda ha invece un overhead, in termini di utilizzo della CPU, tale da innescare
dinamiche di trashing al crescere del numero di thread (il livello di multithreading è
limitato dall’elevato utilizzo del processore).
Infine resta da considerare il fatto che la piattaforma Ewe ha talvolta prestazioni, in
termini di tempo di esecuzione, nettamente inferiori rispetto alle altre macchine virtuali.
Essa fornisce, però, una interfaccia utente di tipo advanced similmente a SuperWaba e,
rispetto a quest’ultima, presenta una maggiore compatibilità con Java standard.
95
APPENDICE A
In tale appendice è descritto un esempio completo di installazione della piattaforma
SuperWaba sul dispositivo palmare, dell’emulatore sul computer desktop e lo sviluppo,
comprensivo del testing sull’emulatore, di un esempio semplice.
A.1 Istallazione di SuperWaba su PC Desktop (Windows 98 e superiori)
Si espleta attraverso i seguenti passi:
•
Copia della cartella SuperWabaSDK sul proprio disco di lavoro
(C:\SuperWabaSDK).
•
Creazione di una cartella di nome “SuperWaba” sul disco (C:\SuperWaba).
•
Copia nella cartella C:\SuperWaba dei seguenti file:
ü C:\SuperWabaSDK\lib\WIN32\SuperWaba.exe
ü C:\SuperWabaSDK\lib\XPLAT\SuperWaba.pdb
ü C:\SuperWabaSDK\lib\MSW.pdb oppure 5SW.pdb oppure HSW.pdb
oppure LSW.pdb oppure MSW2X.pdb
ü Ogni
altra
libreria
necessaria,
contenuta
nella
cartella
C:\SuperWabaSDK\lib\XPLAT
96
A.2 Installazione di SuperWaba sul palmare (Compaq iPAQ 3970)
Per installare la piattaforma sul dispositivo mobile è possibile seguire due strade:
•
Installazione automatica: è sufficiente disporre di un collegamento activeSync e
mandare in esecuzione, da postazione fissa, il file CEinstall_RunMe.bat
contenuto nella cartella C:\SuperWabaSDK\lib\CE.
•
Installazione manuale: bisogna copiare i seguenti file nella cartella \SuperWaba
del dispositivo:
ü SuperWaba.exe (Macchina Virtuale).
ü SuperWaba.pdb (API).
ü MSW.pdb (font).
ü Ogni altra libreria opzionale necessaria.
Il kit mette a disposizione diverse versioni della macchina virtuale a seconda del
tipo di processore del dispositivo mobile. La versione corretta è, nel nostro caso,
quella contenuta nella cartella C:\SuperWabaSDK\lib\ce\PocketPC\ARM.
97
A.3 L’applicazione
Si tratta del classico esempio HelloWorld. Il programma utilizza i seguenti oggetti,
appartenenti alle GUI API di SuperWaba:
ü un box per la visualizzazione di un messaggio di testo,
ü un tastino per la chiusura dell’applicazione;
ü un gestore di eventi.
Il codice completo è riportato di seguito:
HelloWorld.java
import waba.ui.*;
public class HelloWorld extends MainWindow
{
Button btnOff;
ListBox lb;
public HelloWorld()
{
super("Hello World!",TAB_ONLY_BORDER);
}
public void onStart()
{
add(lb = new ListBox(),LEFT, TOP+1);
add(btnOff = new Button("off"),RIGHT, SAME);
lb.setRect(LEFT,AFTER+3,FILL,FILL);
lb.add("Salve mondo, sono Ciccio!");
}
public void onEvent(Event e)
{
if (e.type == ControlEvent.PRESSED)
{
if (e.target == btnOff){
exit(0);
}
}
}
}
98
A.4 Compilazione e generazione degli eseguibili
La sequenza completa delle comandi è visualizzata in figura A.1:
Figura A.1 – Compilazione ed esecuzione. Comando Warp: c – crea; /c – override dell’identificatore
dell’archivio pdb. Comando Exegen: /e – crea eseguibile; /l – crea un link; /c deve essere lo stesso di
cui al comando Warp.
Assicurarsi di impostare correttamente i path di esecuzione e la variabile di ambiente
classpath. Di seguito si riportano i comandi necessari a configurare l’ambiente di
esecuzione sul computer desktop:
set PATH=C:\j2sdk1.4.1_01\bin;%PATH%
set CLASSPATH=%CLASSPATH%;C:\SuperWabaSDK\lib\SuperWaba.jar;C:
\SuperWabaSDK\Utils
Tali comandi possono essere lanciati da shell di windows oppure memorizzati in un file
batch.
99
A.5 Esecuzione
L’applicazione può essere mandata in esecuzione:
o sull’emulatore;
o sul dispositivo mobile;
o attraverso applet java.
•
Mediante emulatore SuperWaba sul PC desktop, attraverso il seguente comando:
C:\SuperWaba>superwaba HelloWorld HelloWorld aaaa
Figura A.2 – Esecuzione mediante emulatore .
100
•
Mediante applet sulla Java Virtual Machine, con il comado:
C:\SuperWaba\HelloWorld>java waba.applet.Applet HelloWorld
Figura A.3 – Esecuzione mediante applet.
•
Sul dispositivo palmare eseguiendo le azioni seguenti:
ü creare la cartella, \SuperWaba\HelloWorld , sul palmare;
ü copiare nella cartella precedente i file HelloWorld.pdb e HelloWorld.exe;
ü copiare il file HelloWorld.lnk in un directory qualsiasi del file system.
101
APPENDICE B
In tale appendice è descritto un esempio completo di installazione della piattaforma Ewe
sia sul dispositivo palmare sia sul computer desktop. Inoltre è presentato lo sviluppo di
un esempio semplice.
B.1 Istallazione di Ewe su PC Desktop (Windows version)
L’installazione della macchina virtuale Ewe, sulla propria postazione di lavoro, è
realizzata mandando in esecuzione il seguente file eseguibile, reperibile sul sito
ufficiale:
Ewe-Win32.exe
Inoltre bisogna essere sicuri di aver copiato, sul disco di lavoro, il file contenente le
librerie della piattaforma:
Ewe-Classes.zip
A tal proposito si consiglia di predisporre la macchina nel modo indicato in figura B.1:
Figura B.1 – Installazione delle cartelle della piattaforma Ewe.
102
B.2 Installazione di Ewe sul palmare (Compaq iPAQ 3970)
Installazione automatica: è sufficiente disporre di un collegamento activeSync e
mandare in esecuzione, da postazione fissa, il file Ewe-PocketPC-v130.zip.
B.3 L’ applicazione
Si tratta ancora una volta dell’esempio classico HelloWorld. Il programma utilizza un
oggetto, appartenente alle GUI API di Ewe, mediante il quale è possibile realizzare una
finestra di pop-up con una intestazione. Nella finestra si può visualizzare del testo e
inserire un tastino che chiude la finestra col mouse o attraverso la pressione del tasto
enter.
Il codice completo è riportato di seguito6:
HelloWorld.java
import ewe.sys.*;
import ewe.ui.*;
public class HelloWorld {
public static void main(String args[])
{
Vm.startEwe(args);
MessageBox mb = new MessageBox(
"Hello World",
"Salve Mondo, sono Ciccio!",MessageBox.MBOK);
mb.execute();
Vm.exit(0);
}
}
6
La prima e l’ultima istruzione del metodo main devono essere rispettivamente Vm.startEwe(args) e
Vm.exit(0).
103
B.4 Compilazione e generazione degli eseguibili
La generazione del bytecode, a partire dal file sorgente, è realizzata attraverso un
qualsiasi compilatore Java. Assicurarsi di impostare correttamente i path di esecuzione e
la variabile di ambiente classpath. Di seguito si riportano i comandi necessari a
configurare l’ambiente di esecuzione sul computer desktop:
set PATH=C:\j2sdk1.4.1_01\bin;%PATH%
set PATH=C:\Program Files\Ewe;%PATH%
set CLASSPATH=%CLASSPATH%;C:\ewe\Ewe-SDKClasses-v130\classes\EweClasses.zip
Tali possono essere lanciati da shell di windows oppure memorizzati in un file batch.
Il file eseguibile ha estensione “ewe” sia per il dispositivo mobile che per il PC, e può
essere lanciato a patto di aver installato correttamente le rispettive macchine virtuali.
Il file eseguibile si ottiene dal bytecode attraverso il programma Jewel.ewe.
104
Figura B.2 – Jewel.ewe: consente di generare gli eseguibili per la piattaforma Ewe.
Il file Jewel.ewe si trova nella directory C:\ewe\Ewe-SDKUtilities-v130\programs.
In figura B.2 è riportata un’istantanea del processo di generazione del file
HelloWorld.ewe, mentre in figura B.3 è riportato l’insieme dei file che sono necessari
alla generazione del file eseguibile.
Figura B.3 – Preview Files
105
B.5 Esecuzione
Se l’applicazione è senza parametri d’ingresso, allora la generazione del link non è
necessaria, basta copiare il file HelloWorld.ewe sul dispositivo palmare e lanciarlo come
qualsiasi altro programma eseguibile.
Se invece l’applicazione prevede parametri è necessario creare un collegamento
all’applicazione mediante il Launcher della macchina virtuale Ewe, ewe.exe, che si
trova nella cartella C:\Program Files\Ewe.
Figura B.4 – La Ewe VM, si presenta sottoforma di Launcher.
L’applicazione può essere mandata in esecuzione anche senza la generazione
dell’eseguibile:
o Su PC: lanciando il comando C:\ewe HelloWorld;
o Su PDA: copiando il file HelloWorld.class in una cartella sul palmare di nome
classes e riferendo tale file tramite il launcher della macchina virtuale.
Figura B.5 – Salve Mondo!
106
Bibliografia
[Pressman]
R. Pressmam, “Principi di Ingegneria del Software”, Terza
edizione,
McGraw-Hill, 2000.
[Jeode]
http://www.insignia.com/, Insignia Solutions.
[CrEme]
http://www.nsicom.com/, NSI Group.
[SWaba]
http://www.superwaba.com.br/.
[Ewe]
http://www.ewesoft.com/.
[HaOCon]
I. Haque, B. O’Connor, “J2ME Enterprise Development”, Wiley
US, 2002.
[J2ME]
http://java.sun.com/j2me/, Sun Microsystems
[JCP]
http://www.jcp.org/, Java Community Process
[J2SE]
http://java.sun.com/j2se/, Sun Microsystems
[JSCPTM]
NSICom, The JSCP Thread Model, 1999
[Herbert]
S. Herbert, “Java 2: la guida completa”, quinta edizione, McGrawHill, 2003
[Fadini]
A cura di B. Fadini, “Sistemi Informatici e Calcolo Parallelo”,
Franco Angeli, 1991
[Tanenbaum]
A. S. Tanenbaum, “Reti ci calcolatori”, quarta edizione, Addison
Wesley, 2003
107