E se invece JavaScript (Node.js) – 1

Il mio linguaggio di default (che raccomando) è Python, versione 3.x. Non sempre, ci sono casi in cui è meglio ricorrere ad altri (già detto che Python è lento?) ma considerando che ha i moduli NumPy, matplotlib &co, almeno 2 REPL, GUIs (che non uso), una buona documentazione, è usatissimo da una comunità molto attiva, è facile (ahemmm) e conosciuto (ahemmm).

Ovvio che ci sono casi per cui possono tornare migliori Octave, C++, Rust, Racket, Java e altri ancora.

In ogni caso –per me– cosa si usa dev’essere open e disponibile su Linux e Windows (per mio cuggino, non per me).

Adesso mi viene chiesto “E JavaScript, Node.js in particolare, offline?”. Uh! ci devo pensare, forse un revival di “E Ruby” che una volta si sentiva spesso; a proposito cosa si dice di Ruby?

JavaScript è popolare, come Python, anzi in certi ambienti molto di più. E conosciuto, come e, forse, più di Python. Si può usare per riscrivere piccoli programmi obsoleti? Per esempio quelli vecchi in Visual Basic. Forse anche le macro di Excel (detesto la parola “macro” usata in questo senso). Uh! ci devo pensare, anzi provo, ne avrò per un paio di posts, questo è il primo.

In passato avevo esaminato l’ottimo Eloquent JavaScript di Marijn Haverbeke, adesso c’è la versione 3. Fondamentale per i nuovi.

Ma per me niente online, niente Web, piuttosto elaborazioni numeriche –vengo dal Fortran, me number cruncher.

Un test minimo, leggere un file di dati e eseguire su questi qualche calcolo. Sia dati il file dei dati:

Test minimo per confronto tra Python e Node.js
1
0
-1
42

La prima riga è una stringa, un titolo, le successive sono valori numerici di cui voglio calcolare il seno, l’esponenziale e il logaritmo (naturale). È un primo approccio, minimo, mancano controlli, ma lo voglio semplice. Salta fuori che per un niubbo come me i due scripts risultano molto simili:

Python

#!/usr/bin/python3
from sys import argv
from math import sin, exp, log

def my_elab(st):
  v = float(st)
  s = sin(v)
  e = exp(v)
  r1 = f'{st} {s} {e}'
  if v > 0:
    r2 = ' ' + str(log(v))
  else:
    r2 = ''
  return r1 + r2

if len(argv) < 2:
  print("file dei dati non indicato")
  exit(2)

fdati = argv[1]
with open(fdati, 'r') as f:
  dati = f.readlines()

fout = fdati + '-py.out'
g = open(fout, 'w')
print(dati[0], file = g)

ndati = len(dati)
for n in range(1, ndati):
  print(my_elab(dati[n].rstrip()), file = g)
* py-js-1 $ chmod +x stuff.py
* py-js-1 $ ./stuff.py dati
* py-js-1 $ cat dati-py.out
Test minimo per confronto tra Python e Node.js

1 0.8414709848078965 2.718281828459045 0.0
0 0.0 1.0
-1 -0.8414709848078965 0.36787944117144233
42 -0.9165215479156338 1.739274941520501e+18 3.7376696182833684

Node.js

#!/usr/bin/node

my_elab = function(st) {
  v = Number(st);
  s = Math.sin(v);
  e = Math.exp(v);
  bl = " "
  r1 = v + bl + s + bl + e;
  if (v > 0) {
    r2 = bl + Math.log(v);
  }else{
    r2 = "";
  }
  return r1 + r2;
}

if (process.argv.length < 3) {
  console.log("file dei dati non indicato");
  process.exit(2);
}

var fdati = process.argv[2];
var fs = require("fs");
var dati = fs.readFileSync(fdati, "utf-8").split("\n");

var ndati = dati.length;
if (dati[ndati - 1] == "") { ndati -= 1};

var fout = fdati + "-js.out"
fs.writeFileSync(fout, dati[0] + "\n\n", 'utf8');

for (let n = 1; n < ndati; n ++) {
  fs.appendFileSync(fout, my_elab(dati[n]) + "\n", 'utf8');
}
* py-js-1 $ chmod +x stuff.js
* py-js-1 $ ./stuff.js dati
* py-js-1 $ cat dati-js.out
Test minimo per confronto tra Python e Node.js

1 0.8414709848078965 2.718281828459045 0
0 0 1
-1 -0.8414709848078965 0.36787944117144233
42 -0.9165215479156338 1739274941520501000 3.7376696182833684

OK, sì, richiede affinamenti OK 😁

Posta un commento o usa questo indirizzo per il trackback.

Trackback

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

%d blogger hanno fatto clic su Mi Piace per questo: