Conversione di una libreria usando una intelligenza artificiale generativa

Come programmatore sono piuttosto riflessivo: raramente scrivo codice di getto e prima di arrivare alla stesura finale ho valutato almeno due o tre soluzioni differenti in base a vantaggi e svantaggi.

Insomma per me programmare è una cosa molto diversa dallo scrivere codice e fino ad ora non ho trovato grossi benefici nell’usare l’intelligenza artificiale generativa.

Pochi giorni fa, però, si è presentata l’occasione perfetta: per un progetto di automazione a cui sto lavorando mi serviva convertire una libreria scritta per MicroPython in normale Python.

La libreria serve per controllare tramite protocollo I2C (IIC) delle schede di relè che usano il chip XL9535 e per farlo utilizza la classe ‘I2C’ del modulo ‘machine’.

Il codice è presente qui: https://github.com/mcauser/micropython-xl9535-kxv5-relay.

il modulo ‘machine’, però, è presente in MicroPython ma non in Python. Di qui la necessità della conversione.

Premessa

Per capire meglio cosa era necessario fare dobbiamo approfondire un po’ come funziona il protocollo I2C.

Dovendo essere usato in sistemi con poca capacità computazionale è un protocollo seriale, non molto veloce, che usa due fili (SCL, SDA) come bus di comunicazione. Poi, naturalmente, ci sono alimentazione e massa (Vcc e GND).

La comunicazione viene iniziata dal dispositivo ‘master’ che indica allo ‘slave’ (individuato da un indirizzo a 7 bit) se è richiesta una scrittura o una lettura e di quale registro dello ‘slave’.

Le comunicazioni I2C sono quindi sequenze di comandi (di lettura o scrittura) inviati dal ‘master’ allo ‘slave’, che viene identificato dal suo indirizzo.

La conversione da MicroPython a Python

Fondamentalmente per convertire la libreria era necessario capire come sostituire il modulo ‘machine’ del MicroPython, e in particolare la sua classe ‘I2C’, con qualcosa presente in Python.

Il codice della libreria è breve per cui l’ho copiato e incollato nel prompt del chatbot (ho usato Copilot di Github) e poi ho chiesto di convertirlo in Python utilizzando il modulo ‘busio’.

In Python esistono diversi moduli che sarebbero potuti andare bene ma dato che già utilizzavo ‘busio’ per comunicare con altre schede non mi sembrava il caso di aggiungere ulteriori dipendenze e ho chiesto di usare quello.

La prima proposta che ha fatto Copilot è stata di sostituire la classe ‘I2C’ del modulo ‘machine’ di MicroPython con la ‘I2C_Device’ del modulo ‘busio’ di Python. Quest’ultima è una classe con un livello di astrazione più alto e, ad esempio, l’indirizzo della scheda viene definito all’inizio e non è più necessario ripeterlo tutte le volte.

Però, forse perché ‘I2C_Device’ prevede chiamate leggermente diverse ha complicato le letture e scritture originarie con delle chiamate a due funzioni intermedie che a loro volta richiamavano quelle per la lettura e scrittura (stiamo parlando di funzioni di due righe).

In più, cosa abbastanza grave secondo me, ha modificato alcune espressioni che non dovevano esserlo assolutamente.

Non molto soddisfatto del risultato, ho chiesto a Copilot perché non avesse usato la classe ‘I2C’ del modulo ‘busio’ di Python.

Ha risposto con alcune frasi di circostanza poco significative e poi ha generato una nuova versione della libreria usando la classe ‘I2C’.

Ha lasciato però le funzioni intermedie che aveva introdotto nella prima versione e che adesso erano ridotte ad una riga solamente perché non facevano altro che richiamare la funzione corrispondente della classe.

Se quelle della prima versione qualche utilità (poca) potevano averla quella di questa versione erano completamente inutili.

In più si era completamente perso il fatto che anche la classe ‘I2C’ in Python ha il metodo ‘scan’ e aveva cercato di riprodurne il funzionamento in altro modo.

La versione finale è qui: https://github.com/artifex-it/python-xl9535-kxv5-relay.

Conclusioni

In base a questa esperienza penso che ancora bisogna attentamente controllarle, queste intelligenze artificiali! 🙂

Sicuramente sono molto utili in compiti meccanici e sicuramente permettono di governare enormi quantità di dati ma se il compito richiede anche un minimo di ragionamento astratto, secondo me, ancora è meglio supervisionare con l’intelligenza naturale. 🙂

Hai avuto esperienze simili alle mie o magari con risultati migliori?

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *