Esistono diverse piattaforme Java per diversi domini applicativi. Fra diverse piattaforme cambia il set di librerie disponibili e l’ambiente runtime (JVM).
Una distribuzione Java può o meno includere gli strumenti per lo sviluppo (SDK). Nel primo caso si parla di Java Development Kit (JDK), nel secondo di Java Runtime Environment (JRE).
Data una piattaforma, possono esserci più implementazioni ad esempio, per Java SE, con caratteristiche diverse (ad esempio, prestazioni e utilizzo della memoria): OpenJDK (HotSpot), Eclipse OpenJ9, GraalVM, Codename One
Data una implementazione, possono esserci più distribuzioni (binari pre-built) della JVM che possono contenere anche delle modifiche minori fra loro. Ad esempio, per OpenJDK: Temurin (Adoptium), DragonWell (Alibaba), Corretto (Amazon), Zulu (Azul), Liberica (BellSoft), Oracle, RedHat, Microsoft, JetBrains…
Include il necessario per eseguire applicazioni Java,
ossia il JRE con virtual machine (java
) e relative librerie,
più gli strumenti di sviluppo, fra cui:
compilatore (javac
),
documentatore (javadoc
),
impacchettatore (jar
),
e disassemblatore (javap
).
Java SE 21 – ultima versione Long-Term Support (LTS) a disposizione prima dell’inizio del corso
Faremo riferimento a OpenJDK standard (che fa da reference)
Come distributore di riferimento, raccomandiamo Adoptium (https://adoptium.net/)
I sistemi operativi (S.O.) odierni consentono di memorizzare permanentemente le informazioni su supporti di memorizzazione di massa (dischi magnetici, dispositivi a stato solido…)
Il file system è l’insieme di metodi e strutture dati impiegati dal S.O. per controllare l’accesso e la memorizzazione dei dati.
Le informazioni sono organizzate in file e cartelle (livello logico):
La cartella più esterna (contenente tutte le altre) è la radice (root) che rappresenta il livello gerarchico più alto del file system
/
C:
, D:
)File e cartelle possono essere individuati da un percorso o path
Il percorso può essere assoluto, ossia partire dalla root:
/home/user/frameworkFS.jar
(percorso Unix assoluto)C:\Windows\System\win64.dll
(percorso Windows assoluto)Oppure relativo relativo ad un certo punto del filesystem:
.
la cartella corrente e con ..
la cartella di livello superiore./src/main/java/HelloWorld.java
(percorso Unix relativo, equivalente a src/main/java/HelloWorld.java
)../Downloads/myapp.jar
(percorso Unix relativo, che risale, come primo passo, alla cartella superiore)L’utente può osservare e manipolare il file system:
Il software grafico che consente di osservare e manipolare il file system prende il nome di file manager.
explorer.exe
)ATTENZIONE: alcuni file manager (specialmente explorer.exe
) sono preimpostati per nascondere informazioni utili
e possono trarre in inganno!
Soluzione: meglio fidarsi dell’interprete comandi…
Programma che permette di interagire con il S.O. mediante comandi impartiti in modalità testuale
Lo vedrete in maniera esaustiva nel corso di Sistemi Operativi…
Alcuni esempi
Panoramica delle differenze: http://www.faqs.org/faqs/unix-faq/shell/shell-differences/
L’interprete comandi storico è rappresentato dal programma cmd.exe
(C:\Windows\System32\cmd.exe
)
Versioni recenti hanno introdotto PowerShell, basato su .NET e C#
Da Windows 10 è possibile installare Linux dentro Windows usando Windows Subsystem for Linux (WSL2)
Più avanti vedremo che lo strumento che useremo per fare controllo di versione installa un proprio emulatore bash.
cmd
$\Rightarrow$ cliccare su cmd.exe
git bash
Avviare WSL tramite collegamento “Lancia WSL” presente nella cartella “WSL” del Desktop
Tasto destro sul file $\to$ Esegui con PowerShell (rispondere “T” alla domanda sui criteri d’esecuzione, e attendere)
Questa è una shell nativa Linux preconfigurata dal docente
Operazione | Comando Unix | Comando Win |
---|---|---|
Ottenere aiuto / elenco comandi | help |
help |
Visualizzare la directory corrente | pwd |
echo %cd% |
Contenuto della directory corrente | ls -alh |
dir |
Passare alla directory di nome baz |
cd baz |
cd baz |
Passare alla directory superiore | cd .. |
cd.. |
Cambiare unità disco (passare a D:) | – | D: |
Eliminare il file foo (non va con le cartelle!) |
rm foo |
del foo |
Eliminare la directory di nome bar |
rm -r bar |
rd bar |
Creare una directory di nome baz |
mkdir baz |
md baz |
Copiare il file foo in bar |
cp foo bar |
copy foo bar |
Spostare (rinominare) il file foo in bar |
mv foo bar |
move foo bar |
Creare un file vuoto di nome foo |
touch foo |
echo. > foo |
Visualizzare il contenuto del file foo |
cat foo |
type foo |
Interrompere il processo corrente (segnale SIGINT ) |
CTRL+C | CTRL+C |
I terminali moderni possono essere utilizzati in modo piuttosto efficace (in particolare se moderni e opportunamente personalizzati).
Quasi tutti i terminali offrono la possibilità di effettuare autocompletamento, ossia chiedere al sistema di provare a completare un comando.
Sia Bash/zsh che cmd offrono la possibilità di richiamare il comando precedente premendo .
È possibile interrompere forzatamente un programma, qualora non risponda per vari motivi o non si voglia attenderne la normale terminazione (Esempio tipico: programma in loop infinito).
SIGINT
).È possibile mostrare i comandi usati in precedenza. Le shell Unix memorizzano i comandi usati anche in sessioni precedenti.
history
, su cmd, usare F7cd
(change directory)Compilazione di un file (comando javac
)
javac NomeFileSorgente.java
È possibile usare la shell expansion per passare più file alla volta al compilatore:
javac *.java
Esecuzione di un programma Java (comando java
)
java NomeDellaClasse
Si noti che il compilatore traduce file sorgente in file binari, mentre l’interprete Java (la Java Virtual Machine) esegue una ed una sola classe.
javac
(il compilatore) lavora su file, java
(l’interprete) su classijshell
: Java REPLA partire da Java 9, è stata introdotto in java l’interprete REPL jshell
jshell
consente di effettuare al volo compilazione ed esecuzionejshell
non è magico: dietro le quinte compila in memoria, quindi lancia l’interprete sul bytecode risultante
I seguenti errori sono comuni se non è chiaro cosa facciano interprete e compilatore:
java NomeClasse.java
(l’interprete non lavora su file)
java path/to/NomeClasse.class
(l’interprete non lavora su file)Siano $z,w \in \mathbb{C} : z = a + ib,\ w = c + id$, allora: