Il linguaggio moderno nell'era dell'AI
Linguaggi Moderni
Per 'linguaggio moderno' si intende un linguaggio che offre maggiore produttività, stabilità, sicurezza e manutenibilità rispetto ai linguaggi del passato. Questi linguaggi adottano attivamente le tecniche e i concetti più recenti, fornendo agli sviluppatori strumenti di sviluppo più efficienti e sicuri. I linguaggi moderni rappresentativi includono Java, Rust, Python, TypeScript, e presentano le seguenti caratteristiche.
1. Progettazione Orientata agli Oggetti ( OOP )
La maggior parte dei linguaggi moderni è progettata basandosi sul concetto di programmazione orientata agli oggetti. L'OOP supporta principi come l'incapsulamento, l'ereditarietà e il polimorfismo, e dividendo i sistemi complessi in oggetti di piccole unità, rende la struttura del programma chiara e flessibile. Questo è particolarmente efficace nel controllare i costi di sviluppo e gli sforzi nella creazione di software su larga scala, e nel ridurre i problemi che possono sorgere durante la manutenzione.
2. Syntactic Sugar ed Espressioni
I linguaggi moderni offrono una varietà di syntactic sugar e sintassi basata su espressioni per aumentare la leggibilità del codice e la produttività dello sviluppo. Funzioni come l'operatore ternario, le espressioni lambda e il pattern matching riducono il codice boilerplate, rendono il codice più prevedibile e migliorano la produttività degli sviluppatori.
3. Sistema Modulare
I linguaggi moderni consentono di gestire i programmi suddividendoli in più unità tramite un sistema modulare. Ciò facilita il riutilizzo del codice e la gestione delle dipendenze, rendendo la manutenzione più agevole anche quando la dimensione del progetto aumenta. Esempi rappresentativi includono Maven/Gradle per Java, Cargo per Rust, e npm/yarn per TypeScript.
4. Linguaggio Intermedio e Macchina Virtuale
I linguaggi moderni introducono un linguaggio intermedio e una macchina virtuale per l'indipendenza dalla piattaforma, l'ottimizzazione delle prestazioni e la sicurezza. Esempi rappresentativi includono JVM, LLVM, WASM, GraalVM.
Sviluppo nell'Era dell'AI e Limiti dei Linguaggi Moderni
I linguaggi moderni sono nati con il presupposto che la maggior parte del codice fosse scritta dall'uomo. Naturalmente, lo scopo dei linguaggi moderni è ridurre le attività ripetitive, aumentare la produttività e implementare software di grandi dimensioni in modo efficace attraverso una struttura che consenta la collaborazione tra gli sviluppatori. Tuttavia, nell'era dell'AI, questo presupposto sta gradualmente venendo meno. Strumenti basati sull'AI come Copilot e Cody stanno automatizzando gran parte della scrittura del codice, e la quantità di codice che un singolo sviluppatore può produrre sta aumentando esponenzialmente. Di conseguenza, le caratteristiche dei linguaggi moderni, che un tempo erano considerate vantaggi, si stanno gradualmente trasformando in svantaggi obsoleti.
Progettazione Orientata agli Oggetti
L'AI può analizzare strutture in cui tutte le informazioni sono esplicitate all'interno di una singola funzione o modulo in modo rapido e preciso. Al contrario, all'aumentare del contesto, aumenta il numero di sezioni da inferire, riducendo la produttività e l'accuratezza dell'AI. Il codice scritto in OOP distribuisce la logica su più oggetti piuttosto che gestirla in un unico posto, il che di conseguenza richiede all'AI un contesto maggiore. Consideriamo il codice seguente.
1public class AnimalHandler {
2 public void handle(Animal animal) {
3 animal.speak();
4 }
5}
6
7public class Main {
8 public static void main(String[] args) {
9 AnimalHandler handler = new AnimalHandler();
10
11 Animal a1 = new Dog();
12 Animal a2 = new Cat();
13 Animal a3 = new Horse();
14
15 handler.handle(a1);
16 handler.handle(a2);
17 handler.handle(a3);
18 }
19}
Nel codice precedente, l'AI deve ripetere le seguenti inferenze per sapere quale azione eseguirà effettivamente il metodo speak():
- Di quale classe concreta è un'istanza animal?
- Dove è definito il metodo speak() sovrascritto in quella classe?
- Dove sono definite le classi Dog e Cat e qual è il loro comportamento interno?
- C'è la possibilità che le classi Dog e Cat vengano sovrascritte da altre classi?
Queste informazioni non sono raccolte in un unico file o in un'unica funzione, ma possono essere comprese solo seguendo le relazioni tra i file di classe e la struttura dell'ereditarietà. Inoltre, elementi decisi a runtime come la reflection o il caricamento dinamico sono come una scatola nera per l'AI, rendendo di fatto impossibile l'analisi.
Syntactic Sugar ed Espressioni
L'AI preferisce le azioni esplicite rispetto a quelle implicite e preferisce combinare strutture semplici per ottenere una singola soluzione piuttosto che utilizzare strutture complesse. Al contrario, il syntactic sugar consente varie espressioni, ma il loro comportamento interno è spesso identico o simile. L'AI deve imparare il significato di queste diverse espressioni individualmente e può avere difficoltà a determinare la priorità di quale sintassi raccomandare in una situazione specifica.
Linguaggio Intermedio e Macchina Virtuale
L'AI impara principalmente dal codice sorgente. D'altra parte, il linguaggio intermedio (bytecode) perde il significato di elementi come i nomi delle variabili durante il processo di compilazione e deve essere reinterpretato dalla macchina virtuale al momento dell'esecuzione. Questo è un compito molto difficile per l'AI da comprendere o convertire. Ad esempio, la conversione da TypeScript a Go è possibile per l'AI, ma la conversione del bytecode del V8 engine nel bytecode della JVM o nel codice macchina è praticamente impossibile.
Il Vero Linguaggio Moderno nell'Era dell'AI
Attraverso quanto sopra, possiamo constatare che le caratteristiche dei linguaggi moderni sono in realtà elementi obsoleti non adatti all'era dell'AI. Quale linguaggio potrebbe quindi essere il linguaggio moderno più adatto all'era dell'AI? Si possono trarre suggerimenti dagli elementi che i linguaggi moderni del passato hanno escluso. Un linguaggio moderno nell'era dell'AI dovrebbe:
- Avere una sintassi esplicita e un flusso naturale.
- Avere una struttura piatta e semplice, allontanandosi da strutture OOP eccessive.
- Creare varie funzionalità solo con un numero limitato di parole chiave fondamentali, piuttosto che con syntactic sugar non necessario o pattern impliciti.
- Avere un sistema di build semplice e prevedibile, piuttosto che un sistema di build complesso.
Il linguaggio che meglio si adatta a questi criteri è Golang. Il linguaggio Go è stato progettato per consentire l'implementazione della maggior parte delle funzionalità pratiche con il minimo di parole chiave fondamentali e semplici combinazioni sintattiche, ed esclude rigorosamente l'astrazione inutile e il comportamento implicito. Questa è una struttura vantaggiosa non solo per gli sviluppatori umani ma anche per l'AI nell'interpretare e generare codice.
Le caratteristiche di Go, che mirano a una struttura prevedibile e piatta, un flusso esplicito e una sintassi coerente, si adattano meglio a un ambiente di sviluppo in cui l'AI partecipa attivamente, a differenza dei linguaggi moderni esistenti progettati per gli sviluppatori umani. Quella che un tempo era considerata una filosofia di progettazione conservativa di Go, ritenuta obsoleta, si rivela al contrario la scelta più avanzata nell'era dell'AI.