Post on 30-Jun-2015
description
transcript
IcedTeaLa macchina virtuale
Java libera
Vitalij Zadneprovskijvitalij_zad@libero.it
@vitalijzad
Java User Group Roma@JugRoma
Immagine: Iced Tea di Melissa Doroquez
Mi presento● Nato in Kyrgyzstan, cresciuto a
Santa Marinella● Appassionato di computer da
sempre● Ho scoperto GNU/Linux nei primi
anni 2000● Leader del Java User Group
Roma da un anno● Studio informatica al corso di
laurea magistrale della Sapienza● Lavoro come consulente
informatico da sei anni
Foto: http://skillstorm.com
Cosa si può fare con Java: FreeCol
Cosa si può fare con Java: Vuze
Cosa si può fare con Java: NASA World Wind
Di cosa parlerò● Compilatori, macchine virtuali ed
intepreti● Quali macchine virtuali ci sono e
come sono fatte● Quali compilatori e quali macchine
virtuali ci sono per Java● L’evoluzione della Java Virtual
Machine da proprietaria a quasi libera
● Arriva IcedTea per completare la liberazione di Java
● Quali linguaggi possono essere compilati per la JVM American Storytellers di Andy Thomas
Come faccio a districarmi con tutti questi linguaggi?
Esempio di codice macchina● L’unica cosa che un computer può eseguire direttamente è il codice
macchina● Il codice macchina è una sequenza di comandi ed argomenti● Per una persona, scrivere in codice macchina può essere molto difficile
Configure, make, install:il compilatore
● Il codice sorgente è comprensibile dagli esseri umani
● Il codice macchina è comprensibile ed eseguibile direttamente dai computer
● L’assembly è appena più leggibile del codice macchina
● Di solito il compilatore trasforma il codice sorgente in codice macchina
● Può fare ottimizzazioni per uno specifico processore
● Cambiando tipo di processore o sistema operativo, il codice macchina smette di funzionare
● Alcuni compilatori producono codice macchina, altri producono codice per macchine virtuali
Logo della GNU Compilers Collection
Immagine: Principles of computer organization and Assembly language : using the Java virtual machine / Patrick Juola
Il codice macchina e i tipi di processore
Esempio di linguaggio di programmazione
Che cosa fa un interprete● Legge il codice sorgente e lo esegue:
– Direttamente
– Producendo una rappresentazione intermedia
– Compilandolo al volo appena prima di eseguirlo
● Tra i linguaggi che hanno un interprete ci sono PHP, Python, Ruby, Perl, Groovy e Scala
● Per alcuni linguaggi, c’è sia l’interprete che la macchina virtuale
● Avere un interprete non esclude la possibilità di produrre linguaggio macchina
● C’è un transpilatore da PHP a C++ e poi codice macchina, detto HipHop
● Un interprete può eseguire anche il bytecode
Cosa è una macchina virtuale?
● Il computer, dagli specialisti, viene detto “macchina”
● Una macchina virtuale è una astrazione di una macchina reale
● I dettagli della macchina reale vengono nascosti
● Un programma “compilato” può girare su macchine diverse e su sistemi operativi diversi
● Il sistema operativo astrae driver, lettura e scrittura di file, ed altro
● Di fatto, una macchina virtuale è un interprete, perché esegue il bytecode
● Le VM hanno prestazioni inferiori rispetto al codice macchina
Immagine: BMW Car Wireframe di hasansgrafix
La macchina virtuale ei tipi di processore
Immagine: Principles of computer organization and Assembly language : using the Java virtual machine / Patrick Juola
Quali macchine virtuali ci sono?● Dot Net
– Common Language Runtime di Microsoft
– Mono, sulla quale Gnome ha puntato
● Java– HotSpot ed HotSpot Zero
– Jikes Research Virtual Machine
– Dalvik, per Android
● Low Level Virtual Machine, usato da Mac OS X ed iOS, parte di XCode
● Parrot per linguaggi dinamici● Dis per il sistema operativo Inferno, è una
macchina virtuale a registri, con un set di istruzioni complesso ed a tre operandi
● Squeak, dialetto di Smalltalk
Approcci a confronto
Codicesorgente
Editor di testoo IDE
Compilatore perCodice macchina
InterpreteCompilatore per
bytecode
Codicemacchina
Bytecode perMacchina virtuale
Macchinavirtuale
Sistema operativo: GNU/Linux, BSD, OpenIndiana, Android, OSX, Windows
L’approccio di Android
Edvard Munch, L’urlo, Museo Munch di Oslo
Editor di testo o IDE
Codice sorgente
Compilatore per bytecode
CompilatorePer Dalvik
CompilatoreAndroid Runtime
Codicemacchina
MacchinaVirtuale Dalvik
Android
Come è fatto il bytecode?
Ricapitoliamo● Un listato di codice sorgente può
essere interpretato, compilato in codice macchina o compilato in bytecode
● Per diversi linguaggi di programmazione c’è più di una opzione
● La macchina virtuale è una alternativa interessante per la portabilità del compilato su processori e sistemi operativi diversi
● Ci sono tante macchine virtuali molto diverse tra di loro, anche se l’approccio a pila è il più diffuso
Il linguaggio Java● Linguaggio orientato ad oggetti e
recentemente anche funzionale● Linguaggio statico● Secondo linguaggio più diffuso al
mondo, dopo il C● Moltissime librerie open source● Diverse aziende hanno realizzato
prodotti e ci sono vari progetti di ricerca● Inizialmente pensato per piccoli
dispositivi, lavatrici, etc● Utilizzato come linguaggio web
soprattutto nelle medie e grandi imprese
La macchina virtuale a pila● C’è una pila della quale possiamo conoscere
ed eseguire operazioni solo sugli elementi che stanno in cima
● Non possiamo sapere nulla degli altri elementi che sono nella pila
● Ogni volta che viene eseguito un metodo, viene creato un frame con le variabili di quel metodo, frame che poi alla fine viene distrutto
● L’alternativa è quella della macchina a registri detta anche a nastro
● L’approccio a pila permette di avere del bytecode molto compatto e dei compilatori più semplici
● I difetti sono più accessi alla memoria, più istruzioni da eseguire e degli interpreti leggermente più lenti
Immagine: mypuzzlecollection.blogspot.com
Hotspot e OpenJDK
● Java era completamente closed fino al 2006, quindi nacque il progetto Classpath per creare una JVM open
● Nel 2007 quasi tutto il sorgente di compilatore e macchina virtuale viene rilasciato sotto licenza GPL: nasce OpenJDK
● OpenJDK è scritto in C++ ed ha 10mila righe di codice assembly, che ne limita la portabilità, supporta i processori x86, x86-64, SPARC e ARM
● Alcuni componenti di OpenJDK sono comunque proprietari, come i font, elementi grafici, software per la crittografia
GNU Classpath e IcedTea● Gnu Classpath aveva lo scopo di
reimplementare per intere le librerie Java prima che diventassero open source
● Iced Tea: rimozione delle 10mila righe di codice assembly da HotSpot creando HotSpot Zero
● Fornire degli strumenti di build che possano essere usati dalle varie distribuzioni GNU/Linux
● Implementare una versione open di Java Web Start, dei componenti per il suono, dei font e degli elementi grafici
● IcedTea supporta Alpha, ARM, IA-64, MIPS, PowerPC, x86, x86-64 e zSeries
Fonte: https://duke.kenai.com/SunRIP/
Zero, Shark e la LLVM
HotSpot ZeroCompilatore
Shark
Rappresentazione intermedia
CompilatoreJust in Time
LLVM
Bytecode Java
Codice macchina
Altre caratteristiche di IcedTea● IcedTea-Web per le applet● IcedTea-Sound con integrazione con
PulseAudio● La macchina virtuale si chiama Zero Hotspot● Compilatore just-in-time chiamato Shark e
basato su Low Level Virtual Machine che per determinati pezzi di bytecode genera del codice macchina anziché interpretare
● Per usare IcedTea non bisogna accettare nessun contratto EULA
● IcedTea viene usato da altre VM come CacaoVM e JamVM
● Qualsiasi linguaggio che ha un compilatore che produce bytecode JVM può essere eseguito su IcedTea
Portare un linguaggio sulla JVM?● Abbiamo visto che la macchina virtuale
esegue il bytecode● Basterebbe un compilatore che a partire
da un altro linguaggio creasse bytecode ● E’ stato fatto in diversi casi e parecchi
linguaggi hanno un compilatore per bytecode
● Alcuni di questi compilatori non sono molto attivi e mantenuti frequentemente
● La JVM è pensata originariamente per linguaggi statici
● Per permettere una buona esecuzione dei linguaggi dinamici sono state fatte modifiche alla JVM
Pieter Brueghel il Vecchio, La torre di BabeleKunsthistorisches Museum di Vienna
Il linguaggio di programmazione Groovy● Linguaggio dinamico, caratteristiche
simili a Smalltalk, Python, Perl e Ruby
● Ha anche delle funzionalità della programmazione funzionale che permettono di fare alcune cose in modo molto più compatto
● "I can honestly say if someone had shown me the Programming in Scala book [...] back in 2003 I'd probably have never created Groovy."
● James Strachan che ha fondato il linguaggio, ha silenziosamente lasciato il progetto
Il linguaggio funzionale Clojure● Linguaggio funzionale puro● Un dialetto del linguaggio di
programmazione Lisp● Stati immutabili e modifiche dei
valori espliciti lo rendono molto utile per lo sviluppo di programmi concorrenti
● I problemi di concorrenza nascono quando c’è uno stato condiviso che viene modificato da diversi agenti
● Notazione di Lisp, molto diversa da quella usata da C e Java
Il linguaggio multi-paradigmaScala
● Scala sta per Scalable Language● Linguaggio che cerca di unire il
paradigma ad oggetti a quello funzionale
● Il progetto di questo linguaggio nasce dalle critiche alla progettazione di Java
● Anche se Java 8 ha introdotto alcuni elementi dei linguaggi funzionali, rimane molto conservativo rispetto a Scala
● Parecchie librerie e framework Java sono stati sviluppati in Scala
Jython: Python sulla JVM● Il Python è nato nel 1991 con
l’obiettivo di essere compatto e leggibile
● Jython nasce nel 2001 sopratutto per il codice che richiede alte prestazioni
● Il progetto fratello si chiama IronPython e gira su CLR, cioè .net / mono
● Ha un IDE chiamato PyDEV● Lo sviluppo non è molto attivo,
richiede persone che conoscano contemporaneamente Python e la JVM
Jruby: il porting di Ruby● Ruby nasce a metà degli anni ‘90 come
linguaggio dinamico e multi paradigma● Ruby è ispirato a Perl e Python e cerca
di essere un linguaggio semplice da usare ed orientato ad oggetti
● JRuby nasce nel 2001 e dimostra subito di avere delle prestazioni migliori di Ruby, poi Ruby farà dei progressi ed oggi hanno prestazioni simili
● Rispetto a Ruby, JRuby ha il vantaggio di avere dei thread reali che permettono esecuzioni più veloci, ma non è l’unico, anche IronRuby, che gira su CLR (dot net o mono) ce li ha
Facciamo il punto● C’è una versione libera della JDK, ma
ha dei componenti proprietari, codice assembly e necessita di strumenti di compilazione proprietari
● IcedTea nasce per risolvere questi problemi ed è diventato la macchina virtuale Java predefinita in tutte le distribuzioni
● La componente di build viene usata anche da altre macchine virtuali
● E’ una macchina virtuale a pila ● Supporta diversi linguaggi oltre a Java,
alcuni dinamici, altri con elementi di programmazione funzionale Immagine: Ice Milk and Lemon Teas - Chilli Cafe di Alpha
Libri e siti internet per approfondire● Randall Hyde, Write Great Code, Volume 2 , No starch press● Wallace Wang, Beginning Programming All-In-One Desk
Reference For Dummies, Wiley● DonaldOJDK Blog, Understanding the various JDKs● Gary Benson, Zero and Shark● Jan S. Rellermeyer, Ramon Küpfer: Co-managing Software
and Hardware Modules through the Juggle Middleware. Middleware 2011: 431-450
● Linux Applications And Administration, Ashok Kumar Arnal● Neal Ford, Functional thinking O'Reilly Media
Grazie! Domande?
George Wyllie - question mark sculptures on the River Clyde