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

Programma Java

J1) Ripasso e Java moderno

  • approccio Java alla programmazione a oggetti: classi, ereditarietà, polimorfismo, tipo statico e tipo dinamico
  • interfacce come protocolli
  • instanceof con pattern matching
  • equals e hashCode
  • 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: paintComponent e 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.