I computer quantistici sfruttano i principi della meccanica quantistica per offrire prestazioni esponenzialmente superiori a quelle delle classiche CPU oggi in commercio.
Il prezzo da pagare per queste performance è un approccio all’architettura hardware e software completamente differente rispetto a quello a cui gli sviluppatori sono abituati.
I computer quantistici non sono deterministici ma probabilistici, e le informazioni non vengono gestite in bit ma in qubit, un oggetto di archiviazione dati che sfrutta la super posizione quantistica per l’elaborazione parallela dei dataset. Chi tentasse di approcciare questo ambiente di sviluppo con le classiche logiche booleane a cui è abituato nel mondo SaaS si ritroverebbe in breve tempo disorientato e incapace di produrre del codice soddisfacente. Questo perché sviluppare su un computer quantistico richiede un profondo cambio di mentalità.
Un nuovo mindset per lo sviluppo
I qubit impiegati dai computer quantici possono assumere valori di 0 o 1 come i bit, ma, grazie alla super posizione quantistica, possono anche assumere contemporaneamente tutti gli stati tra 0 e 1. Per analogia, si può pensare a un pittore che dipinge con due secchi di vernice, bianca e nera, ma la parete su cui dipinge può visualizzare tutte le sfumature di grigio possibili.
Per gestire questi stati aggiuntivi non è sufficiente impiegare le operazioni della logica booleana, ma occorre abituarsi a lavorare con i gate quantistici (quantum gate), che aggiungono alla classica logica di programmazione gli strumenti per gestire gli stati in super posizione.
Un esempio che aiuti a intuire la differenza introdotta dai quantum gate è il confronto tra l’operatore NOT della logica booleana e l’operatore CNOT dei gate quantistici. L’operatore Booleano NOT modifica il valore di un bit nel suo opposto (da 1 a 0 e viceversa). L’operatore CNOT (Controlled Not) invece può agire su un qubit singolo, un doppio qubit, o scalare all’ennesima potenza. Il suo effetto è di modificare i valori di un vettore di stati target con i valori specificati in un vettore di partenza (stati di controllo). Allo sviluppatore è perciò richiesto di imparare a relazionarsi con operazioni che agiscono su dataset manipolati in parallelo, le cui interazioni possono anche estendersi a migliaia di informazioni contemporaneamente.
Ambienti di sviluppo per CPU quantistiche
Sviluppare in questa nuova ottica richiede l’utilizzo di framework specializzati, in grado di tradurre il codice di alto livello in istruzioni interpretabili dalla CPU quantistica, e che mettano a disposizione le librerie necessarie per gestire i gate quantistici. Spesso la scelta dell’ambiente di sviluppo è legata al produttore della CPU.
Ovviamente, esistono delle librerie Python che astraggono dalle specifiche del singolo produttore, ma in un contesto di sviluppo così all’avanguardia è consigliabile evitare un approccio bleeding edge e affidarsi, almeno agli inizi, a un “pacchetto” che offra una curva di apprendimento adeguata.
Gli ambienti di sviluppo per le CPU quantistiche, anche se condividono molte specifiche, vengono proposti con differenti flavour.
- Forest di Rigetti offre un framework user friendly per i programmatori che hanno già esperienza in Python, essendo basato su librerie scritte in questo linguaggio. Feature interessante è la disponibilità di una macchina virtuale quantistica per sperimentare il codice senza necessità di acquistare l’hardware, sebbene sia sempre obbligatoria la sottoscrizione di una chiave API.
- D-Wave offre invece una proposta più variegata, proponendo un servizio in cloud basato su Container, che permettono di accedere alle sottostanti CPU quantistiche da un IDE familiare come Codespaces: l’esperienza è analoga a quella di chi sviluppi per AI su Notebook Jupiter e poi noleggi le GPU in cloud per eseguire il training dei modelli.
- IBM propone Qiskit, IDE utilizzabile per sviluppare applicazioni eseguibili sia su una CPU IBM Quantum fisica, sia distribuibili in modo serverless, eseguendo carichi di lavoro in cloud, con un supporto alla modalità batch che permette di parallelizzare i workflow.
- Alternativa interessante è il QDK (Quantum Development Kit) di Microsoft, che offre una curva di apprendimento morbida grazie all’integrazione di sviluppo quantistico e sviluppo classico. Il linguaggio impiegato, il Q#, utilizza concetti come i Name Space e gli Entry Point che risulteranno familiari a sviluppatori che arrivano dal framework .Net.
Particolarità dello sviluppo
Oltre alle nuove logiche dei gate quantistici, un’altra caratteristica con cui occorre prendere velocemente dimestichezza è la notazione Dirac. Lo sviluppo quantistico lavora con entità vettoriali, manipolate per mezzo di questa notazione che, rispetto alle modalità di accesso ai vettori di altri linguaggi, permette una rappresentazione concisa degli stati dei Qubit.
La notazione Dirac è usata per realizzare circuiti tra i gate. I circuiti (Circuit) sono i modelli di manipolazione che costruiscono la logica del programma: ogni diverso IDE mette a disposizione metodi per costruire circuiti a partire da zero (from scratch) oppure librerie di circuiti già programmati, utilizzabili come basi per la creazione di logiche più complesse.
Una volta programmati, i circuiti devono essere rielaborati per essere eseguiti sulla CPU quantistica sottostante, in modo che la logica astratta di alto livello sia riscritta in istruzioni comprensibili dall’hardware.
Questa operazione è eseguita dal Transpiler, l’equivalente nel mondo quantistico del compilatore per le CPU attuali. Per programmi semplici il Transpiler può essere invocato senza configurazione aggiuntive, ma per logiche complesse è consigliabile eseguire prima una parametrizzazione per mezzo delle apposite funzioni in modo da produrre un codice conforme e ottimizzato per l’hardware.