Как да конвертирате Python в JavaScript (и обратно)

Python или JavaScript? Докато все още спорим кой има надмощие или по-светлото бъдеще, съществува малко съмнение кой притежава предния край на мрежата. Това е JavaScript в браузъра или нищо.

Е, може би не  нищо.  JavaScript е предпочитан целеви език за „преводачи“, които преобразуват един език за програмиране в друг (вижте: TypeScript, Emscripten, Cheerp, Cor). А огромното следване и богатството от налични библиотеки на Python го правят чудесен кандидат да бъде преобразуван, т.е. транслиран, в JavaScript.

Ето четири текущи проекта за превръщане на Python в полезен в света на JavaScript. Човек се откроява, като може да конвертира в двете посоки.

Brython

Едно от обещанията, които WebAssembly дава, е да ни позволи да използваме всеки език, който сме избрали да разработим за мрежата, въпреки че това остава далечна цел. Философията зад Brython, поне що се отнася до Python 3, е защо да чакаме?

Brython изпълнява версия на Python 3 за клиентско уеб програмиране чрез JavaScript библиотека, която емулира всички ключови думи и повечето вградени за Python 3. Скриптове, написани на Python, могат да бъдат включени директно в уеб страница. Brython предоставя интерфейс на модула на високо ниво на Python (  browser пакета), за да взаимодейства с DOM и браузъра, т.е. да се справи с цялата работа, която обикновено се извършва директно в JavaScript.

Много примери за кодове на живо и галерия от мини-приложения демонстрират как работи всичко. Възможно е дори да използвате Brython, за да напишете собствено приложение за Android в Python. Налична е асинхронна функционалност, въпреки че трябва да използвате модула на Brython asyncвместо Python asyncio.

Brython не избягва ограниченията, наложени на JavaScript в браузъра. Например няма поддръжка за работа с локалната файлова система. Налице е обаче поддръжка за използване на HTML5 локално хранилище, ако всичко, от което се нуждаете, е някакъв начин да запазите данните за всяко приложение.

JavaScripthon

JavaScripthon се фокусира стриктно върху превода на Python 3.5 и по-късен код в JavaScript, без да се опитва да осигури пълна поддръжка в браузъра според проекти като Brython. Той излъчва ES6 код, за да сведе до минимум необходимостта от полифили от страна на браузъра и играе добре с инструменти като Webpack, като запазва изходните карти.

Поддържат се повечето от често срещаните ключови думи и поведения на Python, включително asyncи await, f-низове на Python 3.6 и методи и наследства от клас на Python. Можете също така да вмъкнете JavaScript вграден чрез извикване на специална функция, ако някога ви се наложи да преминете директно към JavaScript.

Обърнете внимание, че последните ангажименти към проекта JavaScripthon бяха през май 2018 г., така че той не е получил поддръжка за най-новите функции на Python като „оператора на моржове“. Но всеки, който използва Python 3.6 функции, трябва да бъде добре поддържан.

[Също на: 24 библиотеки на Python за всеки разработчик на Python]

Джифи

Името на Jiphy е съкращение от „JavaScript in, Python out.“ С други думи, Джифи се превръща в двете посоки между двата езика. Освен това кодът от двата езика може да се смеси, преди да бъде конвертиран в който и да е от целевите езици.

Преди да се потопите и да започнете да конвертирате целия OpenStack в JavaScript, обърнете внимание: Jiphy не е за пълноценно преобразуване на кодова база. По-скоро неговата функция е, както казва README, „да намали превключването на контекста, необходимо на разработчика на Python да пише JavaScript код и обратно.“

Най-големият недостатък на Jiphy е, че той поддържа само подмножество от функции на Python. Не са налични нито класове, нито аргументи по подразбиране, въпреки че се поддържат декоратори и изключения. Голяма част от това е така, защото Jiphy се стреми към връзка между редовете между изходния и целевия код, но разработчиците му са разгледали новите функции в ES6 за по-усъвършенствана поддръжка на функции на Python.

Имайте предвид, че проектът Jiphy не е актуализиран от края на 2017 г. Jiphy трябва да се счита за строго експериментален, докато работата по него не бъде възобновена.

JS2Py

JS2Py преобразува JavaScript в Python, както подсказва името, използвайки механизъм за преобразуване с чист Python. В момента има официална поддръжка само за ES5, въпреки че има експериментална поддръжка за смели и смели ES6.

JS2Py поддържа голяма част от взаимната оперативна съвместимост между Python и JavaScript. Можете да импортирате съществуващи модули Node.js във вашия код на Python, чрез js2py.requireметод. Променливите от страна на JavaScript могат да бъдат оценени от страна на Python, а Python обектите могат да се използват и от JavaScript кода.

JS2Py включва и силно експериментална виртуална машина, която оценява JavaScript кода от Python, но все още не се препоръчва за производствена употреба.

RapydScript

RapydScript обещава „Pythonic JavaScript, който не е гаден.“ Проектът е подобен на CoffeeScript, тъй като поглъща код, написан на алтернативен език - в случая вкус на Python - и генерира JavaScript, който може да работи навсякъде, както е. 

По този начин RapydScript предоставя най-доброто от двата свята, като довежда чистия синтаксис на Python до възможностите на JavaScript като анонимни функции, DOM манипулация и способността да се използват JavaScript библиотеки като jQuery или Node.js ядрото. Точно така - можете да използвате генериран от Rapydscript код за шофиране на уеб страници или Node приложения. 

Друга удобна функция на RapydScrypt: Той предлага както Python, така и JavaScript номенклатури за определени операции, когато е възможно. Например $специалният символ, използван от jQuery, работи както е в RapydScript и масивите могат да поддържат както методите .push(JavaScript), така и .append(Python).

Прекриптиране

Ако чуете името Transcrypt и мислите TypeScript, не сте далеч от марката. Transcrypt следва същата основна идея - тя транслира Python в JavaScript. Той също така се опитва да запази, където е възможно, структурата и идиомите на оригиналния код на Python, включително конструкции като ламбда и множествено наследяване между класове.

Нещо повече, изходните карти могат да бъдат генерирани за транслирания код, който сочи обратно към оригиналния Python, така че разработчиците могат да отстраняват грешки, използвайки този код вместо генерирания JavaScript. Според документацията Transcrypt изпълнява тези задачи с модула за абстрактно синтаксисно дърво на CPython, който позволява програмен достъп до начина, по който Python анализира собствения си код.

Едно от най-големите предимства на Transcrypt е автоматичният достъп до обектния модел на документа на JavaScript (DOM). Ако се опитате да осъществите достъп  document.getElementById в Python например, преобразуваният код ще използва действителния  document.getElementById в JavaScript.

Свързан проект, който все още е в сериозна опаковка, е Numscrypt, който пренася библиотеката NumPy математика и статистика към JavaScript. Засега Numscrypt предоставя само подмножество от функции на NumPy, въпреки че тези функции (например матрична математика) са сред най-често използваните. Numscrypt обаче не е актуализиран от 2018 г. насам.