MokaByte 59 - Gennaio 2002 
Il mondo java embedded
I parte: Java 2 Micro Edition,
un caffè......ristretto
di
Marco Tomà
Java 2 Micro Edition è la soluzione Java per l'elettronica di consumo e per la programmazione dei dispositivi embedded. Introduciamo, in questo articolo, quelle che sono le caratteristiche principali e la struttura dell'architettura

Java 2 Micro Edition: un ritorno alle origini
Nel dicembre del 1990 nacque all'interno di Sun MicroSystem un progetto denominato "Green Project", il cui principale obiettivo consisteva nello sviluppare software per l'elettronica di vasto consumo. Questo mercato richiedeva prodotti semplici, affidabili e di basso costo. Inoltre i prodotti per l'elettronica di consumo dovevano essere il più possibile "neutrali" rispetto alla piattaforma usata: quest'ultima caratteristica dava la possibilità di produrre, su vasta scala, apparati elettronici con le più svariate CPU senza ricorrere, per ognuna di essa, ad un software dedicato. Se oggi possiamo dire che la piattaforma Intel compatibile è lo standard de-facto nel mondo dei PC, nel 1990 non esisteva un analogo standard nel mondo dei piccoli dispositivi elettronici; ed oggi la situazione non è cambiata di molto.
Il tentativo di estendere il C++ per renderlo indipendente dalla piattaforma si rivelò ben presto un fallimento, rendendo necessario lo sviluppo di un nuovo linguaggio di programmazione: nacque così Oak. Il linguaggio non riuscì però ad affermarsi nel settore dell'elettronica di consumo soprattutto per ragioni di carattere commerciale.
Agli inizi del 1994 l'attenzione dei responsabili del "Green Project" fu indirizzata verso il World Wide Web, che, nato al CERN nel 1992 e presto diffusosi in tutto il mondo, aveva aperto Internet all'interesse del grande pubblico. Con il WWW si riproponeva, seppure in modo differente, il problema dell'indipendenza dalla piattaforma, anche tenendo conto che Sun era ed è un produttore di piattaforme basate su microprocessori concorrenti rispetto al prodotto dominante di Intel. Il linguaggio Oak fu rivisto e modificato per renderlo adatto allo sviluppo di programmi che potessero essere eseguiti da un client WWW.
Nel maggio del 1995 Sun Microsystem decise la distribuzione della versione alpha di Oak. Il marchio Oak era però già utilizzato e occorreva un nuovo nome: forse con poca fantasia, fu scelto Java, che in slang americano vuol dire "tazza di caffè" (americano!), con l'evidente riferimento alla macchina distributrice di bevande calde di cui probabilmente i ricercatori di Sun facevano frequente uso.
Negli anni successivi Java ha avuto una notevole diffusione prima nel mondo client, attraverso la realizzazione di applet, e poi soprattutto nel mondo server, grazie alle tecnologie servlet ed EJB (Enterprise Java Beans), che permettevano la realizzazione di servizi WWW e sistemi di back-end. Questa grande differenziazione ha spinto Sun a creare tre diverse "edizioni" (edition) di Java, che pur rimanendo basate grossomodo su virtual machine compatibili ed un insieme di API di base, si sono differenziate a seconda del loro target. Le "edition" sono state introdotte con il rilascio di Java2, e "partizionano" piattaforme, API, e strumenti di sviluppo in tre differenti gruppi ognuno dei quali indirizzato ad un ben preciso segmento di mercato:

  • Java 2 Enterprise Edition (J2EE), fornisce un insieme di API per la realizzazione di architetture solide, complete e scalabili, dirette, soprattutto, ad applicazioni server;
  • Java 2 Standard Edition (J2SE), rappresenta il core del linguaggio Java ed è indirizzata allo sviluppo di applicazioni ed applet sul lato client;
  • Java 2 Micro Edition (J2ME), studiata appositamente per l'embedded e per l'elettronica di consumo;

A distanza di sei anni dalla sua "nascita", Java si è riaffacciato, con la Micro Edition, al settore embedded per il quale era stato concepito, con la consapevolezza che la situazione di questo mercato è molto differente da allora: sicuramente molto più "matura" e preparata ad un suo utilizzo. In realtà un certo interesse verso il mercato embedded, Java lo aveva sempre dimostrato, aldilà delle sfortunate sorti del linguaggio Oak. Sun Microsystem, insieme ad alcuni suoi partner e sviluppatori indipendenti ha creato nel tempo tutta una serie di moduli e API che estendono le caratteristiche standard di Java permettendo l'utilizzo del linguaggio anche nel settore embedded (PersonalJava, JavaPhone, JavaTV, Embedded Java). Non si trattava però di un progetto ben delineato e definito, ma di un insieme di moduli, tra loro poco (o per niente) correlati, studiati per rispondere a ben determinate esigenze. J2ME, al contrario, non è indirizzata a singole piattaforme ma, in generale, al settore embedded tutto, la sua architettura e le sue specifiche sono ben delineate ed è essa stessa una versione standard di Java. Naturalmente il fatto che J2ME sia dedicata a tutto il mercato embedded non vuol certo dire che possa essere utilizzata con qualunque tipo di apparecchiatura e in qualunque contesto. La sua struttura modulare ed espandibile permette però di coprire una vasta gamma di piattaforme (apparati) embedded: dai PDA ai cellulari, dai navigatori satellitari a TV digitali con i vantaggi che il linguaggio Java può portare. Uno degli aspetti più interessanti e apprezzati di Java è sempre stato il suo alto grado di portabilità e il suo livello di astrazione dall'hardware, che J2ME mantiene ed estende ad un settore, quello dell'elettronica di consumo, davvero ricco di piattaforme differenti.

 

 

Java, il settore embedded e l'elettronica di consumo
La diffusione di palmari, pager, agende elettroniche, cellulari, smartphone, navigatori satellitari rappresenta ormai una realtà di mercato consolidata. Questi dispositivi vengono collocati in quello che viene definito mercato o settore dell'elettronica di consumo, vale a dire in tutti quegli apparati che ci circondando nella vita quotidiana: elettrodomestici, sistemi di intrattenimento domestico (apparati hi-fi, videoregistratori, televisori, TV satellitari, videogame), telefonia, ecc.. Si parla anche di mondo "embedded": non esiste una definizione precisa del termine, ma con esso si indicano sistemi elettronici a microprocessore, spesso dotati di un hardware progettato ad hoc, concepiti per una determinata applicazione. Tali sistemi possono operare in autonomia o essere, in qualche modo, legati ad altri apparati. Il significato del termine è quindi molto generico e riguarda dispositivi molto eterogenei che si differenziano per complessità dell'hardware e del software, dimensioni e naturalmente per le funzioni per le quali sono stati realizzati. L'idea di disporre di tecnologie integrate con l'ambiente che ci circonda (in inglese per l'appunto embedded) non è un fenomeno recente ma, è un processo iniziato parecchi anni orsono e interessa sempre più gli oggetti di uso comune.
Certamente questo progressivo aumento nell'uso di apparati elettronici, e in particolare di dispositivi digitali, non riguarda solo l'elettronica di consumo e l'ambito domestico, ma è un processo che coinvolge gran parte della realtà che ci circonda. L'elettronica di consumo è forse il settore dove la tecnologia e il suo reale potenziale sono più visibili e alla portata di tutti.
Dal punto di vista della programmazione questa "eterogeneità estrema" del settore embedded fa nascere l'esigenza di dover disporre di strumenti (API, tool di sviluppo, ecc.) dedicati per ogni singola piattaforma hardware. Sembra difficile quindi poter mantenere quel proverbiale "Write once, run anywhere" che da sempre accompagna il linguaggio Java. D'altronde le differenze tra un cellulare e una Web TV sono quelle che sono.....
La sistuazione però non è così critica. Non è poi un gran problema commerciale se un applicativo per cellulare, ad esempio per inviare e-mail, non gira nel microcontrollore di un videoregistratore! Può però esserlo se dello stesso applicativo occorre scriverne una versione per cellulari Nokia, una per Motorola, per Ericsson, Panasonic .........e magari più versioni per ogni marca, in modo da coprire tutta la gamma dei prodotti, con l'aumento dei costi che ne consegue. Di fronte ad un simile scenario, è evidente come un'unica soluzione Java, intesa coma una Virtual Machine e un insieme di API, non sarebbe stata una scelta ottimale: avrebbe comportato da un lato l'esclusione di tutti quei dispositivi con requisiti inferiori a quelli minimi richiesti, dall'altro non avrebbe permesso il pieno sfruttamento degli apparati più dotati.
Occorreva quindi un'architettura scalabile e modulare che permettesse di coprire il più possibile la gamma dei dispositivi del settore sfruttandone le differenti caratteristiche: J2ME appunto.

 

 

L'architettura J2ME
Queste caratteristiche di modularità e scalabilità vengono garantite in J2ME attraverso i concetti di Configurazioni e Profili:

Figura 1 - I layer dell'architettura J2ME.

  • Configurazioni - definiscono le caratteristiche di base del linguaggio Java e della Virtual Machine per un insieme di dispositivi, forniscono un insieme di librerie di base comuni per più categorie di apparati (es. Cellulari, PDA, smartphone);
  • Profili - si basano su una configurazione, ne estendono le funzionalità di base, fornendo API addizionali e tools di sviluppo per una particolare categoria di dispositivi (es PDA). Le applicazioni scritte per un dato profilo sono portabili ed eseguibili su qualunque dispositivo che lo supporti;
  • Le configurazioni, quindi, sono dirette ad un insieme di apparati e non ad una specifica categoria, mentre i profili sono qualcosa di più "legato" al dispositivo stesso. Prendendo come riferimento l'intero settore embedded si può dire che, mentre le configurazioni eseguono un "raggruppamento" dei dispositivi in senso orizzontale, i profili lo fanno in senso verticale.




Figura 2 - Configurazioni e profili di J2ME.


Va detto che sebbene i profili siano diretti ad una particolare segmento di mercato il loro utilizzo è in realtà flessibile: un dispositivo può supportare più profili, spetta quindi al programmatore la scelta di utilizzare quello più idoneo e conveniente per la realizzazione di una data applicazione.
Talvolta infatti un profilo, seppure dedicato ad una categoria di dispositivi differente può risultare particolarmente adatto alla realizzazione di un applicativo (utilizzo "orientato all'applicazione"), quando è invece necessario utilizzare le caratteristiche proprie dei vari dispositivi è necessario ricorrere al profilo dedicato (utilizzo "orientato al dispositivo"). Occorre aggiungere che, per le loro caratteristiche intrinseche alcuni profili risultano più "device-specific" (es. PDA Profile, MID Profile) di altri (es. Foundation Profile, PersonalProfile, RMI Profile) che possiamo definire invece "application-specific".

 

 

Configurazioni
Abbiamo detto che le configurazioni raggruppano i dispositivi "orizzontalmente" cioè, stabiliscono le caratteristiche della macchina virtuale e forniscono librerie di base per un insieme di dispositivi con risorse hardware simili. Le attuali configurazioni previste da J2ME suddividono il variegato settore embedded in due grandi segmenti. In base alle caratteristiche dei vari apparati possiamo distinguere:

  • dispositivi a uso esclusivamente personale, mobili, che necessitano di connessioni a reti in modo non continuo. In questa categoria rientrano i telefoni cellulari, i pager, i PDA, cioè tutti quei dispositivi caratterizzate da un'interfaccia utente molto semplice, ridotte disponibilità di memoria (tipicamente 128 Kbyte - 2 Mbyte), limitate capacità di elaborazione, basso consumo di energia e connessioni a reti di telecomunicazione di tipo wireless con modesta larghezza di banda.
  • dispositivi condivisi, fissi, che necessitano di connessioni a reti in modo continuo. Tipici esempi di apparecchiature che rientrano in questa categoria sono Web TV, telefoni capaci di accedere ad Internet, ricevitori televisivi satellitari, communicator, sistemi di navigazione per auto. Tutti questi dispositivi, essendo installati in modo fisso, non risentono dei tipici problemi dei dispositivi portatili (o addirittura tascabili) come peso, dimensioni e consumi di energia e possono, quindi, contare su dotazioni di memoria anche notevoli (da 2 Mbyte a 32 MByte), processori veloci e performanti e connessioni continue a reti con ampia larghezza di banda.

Naturalmente, il confine che separa queste due categorie non è, e certamente non può essere, netto. Tuttavia questa suddivisione è importante soprattutto per tenere in considerazione alcune caratteristiche hardware fondamentali del dispositivo sul quale il software dovrà funzionare quali:

  • la potenza di calcolo e la disponibilità di memoria;
  • la presenza o meno di un display e le sue caratteristiche;
  • le tipologie di connessione a reti di TLC;

E' proprio sulla base di questi parametri che J2ME ha implementato le sue due attuali configurazioni, ossia:

  • CLDC (Connected Limited Device Configuration) - è dedicata a dispositivi con memoria minima di circa 128 Kbyte (RAM e ROM), processori (RISC/CISC) a 16-32 bit, basso consumo e funzionamento tipicamente a batteria, connessioni non continue a reti eterogenee, sovente di tipo wireless con larghezza di banda limitata (spesso uguale o inferiore a 9600 bps). La Virtual Machine prevista per questa configurazione è la KVM (Kilobyte Virtual Machine), ossia una macchina virtuale Java studiata per apparecchi con memoria totale dell'ordine dei Kbyte (il core della KVM occupa da 32 a 80 Kbyte).
  • CDC (Connected Device Configuration) - è studiata per dispositivi hardware che dispongono di almeno 2 MByte totali di memoria (RAM e ROM), processori a 32 bit, di connessioni persistenti a reti TLC con ampia larghezza di banda e interfacce grafiche anche molto sofisticate. La virtual Machine utilizzata per questa configurazione è la CVM (C Virtual Machine).

La CLDC può essere considerata come una versione "alleggerita" della CDC. Abbiamo visto che le configurazioni forniscono un set minimo di librerie di base: alcune di queste costituiscono un sottoinsieme di package della Standard Edition altri, sono state realizzate appositamente per la Micro Edition (figura 3).


Figura 3 - Configurazioni J2ME e Standard Edition.


Tutto ciò è molto importante: ci dice che in realtà J2ME altro non è che Java "ridisegnato" per piattaforme "non convenzionali", con un set minimo di API ridotto e con alcune Java Extension dedicate, adatto a funzionare in apparati tra loro molto differenti e anche con risorse limitate. Questo garantisce la compatibilità "verso l'alto", con le versioni "maggiori". Il bytecode della J2ME, infatti, resta perfettamente compatibile con quello delle altre versioni (questo non avviene ad esempio con tecnologie alternative come Waba, un linguaggio di programmazione per dispositivi palmari, molto simile a Java, ma con un bytecode non compatibile. Vedi articolo MokaByte numero 33 del settembre 1999). Non solo: nonostante alcune limitazioni e differenze rispetto alla Standard Edition, dovute al target di dispositivi a cui è diretta, J2ME mantiene inalterate tutte le caratteristiche principali del linguaggio, non si tratta quindi di una versione "speciale" per dispositivi particolari ma di Java "puro".

Profili

Le funzionalità di base garantite dalle configurazioni però non bastano per realizzare un applicativo. Prendiamo ad esempio un cellulare. La configurazione dedicata è la CLDC: questa ci mette a disposizione un insieme di librerie di base che permettono di "utilizzare Java" (java.lang), di gestire gli stream di I/O (java.io), ci fornisce tutta una serie di classi di utilità (java.util) e ci da la possibilità di comunicare (javax.microedition.io).
E l'iterazione con l'utente ?....le interfacce grafiche ?.... Il salvataggio dei dati? E ancora: come si arriva all'eseguibile per cellulare partendo dal classico .java? A tutto questo è chiamato a rispondere il profilo. Esso si occupa di gestire tutte quelle problematiche più strettamente collegate al tipo di apparato, come la gestione dei dispositivi di Input/Output, il salvataggio persistente dei dati nelle memorie non volatili, la realizzazione di UI e fornisce tools di sviluppo per una determinata categoria di dispositivi (in questo caso i cellulari). I profili si suddividono in base alla configurazione per la quale sono stati realizzati. Quelli attualmente previsti (non tutti attualmente disponibili) sono:

per la configurazione CDC:

  • Foundation Profile: profilo per dispositivi che richiedono una completa implementazione della Java Virtual Machine e includono quindi tutte le API della J2 Standard Edition;
  • RMI Profile: questo tipo di profilo, come indicato dal nome, include un sottoinsieme di API RMI (Remote Method Invocation) della J2SE, in modo da garantire un certo grado di interoperatività con altre virtual machine sia J2ME sia J2SE;
  • Personal Profile: è l'estensione dell'ambiente PersonalJava di Sun e garantisce una piena compatibilità con le applicazione sviluppate con le versioni 1.1.X e 1.2.X di PersonalJava Application Enviroment;

per configurazione CLDC:

  • PDAP: il Personal Digital Assistant Profile è il profilo dedicato ai dispositivi palmari. Tali apparati devono avere almeno 512 Kbyte di memoria (RAM + ROM) e un display con risoluzione totale di almeno 20.000 pixel;
  • MIDP: il MIDP (Mobile Information Device Profile) è un profilo dedicato a dispositivi wireless come telefoni cellulari, smartphone e pager;

Risulta subito evidente uno dei vantaggi derivanti dalla scalabilità e dalla modularità di J2ME: è possibile implementarne nuovi profili senza modificare le configurazioni di base esistenti con una conseguente riduzione dei tempi di sviluppo e dei costi di realizzazione.
Con questa prima puntata abbiamo definito i concetti fondamentali del mondo J2ME. Nei prossimi articoli esploreremo più in dettaglio le configurazioni ed i profili più interessanti ed illustreremo alcuni esempi di programmazione reale.


Bibliografia

  • http://java.sun.com/j2me/ Sito "ufficiale" di J2ME, dal quale è possibile scaricare configurazioni e profili della J2ME con relativa documentazione. Contiene inoltre numerosi link ad altre tecnologie Java dirette al settore embedded;
  • http://www.billday.com/j2me/index.html Il punto di riferimento (...o di partenza) per tutti gli sviluppatori J2ME, dove è possibile scaricare documentazione, tool di sviluppo, emulatori, nonché il codice sorgente di molte applicazioni;
  • http://archives.java.sun.com/archives/kvm-interest.html Una delle migliori (e più "attive") mailing-list su J2ME dove potrete trovare molte risposte alle vostre domande;


Marco Tomà si occupa di programmazione Java dal 1998. Si è interessato a Java 2 Micro Edition sin dal primo rilascio avvenuto nel 1999, in particolare si è occupato dello sviluppo di applicazioni Java per dispositivi palmari PalmOS. E' contattabile all'indirizzo mtoma@mokabyte.it.

MokaByte® è un marchio registrato da MokaByte s.r.l. 
Java®, Jini® e tutti i nomi derivati sono marchi registrati da Sun Microsystems; tutti i diritti riservati 
E' vietata la riproduzione anche parziale 
Per comunicazioni inviare una mail a info@mokabyte.it