(a) Le risposte a questo esercizio possono essere le piu' varie. Certamente e' possibile vedere un cellulare come una macchina astratta. La parte dati della memoria contiene per esempio i numeri di cellulare dei nostri amici. Non sembra ragionevole pensare ad una parte programmi della memoria. L'interprete della macchina astratta infatti, anziche' prelevare ed eseguire le istruzioni memorizzate attendera' all'inizio del suo ciclo che l'utente fornisca un'istruzione da eseguire. Un comportamento di questo genere e' tipico degli interpreti per i linguaggi di programmazione funzionale. Riguardo le altre componenti, difficile pensare che possa esserci la componente controllo di sequenza. Ma dipende da che tipo di telefonino avete in mente. Anche sul controllo trasferimento dati non mi vengono in mente particolari strutture dati o algoritmi corrispondenti a tale componente della macchina astratta. Ma anche qui, dipende dal telefonino che avete in mente. Per esempio, se quando eseguite l'istruzione di aggiornamento della memoria dati, il vostro telefonino potrebbe avvertirvi che state scrivendo in una posizione che contiene gia' un numero di telefono sognificativo. In questo caso la componente trasferimento dati dovrebbe avere una struttura dati che permetta di conservare l'informazione in quali posizioni sono contenute informazioni significative. La fase di memorizzazione del risultato dell'interprete utilizzera' tale struttura dati. (b) Possiamo per esempio implementare una macchina astratta completamente nuova o estendere quella che abbiamo. Un possibile esempio di estensione potrebbe essere quella di aggiungere un'istruzione che per esempio chiama uno dopo l'altro tutti i numeri di telefono di persone che hanno un numero dispari di lettere nel loro cognome. Bisogna pero' fare attenzione ad una difficolta': nel linguaggio del nostro telefonino non possiamo scrivere un interprete per la nuova macchina astratta, ne' realizzare la nuova macchina astratta per compilazione, poiche' non possiamo scrivere programmi composti da varie istruzioni. Quindi in realta' per costruire una nuova macchina astratta dobbiamo agire sul livello sottostante. Per esempio sviluppando un interprete in hardware, ma magari utilizzando per la realizzazione delle nuove istruzione le istruzioni gia' presenti sul nostro telefonino. Insomma, purtroppo le cose non sono quasi mai semplici e lineari.