in un compilatore open source per . V è un linguaggio compilabile in codice macchina con tipizzazione statica, focalizzato sulla semplificazione della manutenzione dello sviluppo e sulla garanzia di una velocità di compilazione molto elevata. Il codice del compilatore, delle librerie e degli strumenti associati sotto licenza MIT.
Il sintassi di V è molto simile a quella del linguaggio Go, con l'adozione di alcune strutture da Oberon, Rust e Swift. Il linguaggio è il più semplice possibile e, secondo gli sviluppatori, bastano 30 minuti per apprenderne le basi . Tuttavia, il linguaggio rimane abbastanza potente e può essere utilizzato per svolgere le stesse mansioni che si possono eseguire con altri linguaggi di programmazione (ad esempio, sono disponibili librerie per grafica 2D/3D, creazione di GUI e applicazioni web).
La creazione di un nuovo linguaggio è stata spinta dal desiderio di combinare le caratteristiche del linguaggio Go, come la semplicità della sintassi, la rapidità di compilazione, la facilità di parallelizzazione delle operazioni, la portabilità e la manutenibilità del codice, con le prestazioni del C/C++, la sicurezza di Rust e la generazione di codice macchina in fase di compilazione di Zig. Inoltre, si voleva avere un compilatore compatto e veloce, in grado di funzionare senza dipendenze esterne, eliminare lo scope globale (variabili globali) e garantire la possibilità di una «riavvio a caldo» del codice.
Rispetto a C++, il nuovo linguaggio è notevolmente più semplice, offre una velocità di compilazione superiore (fino a 400 volte), adotta tecniche di programmazione sicura, è esente da problemi di comportamento indefinito e fornisce strumenti integrati per il parallelismo delle operazioni. Rispetto a Python, il linguaggio V è più veloce, più semplice, più sicuro e più facile da mantenere. Rispetto a Go, in V non ci sono variabili globali, non c'è null, tutti i valori delle variabili devono sempre essere definiti, tutti gli oggetti sono per default immutabili, è supportato solo un tipo di assegnazione («a := 0»), runtime di dimensioni notevolmente più compatte e dimensioni dei file eseguibili finali, portabilità diretta da C, assenza di garbage collector, serializzazione più veloce e possibilità di interpolazione delle stringhe («println(‘$foo: $bar.baz’)»).
fn main() {
areas := [‘game’, ‘web’, ‘tools’, ‘science’, ‘systems’, ‘GUI’, ‘mobile’]
a := 10
if true {
a := 20
}
for area in areas {
println(‘Hello, $area developers!’)
}
}
Caratteristiche del progetto:
- Compilatore compatto e veloce che, insieme alla libreria standard, occupa circa 400 KB. L'elevata velocità di compilazione è raggiunta grazie alla generazione diretta di codice macchina e alla modularità. La velocità di compilazione è di circa 1,2 milioni di righe di codice al secondo su un singolo core della CPU (si segnala che durante il funzionamento V può utilizzare C, il che riduce la velocità a 100.000 righe al secondo). La ricompilazione del compilatore, anch'esso scritto nel linguaggio V (è disponibile anche una versione di riferimento in Go), richiede circa 0,4 secondi. Entro la fine dell'anno si prevede di completare ulteriori ottimizzazioni che permetteranno di ridurre il tempo di compilazione del compilatore a 0,15 secondi. Dalle prove condotte dallo sviluppatore, la ricompilazione di Go richiede 512 MB di spazio su disco e viene effettuata in un minuto e mezzo, Rust richiede 30 GB e 45 minuti, GCC — 8 GB e 50 minuti, Clang — 90 GB e 25 minuti.
Swift — 70 GB e 90 minuti; - I programmi vengono compilati in file eseguibili senza dipendenze esterne. La dimensione del file eseguibile di un semplice server http dopo la compilazione è di soli 65 KB;
- Le prestazioni delle applicazioni compilate sono comparabili a quelle dei programmi scritti in C;
- Possibilità di interazione senza soluzione di continuità con codice C, senza costi aggiuntivi. Le funzioni scritte in V possono chiamare codice C e viceversa, il codice V può essere invocato in qualsiasi linguaggio compatibile con C;
- Supporto per la traduzione di progetti in C/C++ nel formato V. Per la traduzione viene utilizzato un parser di Clang. Non tutte le funzionalità dello standard C sono attualmente supportate, ma le capacità attuali del traduttore sono già sufficienti per il gioco DOOM nel linguaggio V. Il traduttore per C++ è ancora in fase iniziale di sviluppo;
- Supporto integrato per la serializzazione, senza legami al runtime;
- Minimizzazione delle operazioni di allocazione della memoria;
- Sicurezza garantita: assenza di NULL, variabili globali, valori non definiti e ridefinizione delle variabili. Strumenti integrati per controllare gli accessi oltre i limiti del buffer. Supporto per funzioni generiche. Oggetti e strutture immutabili per default;
- Possibilità di ricaricare il codice «a caldo» (riflettendo le modifiche nel codice in tempo reale senza necessità di ricompilazione);
- Strumenti per la gestione della multithreading. Nel linguaggio Go, per avviare un nuovo thread di esecuzione si utilizza una sintassi del tipo «run foo()» (simile a «go foo()»). In futuro è prevista la supporto per goroutines e un scheduler di thread;
- Supporto per i sistemi operativi Windows, macOS, Linux, *BSD. Entro la fine dell'anno è prevista l'aggiunta del supporto per Android e iOS;
- Gestione della memoria a tempo di compilazione (come in Rust), senza l'uso di garbage collector;
- Disponibilità di un toolkit multipiattaforma per la grafica, che utilizza GDI+/Cocoa e OpenGL per il rendering (in programma il supporto per le API DirectX, Vulkan e Metal). Sono disponibili strumenti per lavorare con oggetti 3D, animazione scheletrica e gestione delle telecamere;
- Disponibilità di una libreria per la creazione di interfacce grafiche con elementi di design nativi per ogni sistema operativo. In Windows si utilizza WinAPI/GDI+, in macOS — Cocoa, in Linux — un proprio set di widget. La libreria è già utilizzata nello sviluppo di — un client per Slack, Skype, Gmail, Twitter e Facebook;
Si prevede la creazione di un'app simile a Delphi per la progettazione dell'interfaccia, con un'API dichiarativa simile a SwiftUI e React Native, e il supporto per la creazione di applicazioni mobili per iOS e Android;

- Presenza di un framework web integrato, utilizzato per creare il sito, il forum e il blog degli sviluppatori del progetto. È supportata la precompilazione dei template HTML, senza che vengano elaborati ad ogni richiesta;
- Supporto per la cross-compilazione. Per compilare un file eseguibile per Windows è sufficiente eseguire "v -os windows", e per Linux "v -os linux" (il supporto per la cross-compilazione per macOS è previsto in seguito). La cross-compilazione funziona anche per le applicazioni grafiche;
- Gestore delle dipendenze integrato, gestore pacchetti e strumenti di compilazione. Per compilare il programma è sufficiente eseguire "v .", senza utilizzare make e strumenti esterni. Per installare librerie aggiuntive è sufficiente eseguire, ad esempio, "v get sqlite";
- Disponibilità di plugin per lo sviluppo nel linguaggio V nei vari editor e .
Sviluppo dalla comunità con , poiché il codice pubblicato ha dimostrato che non tutte le funzionalità dichiarate sono ancora implementate e per realizzare tutti i piani è necessario eseguire un volume di lavoro molto grande.
Inoltre, inizialmente nel repository è stato un codice non funzionante, che presenta problemi di compilazione ed esecuzione. Si ipotizza che l'autore non abbia ancora raggiunto la fase in cui si iniziano a notare , secondo la quale il 20% degli sforzi produce l'80% dei risultati, mentre l'80% restante degli sforzi porta solo il 20% dei risultati.
Nel frattempo, nel tracker dei bug del progetto V sono stati rimossi circa 10 messaggi con di scarsa qualità del codice, ad esempio, è stato segnalato l'uso di inserti in C e l'utilizzo nella libreria di funzioni per rimuovere la directory tramite il comando rm attraverso la chiamata os.system(«rm -rf $path»). L'autore del progetto , ha affermato di aver solo rimosso i messaggi (le modifiche che confermano la validità delle critiche in ).
Fonte: opennet.ru

