Ho scoperto per caso Nim, un linguaggio di programmazione di tipo general-purpose, che presenta molte similitudini anche di sintassi con Python, C, JavaScript. L'obiettivo è quello di consentire una scrittura semplice, elegante, pulita (come Python), anche però con la possibilità di rendere il codice efficiente come C/C++ (per il linguaggio Python l'efficienza è abbastanza critica, vedi anche: Python: l'importanza di rendere efficiente il codice (esempi, benchmark)).
Per prima cosa, installiamo Nim.
- da terminale,
git clone https://github.com/nim-lang/Nim
(io l'ho installato tramite GitHub, è possibile anche seguire altre strade), se non avete git installato, prima si procede ad installare git (ad esempio in Linux Debian-based: sudo apt install git
)
- apriamo il terminale nella nuova cartella Nim, oppure
cd /Nim
ed eseguiamo build_all.sh
per Unix (Linux, macOS) oppure build_all.bat
in ambiente Windows
- ora creiamo il nostro file (codice sorgente) con estensione .nim, che poi viene compilato tramite
nim compile nomefile.nim
ed eseguito nel terminale tramite ./nomefile
Nel caso di studio che ho fatto, volevo testare l'efficienza nell'esecuzione del codice, quindi, risoluzione numerica di un integrale definito, di una semigaussiana (giusto un problema computazionale che richieda un tot di risorse) in linguaggio Nim e in linguaggio C ottimizzato, per vedere la differenza.
Nim, a parte il fatto che non avendome pratica, non conosco eventuali sottigliezze, non fa la conversione automatica dei tipi di dato e non esegue operazioni con tipi di dato diversi quindi richiede operazioni un pochino più macchinose. Altra cosa, per testare il tempo di esecuzione del codice ho creato delle variabili "inizio" e "fine", dato che chiamandole "start" ed "end" crea conflitto, "end" è una keyword.
Vediamo quindi il codice Nim:
import std/math
import times
var ris: float
var N: int
var i: int
var a: float
var b: float
var h: float
var pi: float
ris=0.0
a=0.0
b=20.0
N=10000000
pi=3.14159265
h=1.0*(b-a)/float(N)
let inizio = cpuTime()
for i in 0..N:
ris+=exp(-0.5*(a+float(i)*h)^2)
ris*=1.0*h/sqrt(2*pi)
let fine = cpuTime()
echo ris
echo "Tempo di esecuzione: ", fine - inizio, " secondi"
Il tempo di esecuzione di questo programma in Nim è pari a 0,13 secondi. Lo stesso programma scritto in linguaggio C ottimizzato, viene eseguito in 0,056 secondi. Lo stesso programma in linguaggio Python 3, viene eseguito in 1,46 secondi.
Quindi, in conclusione:
- C è risultato 2,32 volte più veloce di Nim
- Nim è risultato 11,23 volte più veloce di Python
- C è risultato 26,07 volte più veloce di Python
Per questo primo test, Nim sembra interessante, consente di scrivere codice con una sintassi flessibile, a seconda del linguaggio che preferiamo (più simile a Python, JavaScript, ecc) e allo stesso tempo consente di raggiungere risultati più che validi di efficienza (il linguaggio C ottimizzato, resta irraggiungibile, praticamente al pari di Assembly e linguaggio nativo).

Vi piace Nim, cosa ne pensate? Ne avete già sentito parlare? Vi sembra interessante? 🙂