Come convertire Python in JavaScript (e viceversa)

Python o JavaScript? Mentre stiamo ancora discutendo su chi ha il sopravvento o su un futuro migliore, esistono pochi dubbi su chi possiede il front-end del web. È JavaScript nel browser o niente.

Beh, forse non  niente.  JavaScript è un linguaggio di destinazione preferito per i "transpiler" che convertono un linguaggio di programmazione in un altro (vedere: TypeScript, Emscripten, Cheerp, Cor). E l'enorme seguito e la ricchezza di librerie disponibili di Python lo rendono un ottimo candidato per essere convertito, cioè traspilato, in JavaScript.

Ecco quattro progetti attuali per rendere Python utile nel mondo JavaScript. Uno si distingue per la possibilità di convertire in entrambe le direzioni.

Brython

Una delle promesse che WebAssembly fa è consentirci di utilizzare qualsiasi linguaggio che scegliamo di sviluppare per il web, anche se questo rimane un obiettivo lontano. La filosofia alla base di Brython, almeno per quanto riguarda Python 3, è perché aspettare?

Brython implementa una versione di Python 3 per la programmazione web lato client tramite una libreria JavaScript che emula tutte le parole chiave e la maggior parte dei built-in per Python 3. Gli script scritti in Python possono essere inclusi direttamente in una pagina web. Brython fornisce un'interfaccia del modulo Python di alto livello (il  browser pacchetto) per interagire con il DOM e il browser, ovvero per gestire tutto il lavoro normalmente svolto direttamente in JavaScript.

Un sacco di esempi di codice live e una galleria di mini-applicazioni dimostrano come funziona il tutto. È anche possibile utilizzare Brython per scrivere un'app Android nativa in Python. La funzionalità asincrona è disponibile, anche se devi usare il asyncmodulo di Brython invece di quello di Python asyncio.

Brython non sfugge alle restrizioni imposte a JavaScript nel browser. Ad esempio, non è disponibile alcun supporto per gestire il file system locale. Esiste, tuttavia, il supporto per l'utilizzo dell'archiviazione locale HTML5, se tutto ciò di cui hai bisogno è un modo per rendere persistenti i dati in base all'applicazione.

JavaScripthon

JavaScripthon si concentra strettamente sulla traduzione di codice Python 3.5 e versioni successive in JavaScript, senza cercare di fornire il supporto completo nel browser come per progetti come Brython. Emette codice ES6 per ridurre al minimo la necessità di polyfill sul lato browser e funziona bene con strumenti come Webpack preservando le mappe di origine.

Sono supportate la maggior parte delle parole chiave e dei comportamenti comuni di Python, inclusi asynce await, f-string di Python 3.6 e metodi ed eredità delle classi Python. Puoi anche inserire JavaScript in linea tramite una chiamata a una funzione speciale, se devi passare direttamente a JavaScript.

Nota che gli ultimi impegni per il progetto JavaScripthon sono stati nel maggio 2018, quindi non ha ricevuto il supporto per le ultime funzionalità di Python come l '"operatore walrus". Ma chiunque utilizzi le funzionalità di Python 3.6 dovrebbe essere ben supportato.

[Anche su: 24 librerie Python per ogni sviluppatore Python]

Jiphy

Il nome Jiphy è un'abbreviazione di "JavaScript in, Python out". In altre parole, Jiphy converte in entrambe le direzioni tra le due lingue. Inoltre, il codice di entrambe le lingue può essere mescolato prima di essere convertito in una delle lingue di destinazione.

Prima di immergerti e iniziare a convertire tutto OpenStack in JavaScript, fai attenzione: Jiphy non riguarda la conversione completa della base di codice. Piuttosto, la sua funzione è, come dice il README, "ridurre il cambio di contesto necessario a uno sviluppatore Python per scrivere codice JavaScript e viceversa".

Il più grande svantaggio di Jiphy è che supporta solo un sottoinsieme delle funzionalità di Python. Non sono disponibili né classi né argomenti predefiniti, sebbene siano supportati decoratori ed eccezioni. Ciò è dovuto in gran parte al fatto che Jiphy si impegna per una relazione riga per riga tra il codice sorgente e quello di destinazione, ma i suoi sviluppatori hanno osservato le nuove funzionalità in ES6 per un supporto più avanzato delle funzionalità Python.

Si noti che il progetto Jiphy non è stato aggiornato dalla fine del 2017. Jiphy dovrebbe essere considerato strettamente sperimentale fino alla ripresa dei lavori.

JS2Py

JS2Py converte JavaScript in Python, come suggerisce il nome, utilizzando un motore di conversione Python puro. Al momento ha il supporto ufficiale solo per ES5, anche se c'è il supporto sperimentale ES6 per i coraggiosi e audaci.

JS2Py supporta una grande quantità di interoperabilità tra Python e JavaScript. Puoi importare i moduli Node.js esistenti nel tuo codice Python, tramite un js2py.requiremetodo. Le variabili dal lato JavaScript possono essere valutate dal lato Python e gli oggetti Python possono essere utilizzati anche dal codice JavaScript.

JS2Py include anche una macchina virtuale altamente sperimentale che valuta il codice JavaScript da Python, ma non è ancora raccomandato per l'uso in produzione.

RapydScript

RapydScript promette "JavaScript pitonico che non fa schifo". Il progetto è simile a CoffeeScript in quanto ingerisce codice scritto in un linguaggio alternativo - in questo caso, un sapore di Python - e genera JavaScript che può essere eseguito ovunque così com'è. 

Pertanto RapydScript fornisce il meglio di entrambi i mondi, portando la sintassi pulita di Python alle funzionalità JavaScript come funzioni anonime, manipolazione DOM e la capacità di sfruttare le librerie JavaScript come jQuery o il core Node.js. Esatto: puoi utilizzare il codice generato da Rapydscript per guidare pagine web o app Node. 

Un'altra comoda funzionalità di RapydScrypt: offre sia nomenclature Python che JavaScript per determinate operazioni, quando possibile. Ad esempio, il $simbolo speciale utilizzato da jQuery funziona così com'è in RapydScript e gli array possono supportare sia il metodo .push(JavaScript) che .append(Python).

Transcrypt

Se senti il ​​nome Transcrypt e pensi TypeScript, non sei lontano dal segno. Transcrypt segue la stessa idea di base: trasporta Python in JavaScript. Cerca anche di preservare, ove possibile, la struttura e gli idiomi del codice Python originale, inclusi costrutti come lambda e ereditarietà multipla tra classi.

Inoltre, è possibile generare mappe sorgente per il codice traspilato che rimandano al Python originale, in modo che gli sviluppatori possano eseguire il debug utilizzando quel codice invece del JavaScript generato. Secondo la documentazione, Transcrypt esegue queste attività con il modulo Abstract Syntax Tree di CPython, che consente l'accesso programmatico al modo in cui Python analizza il proprio codice.

Uno dei maggiori vantaggi di Transcrypt è l'accesso automatico al Document Object Model (DOM) di JavaScript. Se provi ad accedere  document.getElementById in Python, ad esempio, il codice convertito utilizzerà l'attuale  document.getElementById in JavaScript.

Un progetto associato, e ancora pesantemente nascosto, è Numscrypt, che trasferisce la libreria matematica e statistiche NumPy su JavaScript. Finora Numscrypt fornisce solo un sottoinsieme delle funzionalità di NumPy, sebbene queste funzionalità (ad esempio, la matematica delle matrici) siano tra le più comunemente utilizzate. Tuttavia, Numscrypt non è stato aggiornato dal 2018.