Ho conosciuto da poco un tool, emscripten, che permette di compilare codice C/C++ in Node.js (runtime system JavaScript che lavora backend, con performance molto interessanti, ben superiori a PHP - vedi PHP 8.2 vs PHP 8.1).
Emscripten è disponibile per tutti i sistemi operativi. Nel mio caso l'ho appena testato su Linux ParrotOS 5.1.2, per l'installazione si procede semplicemente con il comando: sudo apt install emscripten
Nel caso nel sistema non fosse presente Node.js, lo si installa: sudo apt install nodejs
Dopodiché, avendo il proprio codice sorgente C, vediamo cosa fanno i seguenti comandi:
gcc file.c -o file
= compila il codice C in eseguibile
emcc file.c
= converte il codice C in Node.js
La prima operazione quindi è quella classica che si fa quando si vuole compilare un codice sorgente in C che poi viene eseguito tramite ./file
. La seconda operazione invece con "emcc" usa una funzionalità di Emscripten, appunto per fare questa conversione di codice. Vengono creati due file, a.out.js e a.out.wasm: il secondo non ci interessa ma lo dobbiamo mantenere, il primo invece è il file che andremo poi a lanciare da riga di comando, ovvero con il comando node a.out.js
. Nel caso questa compilazione desse poi un errore nell'avvio, si può correggere rifacendo il primo passaggio in questo modo: emcc file.c --emrun
Osservazioni: senza dilungarci troppo, Node.js può essere vantaggioso rispetto a C per questioni di portabilità multipiattaforma, semplicità e perfetta integrazione con JavaScript. Tuttavia, dobbiamo considerare che C e JavaScript sono linguaggi piuttosto diversi (compilato vs interpretato, ad esempio) e nel caso di programmi complessi (non sto parlando di un "Hello World" 😁 ) potrebbero nascere errori di compilazione. Ad esempio, attezione se in C scegliamo di salvare forzatamente le variabili nei registri della CPU anziché nella RAM (per ragioni legate alle performance, in programmi molto esigenti di risorse può avere senso): ebbene, dato che io sono abbastanza ossessionato dalle performance dei software, mi sono accorto che questo genera errore di Emscripten traducendo in Node.js, che non riconosce questa sintassi standard del C (pazienza dai). Per il resto funziona tutto, a parte la funzione scanf(), dovrebbe fermarsi per attendere un mio input da tastiera e invece... Corre come un matto senza fermarsi! 😅
Ho fatto uso di un programmino che avevo creato in passato, un esempio di una griglia 25x25 in cui ogni cella ha valore 1 e poi è soggetta ad una variazione random del ±10%. Poi per non stampare troppi valori decimali, viene stampato 0 se il valore della cella è inferiore a 0,25, altrimenti 2 se è maggiore di 0,75, nel caso intermedio 1. Può essere un esempio di andamento della popolazione batterica o un ambito di questo genere.
Il codice C è questo:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define DIMx 25
#define DIMy 15
#define deltaT 1
#define C0 1.0
#define var 10 //variazione percentuale (es. 10 = 10%)
int randomx(int max, int min);
int main(){
srand(time(0));
int i,j,k=0;
char stop;
float M[DIMx][DIMy];
for(j=0;j<DIMy;j++){
for(i=0;i<DIMx;i++){
M[i][j]=C0/2.0;
}
}
while(1){
printf("iterazione numero %d\n", k+1);k++;
for(j=1;j<DIMy-1;j++){
for(i=1;i<DIMx-1;i++){
M[i][j]=M[i][j]*0.01*(100+randomx(var,-var)); //variazione di +- var (%)
if(M[i][j]>=3/4.0*C0){printf("2");}
if(M[i][j]>C0/4.0&&M[i][j]<3/4.0*C0){printf("1");}
if(M[i][j]<=C0/4.0){printf("0");}
}
printf("\n");
}
printf("-- premere invio per continuare --\n");
scanf("%c",&stop);
}
return 0;
}
int randomx(int max, int min){
return rand()%(max-min+1)+min;
}
In seguito l'immagine che mostra il risultato su terminale dopo la conversione in Node.js (notare il numero di iterazioni, non fermandosi per attendere il mio "invio", in un istante mi sono trovato a questi valori 😁 ).

Conoscevate Emscripten? La possibilità di "tradurre" codice C/C++ in Node.js?