Scusa Giuseppe, evidentemente la mia dimostrazione per costruzione non è stata abbastanza chiara. On Thu, 12 Sep 2024 09:04:12 +0200 Giuseppe Attardi wrote:
From: Giacomo Tesio <giacomo@tesio.it>
ho qui una macchina programmabile che ad ogni ciclo legge un nuovo bit dal programma caricato e chiude un circuito se il bit vale 1, mentre lo apre se vale 0.
Il tuo programma esegue istruzioni che leggono dei dati qualunque, non eseguono quei dati. Il fatto che quei dati siano una *rappresentazione* in un certo formato di istruzioni non li fa eseguire dalla tua macchina, perché non passano dal suo interprete (CPU), ma dalla sua ALU.
Programma? CPU? ALU? No, no... io parlo di una macchina fisica! Utilizza due pile stilo e puoi costruirtene una anche tu! Sono sufficienti: - un buon vecchio mangianastri, di quelli analogici senza alcuna diavolerie informatica (bonus point se rotto e con più di 30 anni :-D) - una porta seriale femmina - un relè normalmente aperto - cavetti, resistenze, amplificatori e quelle robe lì. Connetti la seriale ai cavi dell'ingresso audio e i controlli del relé all'uscita audio (se necessario, aggiustando propriamente il segnale). Se sei buono con l'elettronica, puoi anche costruirtelo da zero, a partire da due induttanze, un motorino, qualche interruttore etc... (io non lo sono per nulla e infatti non l'ho montata io) Per programmare questa macchina ci metto dentro una cassetta (la memoria) e connetto la seriale al mio laptop. Poi semplicemente imposto il baud rate della seriale a 8, premo il pulsante REC e avvio il comando `cat file.jpeg > /dev/ttyS0` Quando il comando ritorna aspetto ancora qualche secondo e poi interrompo la registrazione. Ora che il mio file.jpeg è caricato sulla macchina, non mi rimane che farglielo eseguire: connetto il circuito che preferisco ai contatti del relè e schiaccio play. La mia macchina programmabile esegue il file.jpeg senza alcuna esitazione, dall'inizio alla fine, aprendo e chiudendo il circuito esattamente come previsto. Se ci carico sopra un eseguibile COFF o un ELF, lo esegue senza indugi, esattamente come fa con la tua mail.
L’architettura Von Neumann e la MTU...
Definiscono sottoinsiemi delle macchine programmabili. Ma una macchina programmabile è qualsiasi macchina il cui comportamento possa essere cambiato "without changing a single wire" [1].
No, qualunque sia la macchina, esiste un dato (anzi infiniti) che non sono interpretabili da quella macchina, o, se vuoi, che danno errore se eseguiti.
Bene, ti sfido: inviami un file non vuoto che la mia macchina non riesca ad eseguire, così ci avrai dimostrato che
L’insieme delle rappresentazioni dei programmi è un sottoinsieme stretto di quello dei dati.
Altrimenti sapremo che "data is code <=> code is data". Inoltre, se ci riesci, ti offro una birra (o un caffé, se preferisci). Se ti arrendi, la offri a me. Ci stai? Quando ce la beviamo?
Le Vector Reducing Machine effettuano operazioni matriciali su vettori e matrici, le matrici non eseguono alcunché.
Le VRM hanno un vettore in input e producono un vettore in output. Come effettuano questa mappatura è determinato precisamente dalle matrici che gli carichi dentro, esattamente come il comportamento della mia macchinetta dipende dai byte che gli carico dentro. Sono realizzate in modo diverso, programmate in modo diverso e usate in modo diverso, ma entrambe sono macchine programmabili. (fino a prova contraria... che attendo con ansia! :-D) Giacomo [1] Dijkstra scriveva "the general purpose computer is no more than a handy device for implementing any thinkable mechanism without changing a single wire", ma non tutte le macchine programmabili sono general purpose. Purtuttavia eseguono programmi. https://www.cs.utexas.edu/~EWD/transcriptions/EWD08xx/EWD898.html