PAJC
Qui trovate tutte le informazioni e il materiale del mio corso di Programmazione Avanzata Java e C.
Il corso
PAJC è un corso del secondo anno di Ingegneria Informatica: 88 ore, 40 di lezione e 48 di laboratorio.
Al termine del corso lo studente sarà in grado di progettare e realizzare applicazioni Java grafiche e distribuite, in grado di funzionare in rete: giochi interattivi, sistemi di simulazione, comunicazione. Se Java è il linguaggio con cui costruiremo sistemi complessi, il C serve a capire come quei sistemi sono realizzati a livello macchina; alla fine del corso i due mondi si toccano, con Java che chiama il C.
Si lavora con Java 21 o superiore ed Eclipse, e con C17 (gcc o clang) e Visual Studio Code. Le interfacce grafiche sono in Java Swing.
Dove sta il materiale
- Dispense: una per argomento, in PDF, escono durante il corso.
- Slide: quelle proiettate a lezione e in laboratorio, da sfogliare nel browser, in PDF o da telefono.
- Esercizi: i sorgenti Java e C degli esercizi di laboratorio, nel repository GitHub max-ai4res/pajc-lab27, aggiornato lezione per lezione.
- Modalità esame ed esiti degli appelli.
Programma Java
J1) Ripasso e Java moderno
- approccio Java alla programmazione a oggetti: classi, ereditarietà, polimorfismo, tipo statico e tipo dinamico
- interfacce come protocolli
instanceofcon pattern matchingequalsehashCode- enumerazioni e macchine a stati con switch expression
- collezioni: ArrayList, Set, HashMap
- gestione delle eccezioni e try-with-resources
- lettura e scrittura di file
- i tool di sviluppo: java, javac, Eclipse, git
J2) Dal nome alla funzione
- classi anonime, lambda expression, method reference
- interfacce funzionali e il catalogo di
java.util.function - le interfacce a fondo: metodi default, static e private; Comparator come modello
- classi sealed e switch esaustivo
J3) Stream
- pipeline, laziness e ordine di valutazione
- Collectors, groupingBy, reduce, flatMap, toList
- Optional
J4) Interfacce grafiche con Java Swing
- il pattern Observer e l'Event Delegation Model
- eventi semantici e di basso livello, listener
- componenti, container e layout manager
- componenti custom per composizione, eventi custom con EventListenerList
- il componente che si disegna da solo:
paintComponente le primitive grafiche - sistemi di riferimento e trasformazioni di coordinate
- interazione con mouse e tastiera, animazioni con Timer
J5) I thread
- processi e thread; Runnable e Callable
- ExecutorService, Future, shutdown; partizionamento del lavoro
- sincronizzazione: synchronized e monitor, lock, oggetti atomici
- attività schedulate
- virtual thread
- Swing e i thread: Event Dispatch Thread, invokeLater, SwingWorker
J6) MVC
- Model-View-Controller sul codice del corso: BaseModel, PropertyChangeSupport
- eventi come record
- integrazione della comunicazione client/server nel modello MVC
J7) Espressioni regolari
- Pattern e Matcher
- integrazione con gli stream
J8) Comunicazione client/server
- l'essenziale di TCP/IP; i Socket in Java
- il server: da sequenziale a multithread a un virtual thread per client
- protocolli testuali di comunicazione
- client full-duplex a riga di comando e client grafici MVC
- HttpClient
J9) Reflection e codice a runtime
- ispezione di classi e invocazione dinamica
- compiler API: la calcolatrice che impara operatori nuovi a runtime
J10) Java e C insieme
- Foreign Function & Memory API: Java chiama il C compilato in laboratorio
- dove finisce il client/server: architetture a livelli, API, cloud
Programma C
C1) Puntatori e memoria
- puntatori:
&e*, aritmetica, dualità con gli array - stringhe
- stack e heap; passaggio dei parametri
- allocazione dinamica: malloc e free, e gli errori da evitare (leak, dangling pointer, double free)
C2) Dati e funzioni
- struct, typedef, union ed endianness, campi di bit
- puntatori a funzione e callback; qsort con il comparatore
- macro con parametri
C3) La memoria, e come funziona Java sotto
- allocazione dinamica avanzata
- il confronto con la JVM: stack per thread, heap, garbage collector
- direttive di precompilazione
- Makefile e struttura di un progetto C
C4) Strutture dati e algoritmi
- stack, code e code circolari
- liste concatenate
- ricerca sequenziale e binaria
- algoritmi di ordinamento
Laboratorio
In laboratorio si lavora a tappe: un tema proposto in step, qualche minuto di lavoro autonomo per step, poi analisi collettiva e soluzione scritta dal vivo in Eclipse, che a fine lab finisce nel repository. Sui model puri compaiono anche i test JUnit.
I filoni dell'anno: la calcolatrice, dalla riga di comando agli operatori caricati a runtime; la Dama; Mandelbrot con rendering multithread; una chat client/server con client Swing; Asteroid; e i lab in C su stack, liste e matrici.
Come scaricare e importare i progetti è spiegato nella pagina Laboratorio.