Node.js vs Python: confronto tra le due tecnologie per il backend

La scelta di un linguaggio di programmazione per lo sviluppo del backend di un'applicazione è un passo cruciale. Esistono diversi linguaggi che rispondono alle esigenze dei vari progetti. In questo articolo analizziamo Node.js e Python, i due linguaggi più utilizzati, per scoprire le loro caratteristiche e fornire una guida per una scelta consapevole.

Share

Reading time: 6 minutes

Durante le fasi di progettazione di un’applicazione una delle domande che ci si pone è: quale linguaggio di programmazione usare per il backend? Al giorno d’oggi la scelta non è facile. Esistono infatti diversi linguaggi di programmazione, da quelli più classici e noti (ad esempio Java), a quelli più “moderni” come Dart. Pertanto, in molti casi si analizzano sia le funzionalità e le capacità di calcolo richieste dall’applicazione, sia le competenze degli sviluppatori coinvolti nel progetto. Questo ultimo aspetto, in molti casi, condiziona pesantemente la scelta finale.

Supponiamo per un momento che questo vincolo sia più lasco e che, quindi, possiamo scegliere liberamente il linguaggio di programmazione per la nostra futura applicazione. Ovviamente, molti programmatori hanno le proprie preferenze, ma non facciamoci condizionare da ciò. Di seguito analizzeremo due dei linguaggi più utilizzati per lo sviluppo del backend: Node.js e Python. Vedremo le caratteristiche principali di ciascuno di essi e li metteremo a confronto.

Panoramica

Node.js non è un linguaggio di programmazione, ma piuttosto un ambiente runtime open-source per JavaScript. È stato inizialmente rilasciato nel 2009 da Ryan Dahl, mentre l’ultima versione (al momento della stesura di questo articolo) è di poche settimane fa, ossia la versione 16.14.0 ‘Gallium’ (LTS) del 2022-02-08.

La cosa eccezionale di Node.js è che si basa sul motore V8 di Google. È una macchina virtuale con interprete, compilatori e ottimizzatori integrati. Scritto in C++, questo motore è stato progettato da Google per essere utilizzato in Google Chrome. Lo scopo di questo motore è quello di compilare le funzioni JavaScript in un codice macchina. V8 è noto per la sua alta velocità e le sue prestazioni in costante progresso.

Python è un linguaggio di programmazione di alto livello open-source. È stato rilasciato per la prima volta nel 1991 da Guido van Rossum. L’ultima versione è Python 3.10.2, ed è stata rilasciata a gennaio 2022. 

Python funziona principalmente su App Engine di Google. Anch’esso sviluppato da Google, l’App Engine consente di sviluppare web app con Python e permette di beneficiare di numerose librerie e strumenti che i migliori sviluppatori Python utilizzano.

Architettura

Node.js è progettato come un ambiente event-driven, che permette un input/output asincrono. Un certo processo viene chiamato non appena si verifica il rispettivo evento, il che significa che nessun processo blocca il thread. L’architettura event-driven di Node.js è perfettamente adatta allo sviluppo di applicazioni di chat e giochi web.

Questa sua caratteristica risulta però non ideale per l’esecuzione di procedure sequenziali e/o transazionali dove un’operazione deve avvenire se e solo se tutte quelle precedenti sono andate a buon fine. Esistono alcuni pattern per ovviare, qualora sia necessario, a questo inconveniente, ma complicano la stesura e la comprensione del codice.

Differentemente, Python non è nativamente orientato agli eventi. E’ possibile, pertanto, usarlo per sviluppare un’applicazione asincrona e guidata dagli eventi con l’aiuto di speciali moduli e/o framework (ad esempio, asyncio, celery).

Velocità

Entrambi i linguaggi appartengono alla categoria dei linguaggi interpretati che sono generalmente più lenti dei linguaggi compilati, come Java. Nonostante ciò, sia Python che Node.js mostrano una discreta velocità nell’esecuzione del codice.

In particolare, Node.js risulta in molti casi più veloce di Python grazie al motore V8 di Google e alla sua architettura event-driven non-blocking. Questo aspetto, unito al caching, permette di elaborare diverse richieste allo stesso tempo velocizzando l’esecuzione dell’applicazione. Diversamente Python è a flusso singolo e ciò implica che le richieste vengono elaborate molto più lentamente.

Applicazioni che devono fornire funzionalità real-time di solito vengono sviluppate in Node.js. Se però, sono richiesti calcoli o una logica applicativa complessi si predilige Python. Ad esempio, applicazioni orientate al data mining, machine learning e AI sono spesso sviluppate in Python.

Sintassi

La sintassi di Node.js è abbastanza simile al JavaScript, quindi è molto apprezzata dagli sviluppatori di front-end. Per alcune operazioni richiede però la stesura di parecchie linee di codice. Quella di Python spesso è valutata positivamente grazie alla sua compattezza e la mancanza di parentesi. Bastano, infatti, poche linee di codice per effettuare operazioni complesse o definire strutture dati particolari. Inoltre, la sintassi di Python si presta maggiormente a leggere e debuggare il codice altrui. Per questi motivi, anche se la valutazione è molto soggettiva, Python viene usati in molti corsi accademici come principale linguaggio di programmazione.

Scalabilità

L’architettura di Node.js permette uno sviluppo nativo orientato ai microservizi, dove ciascun modulo verrà eseguito indipendente e comunicherà con gli altri ove necessario. Ciò permette di aggiungere facilmente altri microservizi e far scalare un’applicazione web sia orizzontalmente che verticalmente. Per scalabilità orizzontalmente, si intende l’aggiunta di nuovi nodi al sistema, mentre quella verticale richiede l’aumento delle risorse dei singoli nodi.

Per scalare un’applicazione Python, è necessario usare il multithreading. Nonostante esistano diverse librerie per far ciò, bisogna considerare che il risultato non è un “vero” multithreading. Infatti, anche se si definiscono più thread, il Global Interpreter Lock (GIL) non permette all’interprete Python di eseguire compiti simultaneamente, ma solo un thread alla volta. Python deve usare necessariamente il GIL, anche se questo influisce negativamente sulle prestazioni, perché la gestione della memoria di Python non è thread-safe.

Estensibilità

Node.js può essere facilmente personalizzato, esteso e integrato con vari strumenti. le librerie e i pacchetti sono gestiti da NPM – il Node Package Manager. È uno dei più grandi repository di librerie software. NPM è veloce, ben documentato e facile da imparare a lavorare. Grazie a Babel (un compilatore JS) si facilita lo sviluppo front-end con vecchie versioni di Node o del browser. Jasmine., invece, è utile per gli unit test, mentre Log.io è usato per il monitoraggio del progetto e la risoluzione dei problemi. Infine, per la migrazione dei dati, la gestione dei processi e il bundling dei moduli, si può usare Migrat, PM2 e Webpack. Lo sviluppo di applicazioni web può essere faciltato mediante l’impiego di framework quali Express, Hapi, Meteor, Koa, Fastify, Nest e Restify.

Il repository di pacchetti pip fornisce una pletora di moduli per personalizzare il proprio progetto Python. Pip è veloce, affidabile e facile da usare, quindi anche gli sviluppatori lo trovano facile da imparare a lavorare. Si trovano moduli per l’analisi dei dati, librerie per l’interfacciamento ai database e molto altro. Tra i frameworks più popolari per lo sviluppo di applicazioni web ricordiamo Django e Flask che abbiamo già analizzato nell’articolo Django vs Flask: confronto tra i web framework Python.

Universalità

Node.js è usato prevalentemente per lo sviluppo backend delle applicazioni web. Tuttavia, per lo sviluppo frontend, si usa JavaScript in modo che sia il frontend che il backend condividano lo stesso linguaggio di programmazione. Inoltre, è possibile sviluppare anche applicazioni desktop e mobili ibride, insieme a soluzioni cloud e IoT. Essendo multipiattaforma, una singola applicazione desktop funzionerà su Windows, Linux e Mac senza nessuna modifica al codice e riducendo di conseguenza i tempi e i costi di sviluppo.

Python è full-stack, quindi può essere usato sia per lo sviluppo backend che frontend. Simile a Node.js, Python è multipiattaforma, quindi un programma Python scritto su Mac verrà eseguito su Linux. Sia Mac che Linux hanno Python preinstallato, mentre su Windows è necessario installare l’interprete Python da soli. Mentre Python è ottimo per lo sviluppo web e desktop, è piuttosto debole per il mobile computing. Nel campo IoT e AI, la popolarità di Python sta crescendo sempre più rapidamente negli ultimi anni.

Curva di apprendimento

Node.js è basato su JavaScript e può essere facilmente imparato dagli sviluppatori principianti. Non appena si ha qualche conoscenza di JavaScript, padroneggiare Node.js non dovrebbe essere un problema. L’installazione di Node.js è abbastanza semplice, ma introduce alcuni argomenti avanzati. Per esempio, può essere difficile capire la sua architettura event-driven all’inizio. L’architettura event-driven ha un impatto eccezionale sulle prestazioni delle app, ma gli sviluppatori spesso hanno bisogno di un po’ di tempo per padroneggiarla.

Se non si conosce JavaScript, probabilmente è meglio iniziare con Python. La sua sintassi semplice e compatta lo rende un linguaggio facile da apprendere. Imparare Python insegna anche a far rientrare correttamente il vostro codice, dato che il linguaggio è sensibile all’indentazione e agli spazi bianchi (non si usano le parentesi graffe).  Installare Python è più difficile che installare Node.js poiché dipende dal sistema operativo, anche se su Mac e Linux l’interprete è già pre-installato.

In entrambi i casi si consiglia di usare ambienti di virtualizzazione come i containers di Docker per isolare l’ambiente di sviluppo rispetto a quello del sistema operativo dell’host.

Campi applicativi

Grazie alla sua architettura basata sugli eventi, Node.js si adatta perfettamente alle applicazioni che hanno numerose richieste concorrenti, un pesante rendering lato client, o un frequente scambio di dati tra client e server. Alcuni esempi includono soluzioni IoT, chatbot, messaggistica in tempo reale, piattaforme di streaming e complesse Single Page Applications. Tuttavia, Node.js non è la migliore opzione per lo sviluppo di applicazioni che richiedono molte risorse di CPU.

Python è adatto per lo sviluppo di progetti di qualsiasi dimensione. Può essere usato per applicazioni di data science, che coinvolgono l’analisi e la visualizzazione dei dati, sistemi di riconoscimento vocale e facciale, software di elaborazione delle immagini, reti neurali, sistemi di apprendimento automatico, modellazione 3D e giochi.

Conclusioni

In questo articolo abbiamo analizzato i due linguaggi sotto diversi aspetti. Come già detto all’inizio, la scelta dipende da vari fattori, tra cui le richieste funzionali e computazionali del singolo progetto. Personalmente preferisco Python in quanto permette sia lo sviluppo full-stack che l’analisi dei dati, ma ciò non significa che in alcuni progetti Node.js si presenti come la migliore alternativa.

Per riassumere le caratteristiche principali dei due linguaggi riportiamo di seguito una infografica.

Letture consigliate

More To Explore

Elasticsearch

Elasticsearch: query compound

Elasticsearch offre uno strumento molto valido per effettuare ricerche semplici ma anche complesse. In questo articolo capiremo come inserire più condizioni nella stessa query e modificare il calcolo dello score in base a funzioni personalizzate e ad i valori dei dati.

Elasticsearch

Elasticsearch: uso delle term query

Elasticsearch offre uno strumento molto valido non solo per le ricerche testuali, ma anche per i dati strutturati. In questo articolo capiremo come interrogare i campi strutturati mediante le query term. Le varie tipologie di query ci permetteranno di raffinare le ricerche per i nostri progetti futuri.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Design with MongoDB

Design with MongoDB!!!

Buy the new book that will help you to use MongoDB correctly for your applications. Available now on Amazon!