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 ----- 
  From: Giacomo Tesio 
  To: nexa@server-nexa.polito.it 
  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 <giac...@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

Reply via email to