Macchina onnisciente (?)
Una macchina capace di rispondere a richieste di qualsiasi tipo, di risolvere qualsiasi problema
Non esiste e non potrà mai esistere (teoremi di incompletezza)
Macchina dedicata
All’estremo opposto, una macchina progettata per svolgere un compito specifico.
La macchina riceve i dati e svolge le operazioni prestabilite per ottenere la risposta.

Tutti i dispositivi elettronici, con una parte digitale, sono macchine dedicate (forno a microonde, decoder, distributore automatico, …).
Macchina programmabile
Una macchina che può essere predisposta, tramite un certo programma, per risolvere un certo problema

Esempi: macchina di Turing, modello di Von Neumann, computer, calcolatrice programmabile, console per videogiochi, …)
Algoritmo
Ogni esecutore ha un insieme diverso di istruzioni ma i problemi sono sempre gli stessi…
È utile separare la fase di risoluzione del problema dalla scrittura delle istruzioni.
In questo modo lo stesso metodo risolutivo, algoritmo, può essere tradotto in innumerevoli programmi.

Si introducono due figure: il risolutore e il programmatore
- Il risolutore svolge il lavoro più difficile, individuare l’algoritmo per un certo problema.
- Il programmatore traduce l’algoritmo in programma utilizzando un certo linguaggio di programmazione.
Compilatore
Tra il programma e l’esecutore, compaiono il file sorgente e il file oggetto.

Il programmatore utilizza
- l’editor per scrivere il file sorgente
- il compilatore per tradurre da alto livello a basso livello e produrre il file oggetto.
Il compilatore produce un file oggetto compatibile con una certa piattaforma.
Linguaggi di programmazione compilati: C/C++, COBOL, FORTRAN, Pascal, …
Nella realtà della programmazione si utilizzano molti altri strumenti (interprete, linker, debugger, IDE, RAD, …)
Il linker
In alcuni casi il file oggetto non è ancora pronto per essere eseguito perché deve essere integrato con delle librerie di codice precompilate.

Dopo il passaggio del linker si ottiene finalmente il file eseguibile.
L’interprete
L’interprete è un software eseguito dall’esecutore reale che emula il comportamento di un esecutore virtuale.
L’interprete scorre il programma, legge, traduce ed esegue (tramite l’esecutore reale) la singola istruzione.

Linguaggi di programmazione interpretati: BASIC, Javascript, LISP, PHP, Python, …
La macchina virtuale
La tecnica della macchina virtuale ha permesso la diffusione di applicazioni eseguibili su tutte le piattaforme.

Si produce un unico file oggetto (bytecode) che viene eseguito dalla macchina virtuale (plug-in, player, …) installata sulla piattaforma
- Flash player: Actionscript
- Java Virtual Machine: Java
- …
