Un recente post pubblicato su 2ality, ha messo in luce un particolare trend che riguarda vari strumenti per lo sviluppo di applicazioni in JavaScript. Da una piccola ricerca su Twitter, è venuto fuori che un numero significativo di strumenti di questo tipo, pur essendo pensato per gli sviluppatori JavaScript, è spesso scritto sfruttando altri linguaggi di programmazione.
Are you using a JS tool that isn’t written in JS (but in Rust, Go, etc.) that you are happy with?
— Axel Rauschmayer (INACTIVE) (@rauschma) October 6, 2020
È quindi lecito chiedersi il perché di questo trend. Nel seguito cercheremo di rispondere a questa particolare tendenza, rifacendoci alle considerazioni discusse nel summenzionato post di 2ality.
I tool JavaScript scritti in altri linguaggi
Prima di esplorare in dettaglio i motivi di questa tendenza, vale la pena analizzare questi tool per classi.
Compilatori e building tools
Alcuni strumenti che tendono ad essere scritti in linguaggi diversi da JavaScript sono quelli che permettono di compilare, ottimizzare o "minificare" il codice. Tra questi vi sono:
- esbuild: scritto in GoLang, che permette di minificare ed impacchettare codice JavaScript e TypeScript, in modo da facilitarne la distribuzione
- swc: scritto in Rust, è un compilatore per JavaScript e TypeScript
- Google Closure Compiler: scritto in Java, permette di eseguire il controllo della sintassi e l'ottimizzazione del codice JavaScript
Linter e strumenti per la formattazione del codice
Un'altra importante classe di strumenti che sono affetti da questa peculiare tendenza è quella dei linter (strumenti che analizzano il codice in cerca di errori di sintassi, bug e anti-pattern) e degli strumenti che permettono di migliorare la formattazione del codice (beautifiers). Tra questi vi sono:
- RSLint, scritto in Rust
- Flow, scritto in OCaml
- dprint, scritto in Rust
Strumenti di gestione da riga di comando
Ci sono infine alcuni strumenti utili alla gestione di progetti JavaScript tramite riga di comando, scritti in altri linguaggi. Tra questi menzioniamo Fast Node Manager (noto anche come fnm, e scritto in Rust) e Volta, entrambi sviluppati in linguaggio Rust.
Perché utilizzare altri linguaggi?
I principali motivi che stanno dietro a questa tendenza sono principalmente connessi alle performance. Come è noto, infatti, JavaScript ha molte limitazioni, legate sia alla gestione della memoria, sia alla possibilità di parallelizzare l'esecuzione del codice. Inoltre, alcuni linguaggi possono risultare oggettivamente più adatti ad implementare certi tipi di funzionalità. Si pensi, ad esempio, ai linguaggi funzionali come OCaml o Haskell, che possono più facilmente supportare alcuni tipi algebrici, o magari gestire meglio certe strutture dati.
D'altra parte, l'uso di JavaScript ha i suoi vantaggi. Sebbene sia vero che molti linguaggi sono oggi compilabili in JavaScript tramite WebAssembly, è altrettanto vero che JavaScript gode di una delle più vaste comunità di sviluppatori, cosa che faciliterebbe la costruzione dei team di sviluppo ed il reperimento di un maggior numero di contributor per i progetti open source.
Inoltre, l'ampia community JavaScript porta con sé un altro importante vantaggio, ovvero la vasta disponibilità di librerie e strumenti che possono facilitare lo sviluppo dei tool stessi.
Infine, anche la necessità di sfruttare un linguaggio funzionale può essere facilmente aggirata, visto il supporto (seppur non elegantissimo) di TypeScript.