Informatica 3: Novità

Quest'area è dedicata agli aggiornamenti relativi al corso di Informatica 3.

Eccezioni e Parallelismo

Nella lezione del 10/10, abbiamo trattato due concetti relativi alla gestione del flusso di controllo di un programma.

Le eccezioni sono un meccanismo di controllo del flusso che generalizza le condizioni di errore, permettendo l'uscita dal flusso di controllo base per passare ad un blocco di gestione dell'errore, in modo analogo a quanto accade per la gestione degli interrupt a livello di sistema. Si notino le differenze sintattiche nella gestione delle eccezioni in C++ e Java.

Per quanto riguarda il parallelismo, abbiamo distinto tre metodi di gestione:

  • Coroutine, usate per l'esecuzione parallela cooperativa attraverso il supporto da parte del linguaggio di programmazione (generalmente attraverso una keyword yield); sono funzioni caratterizzate dall'avere punti di accesso e ritorno multipli.
  • Processi (visti in parte in Informatica 2, verranno trattati in maggior dettaglio in Laboratorio Software nella Laurea Specialistica).

In particolare, abbiamo visto che i thread in Java sono supportati attraverso una libreria, data dalla classe Thread, con i metodi run, start, join, e stop.

Per permettere la gestione dell'accesso ai dati condivisi in mutua esclusione (ovvero da parte di un solo thread alla volta), si usa un meccanismo noto come monitor, realizzato in Java in forma passiva (ovvero il monitor non è a sua volta un thread), attraverso i metodi synchronized, che, quando invocati, assegnano il diritto di accesso all'oggetto al solo thread che ha eseguito l'invocazione.

Abbiamo poi visto che in Ada, invece, l'implementazione dei monitor è attiva, ovvero il monitor è un thread (o task in Ada) che offre servizi di accesso ai suoi dati privati. Per la sintassi del linguaggio, si veda l'Ada Programming Wikibook, e in particolare il capitolo sui task.

· 2007/10/10 10:30 · Giovanni Agosta

Passaggio di parametri e Template

Nella lezione dell'8/10 abbiamo visto la gestione delle chiamate a funzione dal punto di vista del passaggio dei parametri (per valore, per riferimento, per copia e valore ritornato, per nome). Abbiamo inoltre introdotto le principali strutture dati (tipi primitivi, tipi composti) e le strutture dati astratte. Per finire, abbiamo introdotto i template in C++.

Qui trovate alcune slide con una introduzione al C++, e in particolare ai template.

Semantica operazionale delle chiamate a funzione

Nella lezione del 6/X/2008 abbiamo analizzato le strutture di un linguaggio di programmazione, a partire dagli identificatori. Distinguiamo due tipi principali di identificatori, variabili e funzioni (notate però che anche le etichette sono identificatori). In linea di principio, entrambi sono caratterizzati da nome, spazio di visibilità, tipo, indirizzo e valore. Abbiamo anche visto, però, che in molti casi alcuni di questi elementi possono essere assenti, o cambiare durante la vita del programma.

Nella seconda parte della lezione, abbiamo visto come usare un semplice linguaggio simile ad un assembler (SIMPLESEM) per definire la semantica operazionale di un linguaggio di alto livello simile al C, partendo da una versione molto semplificata, senza chiamate a funzione, per poi aggiungere questa caratteristica in vari passi. Completeremo la discussione di questo argomento mercoledì prossimo, aggiungendo i linguaggi C4 e C5.

Operational semantics of function calls

In the first part of this lecture, we have introduced the main elements of a programming language, variables and functions, represented as tuples of five elements (name, scope, type, address/l-value, value/r-value).

In the second part, we have introduced a simple assembly-like language, SIMPLESEM, to define the operational semantics of a high-level language similar to C. We have then shown the operational semantics of the C1, C2 and C3 toy languages, respectively composed of: simple constructs only (no function calls); non-recursive function calls; and recursive function calls.

Introduzione

Nella prima lezione (1/X/07), abbiamo seguito l'evoluzione dei linguaggi di programmazione, dalle origini (Fortran, COBOL e ALGOL) ai linguaggi moderni (C, C++, Java e Python), accennando anche ai linguaggi non legati al modello di Von Neumann (LISP, Prolog).

Abbiamo inoltre introdotto i concetti di sintassi e semantica di un linguaggio di programmazione, formalizzando la semantica attraverso espressioni regolari e grammatiche libere dal contesto, secondo lo schema sviluppato da Backus per l'ALGOL, e poi adottato per la specifica di tutti i linguaggi di programmazione, ovvero la forma normale di Backus-Naur (BNF).

Introduction

A short history of programming languages, from the origins (Fortran, COBOL and ALGOL) to modern languages (C, C++, Java and Python). While these languages cover mostly the Von Neumann paradigm, other languages do not (LISP, Prolog).

In the first lecture, we have introduced the elements of a programming language. More formally, we can group them into regular expressions (modelling the “words” of the language) and context free grammars (modelling the syntax of the language), following the scheme developed by Backus for ALGOL, and later adopted by most language developers as the Backus-Naur Form (BNF).

· 2007/10/02 10:33 · Giovanni Agosta
teaching/info3/blog.txt · Last modified: 2007/09/13 16:50 by agosta
Recent changes RSS feed Creative Commons License Donate Driven by DokuWiki