1. INTRODUZIONE AL CORSO - Programma: * richiami su sintassi e semantica * richiami su programmazione imperativa: controllo, strutture dati, procedure * strutturazione dei programmi: tipi, incapsulazione, moduli * programmazione logica * programmazione object-oriented * programmazione concorrente * programmazione funzionale, lambda-calcolo, type inference - Laboratorio: * esercizi con diversi linguaggi con correzione e discussione in classe - Riferimenti bibliografici: * Programming Languages: Concepts and Constructs by Ravi Sethi (Addison-Wesley Publishing Company, 1996) * eventualmente altri su argomenti specifici 2. INTRODUZIONE - cenni storici: lo sviluppo dei PL * FORTRAN e ALGOL60 * linguaggi imperativi * linguaggi funzionali e logici * linguaggi concorrenti * linguaggi object-oriented spesso i PL combinano aspetti appartenenti a piu' paradigmi - Studiare pochi concetti invece di tanti linguaggi - PL and computer architectures * low-level PL (sfruttare l'architettura) * high-level PL (controllare la complessita') * computational paradigms: imperative, functional, logic [,concurrent] * organizational paradigms: ADT, object-oriented, moduli, programmazione strutturata, tipi strutturati - il contesto in cui sono utilizzati PL: * processo dello sviluppo SW (modello a cascata): 1) requirements analysis and specification (WHAT) 2)?SW design (WHAT/HOW) -> design specification 3)!implementation/coding (WHAT/HOW) -> codice eseguibile 4) verification/validation 5)!maintenance/evolution * PL and SW development environment - editors, static checking (tipi, variabili non inizializzate) - compilers, libraries - interpreters, debuggers, simulators * PL and SW design methods - structured design - top-down design - object-oriented design * PL qualities reliability (minimizzare errori di programmazione) - writability - readability - simplicity - safety (e.g. no goto or pointer arithmethic) - robustness (e.g. error handling facilities) maintainability (facilitare le modifiche ai programmi) - factoring (e.g. using procedures, modules) - locality effeciency (produrre codice macchina efficiente) - optimizing compilers - profiling (per identificare hot-spots) - il problema di garantire anche reusability and portability