Giacomo, la tua macchina è decisamente
degenere come programmazione:
- (Pseudo)istruzioni di un solo bit;
- Incapacità di operare su dati ("esegue" un
"programma" copiando l'input nell'output: è irrilevante che in ingresso ci sia
un bit e in uscita una lampadina; di fatto è un amplificatore, non un computer,
...perché non "computa" niente);
- Perfetta per considerare qualunque dato
un'istruzione; questo sì (è l'unica cosa che fa).
Non mi è chiaro a cosa vuoi
arrivare.
E' un fatto che ogni set di istruzioni sia in
numero limitato (le tue "istruzioni" sono due). Se e solo se il numero di
istruzioni è pari alla potenza di due del numero di bit con cui si codificano
(ed è il tuo caso: 2^1 = 2), allora qualunque dato è un'istruzione.
Ad es. se prendi un byte (8 bit), e costruisci un
set di 256 istruzioni, viene fuori una macchina un po' più furba della tua: se
poi ogni indirizzo è compatibile con la memoria disponibile (anche questo è
facile da ottenere), allora hai una macchina che esegue qualsiasi
cosa.
Però la vera domanda è: "...E ALLORA?" ("...SO
WHAT?").
Dopo aver inventato tu l'acqua tiepida, e io
l'acqua calda, non mi sembra che andiamo molto lontano...
Ribadisco il mio punto: (inizio di) "istruzione" è PER DEFINIZIONE l'indirizzo a cui
punta il program counter.
Se poi la macchina "esegue" o "si pianta", ...è
tutto un altro discorso.
Puoi costruire una macchina con 3 istruzioni
"serie" codificate in 8 bit più 253 NOP (not operation, ovvero istruzioni
fasulle che mandano solo avanti il program counter) per riempire tutti gli spazi
di codifica degli 8 bit, ma di nuovo, ...E ALLORA?
----- Original Message -----
Sent: Thursday, September 12, 2024 4:42
PM
Subject: Re: [nexa] "pogrammazione
statistica" o "intelligenza artificiale"? [era: AI Training is Copyright
Infringement]
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