Sintesi del programma – Fare in modo che il codice si scriva da solo

Program synthesis - Making code write itself

Parole alla comprensione (Parte ⅓)

Un termine che potresti aver sentito ma non aver completamente compreso è “sintesi del programma”, spesso presentata come l’incursione dell’IA nella scrittura del codice. Questo articolo è il primo di una serie di tre parti progettata per demistificare questo concetto. Qui, ci concentriamo sulla comprensione dell’essenza semantica della “sintesi del programma”. Mentre cerco chiarezza e semplicità, si tenga presente che alcuni dettagli tecnici potrebbero essere tralasciati per facilità di lettura.

Per capire la “sintesi del programma”, dobbiamo prima affrontare il termine “programma”. Quindi, cominciamo chiedendoci cos’è esattamente un programma.

Immagine di Saar Barak (Autore)

Programma

In sostanza, la programmazione è l’atto di dire al computer cosa fare. Pianificare un promemoria sul tuo telefono, personalizzare le tue foto sui social media, ottimizzare il traffico o configurare questo articolo VoAGI, sono tutte attività di programmazione. Per assicurarci di essere in sintonia, analizziamo il “tripletto di programmazione”:

  • Un programmatore trasforma un compito in un programma.
  • Un programma è una cosa che il programmatore fornisce, che l’interprete capisce.
  • Un interprete prende in input il programma e fa qualcosa.
Immagine di Saar Barak (Autore)

Allora, perché dedicare tempo all’apprendimento della programmazione? Perché i computer offrono abilità che non possiamo eguagliare. Non dobbiamo cucire manualmente una foto panoramica da una dozzina di foto individuali, sicuramente non riesco a ricordare tutti i compleanni dei miei amici senza un piccolo aiutino dal mio telefono. Non posso consegnare il blog a tutti voi di persona.

Sintesi del programma

La sintesi del programma è un sistema che rende la programmazione più facile. GCC ti libera dalla necessità di scrivere codice assembly, il sistema operativo del tuo smartphone prende una dozzina di foto individuali e produce una fotografia panoramica. Il piccolo pulsante verde “pubblica” in cima a questa pagina ti invierà tutto questo articolo. Con la sintesi del programma, puoi lavorare in una versione migliorata di un linguaggio di programmazione, chiamato “Program++”. Questo è più semplice rispetto al programma originale.

Immagine di Saar Barak (Autore)

Il sintetizzatore agisce come intermediario, convertendo il tuo Program++ nel programma originale. Quando si abbina questo sintetizzatore a un interprete, si ottiene un interprete avanzato, chiamato “Interpreter++”. Questa versione aggiornata prende il tuo Program++ (comunemente chiamato specifica) e svolge le attività. Il processo è ricorsivo: è possibile aggiungere continuamente livelli di sintetizzatori e interpreti per rendere la programmazione sempre più semplice. Pertanto, la sintesi del programma è semplicemente “programmazione più facile”.

Oggi la sintesi del programma

L’arte della sintesi del programma consiste nel rendere il programma++/specifica il più semplice possibile. Oggi le tecniche di sintesi del programma sono diventate sempre più sofisticate, come ChatGPT o CoPilot, che generano codice da requisiti di alto livello, riducendo la necessità di codice “scritto a mano” e quindi minimizzando gli errori umani.

Immagine di Saar Barak (Autore)

Dopo aver definito cosa sono un Programma e la Sintesi dei Programmi, dobbiamo definire precisamente cosa è un problema.

Problema

Iniziamo chiedendoci: Come fa un programmatore a scrivere un programma in modo che l’interprete faccia la cosa giusta per un compito?

Immagine di Saar Barak (Autore)

Compito come Specifica

I compiti possono essere specificati in vari modi – immagina le diverse ricette che potresti usare per preparare un’insalata. Verificare la correttezza di un programma ha anche molteplici aspetti – considera i diversi criteri per giudicare se l’insalata è gustosa, salutare o esteticamente gradevole. Tuttavia, le sfumature di molti compiti del mondo reale sfuggono spesso alla comprensione computazionale.

Specifica come Problema

Una specifica o spec è un modo di affermare il compito in modo che sia possibile un accordo tra esseri umani e computer su cosa deve essere fatto. Una delle rare e speciali forme di comunicazione è l’Input-Output (o semplicemente I/O) che è facilmente comprensibile sia per gli esseri umani che per i computer.

Immagine di Saar Barak (Autore)

Esistono altre forme di specifiche, ad esempio potrebbe trattarsi di una funzione obiettivo da massimizzare, di un insieme di vincoli sul comportamento del computer o di una frase in linguaggio naturale. Ma c’è molta flessibilità nel modo in cui puoi scrivere quella spec. Diverse specs possono descrivere lo stesso problema da angolazioni diverse, sintassi o livelli di granularità. Ad esempio, se vuoi ordinare una lista(L) di n numeri, potremmo fornire:

  • Una serie di coppie I/O: In₁[3,2,1] Out₁[1,2,3] | In₂[0,-1,2] Out₂[-1,0,2] | In₃[5,8,100] Out₃[5,8,100] | In₄[9] Out₄[9] …
  • Una singola frase: “Ordina una lista di numeri interi in ordine crescente.”
  • Una funzione matematica: f( X ) = x₁≤ x₂≤ x₃ … ≤ xₙ
  • Una definizione ricorsiva: Sorted(L) ⇔ L[1] ≤ min⁡( L[2:n] ) ∧ Sorted( L[2:n] )

Allo stesso modo, per preparare un’insalata, la spec potrebbe essere simile a:

  • Coppie I/O: In₁[lattuga, pomodori, cetriolo] Out₁[insalata] | In₂[cetriolo, caesar, pomodori] Out₂[non insalata]
  • Linguaggio naturale: Unisci lattuga, pomodori e cetriolo
  • Basato su vincoli: Deve includere[ almeno una verdura verde e una fonte di proteine.]

correttezza

Con una spec, il computer può decidere automaticamente se un programma ha “fatto le cose giuste” verificando se l’esecuzione del programma sugli input produce gli output corrispondenti. A questo processo lo chiamiamo un Verificatore.

Immagine di Saar Barak (Autore)

Ora, un semplice Verificatore ti dà una risposta diretta: Vero o Falso. is_sorted( [1,2,4] ) = Vero. Gli elementi combinati [pomodori, cesare] sono ingredienti per l’insalata? Falso. Ma possiamo alzare la posta in gioco: alcuni Verificatori vanno oltre le semplici risposte binarie, immergendosi in metriche o scale che misurano quanto bene il programma ha fatto.

Dalla Logica all’Apprendimento

Tradizionalmente, la sintesi del programma era un campo dominato da regole logiche rigide e ragionamento algoritmico. Tuttavia, il panorama sta cambiando rapidamente, grazie all’infusione di tecniche di apprendimento automatico. Questo spostamento verso approcci basati sull’apprendimento sta rivoluzionando la velocità, l’accuratezza e l’efficienza della sintesi del programma.

Immagine di Saar Barak (Autore)

Approcci Diversi: La Tassonomia della Sintesi del Programma La sintesi del programma non è una soluzione unica per tutti. A seconda delle esigenze del compito, diversi approcci o tipi di sintesi possono essere più vantaggiosi. Approfondiamo alcuni di questi tipi.

  1. Sintesi Deduttiva – Il Tradizionalista. Si basa su metodi formali, strutture logiche e principi algoritmici. Molto precisa, ma può richiedere risorse computazionali consistenti. Ideale per sistemi critici in cui la affidabilità è fondamentale.
  2. Sintesi Induttiva – Il Modernista. Guidata principalmente da tecniche di apprendimento automatico e metodi euristici. Eccelle in velocità e adattabilità, ma può mancare della rigorosa precisione dei metodi deduttivi. Più adatta per cicli di sviluppo rapidi e applicazioni meno mission-critical.
  3. Sintesi Stocastica – Il Realista. Utilizza modelli probabilistici per affrontare le incertezze nelle specifiche o negli ambienti. Offre un approccio equilibrato, ma potrebbe richiedere un tuning fine per raggiungere la affidabilità desiderata. È adatto per applicazioni in cui ci si aspetta un certo livello di incertezza o variazione.

Lasciatemi concludere con alcuni pensieri…

Sintesi del Programma – Oltre le Capacità Umane

Non dobbiamo limitarci. Il nostro obiettivo è costruire un sintetizzatore che possa andare ancora oltre!! L’obiettivo non è solo replicare le capacità umane, ma superarle poiché la sintesi del programma scopre nuove soluzioni che attualmente l’umanità non può affrontare. Stiamo parlando di potenzialmente fare nuove scoperte nel campo della medicina, delle finanze e forse anche nella decodifica del cosmo…

Immagine di Saar Barak (Autore)

Ulteriori Letture e Riferimenti

  1. Note della lezione di Armando sulla sintesi deduttiva ↩︎
  2. Un sondaggio del 2021 sulla sintesi del programma neuro-simbolico ↩︎
  3. Programmazione competitiva con AlphaCode ↩︎
  4. Valutazione di grandi modelli di linguaggio addestrati sul codice ↩︎
  5. Unione di apprendimento automatico e semantica compositiva di Percy Liang ↩︎
  6. Tutorial ACL 2018 sul parsing semantico neurale ↩︎
  7. Il bambino come hacker ↩︎
  8. Modelli probabilistici della cognizione ↩︎
  9. Note della lezione di Armando sulla definizione, storia della sintesi del programma ↩︎
  10. Una guida minimalista alla sintesi del programma
  11. Un sondaggio del 2017 sulla sintesi del programma di persone di Microsoft ↩︎