Comment convertir Python en JavaScript (et inversement)

Python ou JavaScript? Alors que nous nous disputons toujours pour savoir qui a le dessus ou un avenir meilleur, il n'y a guère de doute quant à savoir à qui appartient le front-end du Web. C'est JavaScript dans le navigateur ou rien.

Eh bien, peut-être pas  rien.  JavaScript est le langage cible préféré des «transpileurs» qui convertissent un langage de programmation en un autre (voir: TypeScript, Emscripten, Cheerp, Cor). Et l'immense popularité de Python et la richesse des bibliothèques disponibles en font un excellent candidat pour être converti, c'est-à-dire transpilé, en JavaScript.

Voici quatre projets en cours pour rendre Python utile dans le monde JavaScript. On se démarque en pouvant convertir dans les deux sens.

Brython

L'une des promesses faites par WebAssembly est de nous permettre d'utiliser n'importe quel langage que nous choisissons de développer pour le Web, même si cela reste un objectif lointain. La philosophie derrière Brython, du moins en ce qui concerne Python 3, est pourquoi attendre?

Brython implémente une version de Python 3 pour la programmation Web côté client via une bibliothèque JavaScript qui émule tous les mots-clés et la plupart des éléments intégrés pour Python 3. Les scripts écrits en Python peuvent être inclus directement dans une page Web. Brython fournit une interface de module Python de haut niveau (le  browser package) pour interagir avec le DOM et le navigateur, c'est-à-dire pour gérer tout le travail normalement effectué directement en JavaScript.

De nombreux exemples de code en direct et une galerie de mini-applications montrent comment tout cela fonctionne. Il est même possible d'utiliser Brython pour écrire une application Android native en Python. La fonctionnalité Async est disponible, même si vous devez utiliser le asyncmodule Brython au lieu de Python asyncio.

Brython n'échappe pas aux restrictions imposées à JavaScript dans le navigateur. Par exemple, il n'y a pas de support pour traiter le système de fichiers local. Cependant, il existe une prise en charge pour l'utilisation du stockage local HTML5, si tout ce dont vous avez besoin est d'un moyen de conserver les données pour chaque application.

JavaScripthon

JavaScripthon se concentre strictement sur la traduction du code Python 3.5 et ultérieur en JavaScript, sans essayer de fournir une prise en charge complète dans le navigateur, comme pour des projets tels que Brython. Il émet du code ES6 pour minimiser le besoin de polyfills côté navigateur et fonctionne bien avec des outils comme Webpack en préservant les cartes sources.

La plupart des mots - clés et les comportements communs de Python sont pris en charge, y compris asyncet await, Python 3.6 f-chaînes, et des méthodes de classe Python et les héritages. Vous pouvez également insérer JavaScript en ligne via un appel de fonction spéciale, si jamais vous avez besoin de passer directement à JavaScript.

Notez que les derniers engagements dans le projet JavaScripthon datent de mai 2018, il n'a donc pas reçu de support pour les dernières fonctionnalités Python telles que «l'opérateur morse». Mais toute personne utilisant les fonctionnalités de Python 3.6 devrait être bien prise en charge.

[Également sur: 24 bibliothèques Python pour chaque développeur Python]

Jiphy

Le nom Jiphy est une abréviation de «JavaScript in, Python out». En d'autres termes, Jiphy convertit dans les deux sens entre les deux langues. De plus, le code des deux langues peut être mélangé avant d'être converti dans l'une ou l'autre des langues cibles.

Avant de vous lancer et de commencer à convertir tout OpenStack en JavaScript, prenez garde: Jiphy ne concerne pas la conversion complète de la base de code. Sa fonction est plutôt, comme le dit le README, «de réduire le changement de contexte nécessaire à un développeur Python pour écrire du code JavaScript et vice versa».

Le plus gros inconvénient de Jiphy est qu'il ne prend en charge qu'un sous-ensemble des fonctionnalités de Python. Ni les classes ni les arguments par défaut ne sont disponibles, bien que les décorateurs et les exceptions soient pris en charge. Cela s'explique en grande partie par le fait que Jiphy s'efforce d'établir une relation ligne à ligne entre le code source et le code cible, mais ses développeurs ont observé les nouvelles fonctionnalités d'ES6 pour une prise en charge plus avancée des fonctionnalités Python.

Notez que le projet Jiphy n'a pas été mis à jour depuis fin 2017. Jiphy doit être considéré comme strictement expérimental jusqu'à la reprise des travaux.

JS2Py

JS2Py convertit JavaScript en Python, comme son nom l'indique, à l'aide d'un moteur de conversion purement Python. Il n'a actuellement un support officiel que pour ES5, bien qu'il existe un support expérimental ES6 pour les courageux et les audacieux.

JS2Py prend en charge de nombreuses interopérations croisées entre Python et JavaScript. Vous pouvez importer des modules Node.js existants dans votre code Python, au moyen d'une js2py.requireméthode. Les variables du côté JavaScript peuvent être évaluées du côté Python, et les objets Python peuvent également être utilisés à partir du code JavaScript.

JS2Py comprend également une machine virtuelle hautement expérimentale qui évalue le code JavaScript de Python, mais elle n'est pas encore recommandée pour une utilisation en production.

RapydScript

RapydScript promet «du JavaScript pythonique qui ne craint pas». Le projet est similaire à CoffeeScript en ce qu'il ingère du code écrit dans un autre langage - dans ce cas, une saveur de Python - et génère du JavaScript qui peut s'exécuter n'importe où tel quel. 

Ainsi, RapydScript fournit le meilleur des deux mondes, apportant la syntaxe propre de Python aux capacités JavaScript telles que les fonctions anonymes, la manipulation DOM et la possibilité d'exploiter des bibliothèques JavaScript telles que jQuery ou le noyau Node.js. C'est vrai: vous pouvez utiliser du code généré par Rapydscript pour générer des pages Web ou des applications Node. 

Une autre fonctionnalité pratique de RapydScrypt: il propose des nomenclatures Python et JavaScript pour certaines opérations lorsque cela est possible. Par exemple, le $symbole spécial utilisé par jQuery fonctionne tel quel dans RapydScript, et les tableaux peuvent prendre en charge les méthodes .push(JavaScript) et .append(Python).

Transcrypter

Si vous entendez le nom Transcrypt et pensez TypeScript, vous n'êtes pas loin du compte. Transcrypt suit la même idée de base: il transpile Python en JavaScript. Il essaie également de préserver, dans la mesure du possible, la structure et les idiomes du code Python d'origine, y compris des constructions comme les lambdas et l'héritage multiple entre les classes.

De plus, des cartes source peuvent être générées pour le code transpilé qui pointe vers le Python d'origine, afin que les développeurs puissent déboguer en utilisant ce code au lieu du JavaScript généré. Selon la documentation, Transcrypt accomplit ces tâches avec le module Abstract Syntax Tree de CPython, qui permet un accès par programme à la façon dont Python analyse son propre code.

L'un des plus grands avantages de Transcrypt est l'accès automatique au modèle d'objet de document (DOM) de JavaScript. Si vous essayez d'accéder  document.getElementById en Python, par exemple, le code converti utilisera le réel  document.getElementById en JavaScript.

Numscrypt est un projet associé, et qui reste encore très secret, qui transfère la bibliothèque de mathématiques et de statistiques NumPy vers JavaScript. Jusqu'à présent, Numscrypt ne fournit qu'un sous-ensemble des fonctionnalités de NumPy, bien que ces fonctionnalités (par exemple, les mathématiques matricielles) soient parmi les plus couramment utilisées. Cependant, Numscrypt n'a pas été mis à jour depuis 2018.