Kako pretvoriti Python u JavaScript (i natrag)

Python ili JavaScript? Iako se još uvijek prepiremo oko toga tko ima prednost ili ima svjetliju budućnost, malo je sumnje u to tko posjeduje prednji kraj weba. To je JavaScript u pregledniku ili ništa.

Pa, možda ne  ništa.  JavaScript je omiljeni ciljni jezik za "transpilere" koji pretvaraju jedan programski jezik u drugi (vidi: TypeScript, Emscripten, Cheerp, Cor). A Pythonova velika pratnja i bogatstvo dostupnih knjižnica čine ga izvrsnim kandidatom za pretvaranje, tj. Prevođenje u JavaScript.

Evo četiri trenutna projekta za stvaranje Pythona korisnim u JavaScript svijetu. Jedna se ističe sposobnošću pretvaranja u oba smjera.

Brython

Jedno od obećanja koje WebAssembly daje jest da će nam omogućiti da koristimo bilo koji jezik koji odaberemo za razvoj weba, iako je to i dalje daleki cilj. Filozofija iza Brythona, barem što se tiče Pythona 3, je zašto čekati?

Brython implementira verziju Pythona 3 za klijentsko web programiranje putem JavaScript biblioteke koja oponaša sve ključne riječi i većinu ugrađenih Python 3. Skripte napisane na Pythonu mogu se uključiti izravno na web stranicu. Brython isporučuje sučelje Python modula na visokoj razini (  browser paket) za interakciju s DOM-om i preglednikom, tj. Za rukovanje svim uobičajeno obavljenim poslovima u JavaScript-u.

Mnoštvo primjera koda uživo i galerija mini aplikacija pokazuju kako sve to funkcionira. Čak je moguće koristiti Brython za pisanje izvorne Android aplikacije u Pythonu. Dostupna je async funkcionalnost, iako morate koristiti Brythonov asyncmodul umjesto Pythonovog asyncio.

Brython ne izbjegava ograničenja nametnuta JavaScriptu u pregledniku. Na primjer, ne postoji podrška za bavljenje lokalnim datotečnim sustavom. Postoji, međutim, podrška za upotrebu HTML5 lokalne pohrane, ako je sve što vam treba na neki način zadržati podatke na osnovi aplikacije.

JavaScripthon

JavaScripthon se usredotočuje na prevođenje Pythona 3.5 i novijih koda na JavaScript, bez pokušaja pružanja potpune podrške u pregledniku prema projektima poput Brythona. Emitira ES6 kôd kako bi se minimalizirala potreba za polifilima na strani preglednika i dobro se poigrava s alatima poput Webpack-a čuvajući izvorne karte.

Podržana je većina uobičajenih ključnih riječi i ponašanja u Pythonu , uključujući asynci await, f-nizove Python 3.6 i metode i nasljeđa klase Python. Također možete umetnuti JavaScript umetnut putem posebnog poziva funkcije, ako ikad trebate izravno spustiti se na JavaScript.

Imajte na umu da su posljednje obveze za projekt JavaScripthon bile u svibnju 2018., tako da nije dobio podršku za najnovije značajke Pythona, poput "operatora morža". No, svatko tko koristi Python 3.6 značajke trebao bi biti dobro podržan.

[Također na: 24 Python knjižnice za svakog programera Pythona]

Jiphy

Ime Jiphy kratica je od "JavaScript in, Python out." Drugim riječima, Jiphy se pretvara u oba smjera između dva jezika. Osim toga, kod s oba jezika može se međusobno pomiješati prije nego što se pretvori u bilo koji ciljni jezik.

Prije nego što zaronite i započnete pretvarati sav OpenStack u JavaScript, pripazite: Jiphy nije stvar potpuno pretvorene baze podataka. Umjesto toga, njegova je funkcija, kako kaže README, "smanjiti prebacivanje konteksta potrebno za Python programer da napiše JavaScript kôd i obrnuto."

Najveći nedostatak Jiphyja je taj što podržava samo podskup Pythonovih značajki. Nisu dostupne ni klase ni zadani argumenti, iako su podržani ukrasitelji i iznimke. Mnogo je toga zato što Jiphy teži liniji do linije između izvornog i ciljnog koda, ali njegovi su programeri uvidjeli u nove značajke ES6 za napredniju podršku Python značajki.

Napominjemo da se projekt Jiphy nije ažurirao od kraja 2017. Jiphy treba smatrati strogo eksperimentalnim dok se rad na njemu ne nastavi.

JS2Py

JS2Py pretvara JavaScript u Python, kao što i samo ime kaže, koristeći čisti Python mehanizam za pretvorbu. Trenutno ima službenu podršku samo za ES5, iako postoji eksperimentalna podrška za hrabre i hrabre ES6.

JS2Py podržava veliku količinu međusobne interakcije između Pythona i JavaScript-a. Postojeće module Node.js možete uvesti u svoj Python kôd js2py.requiremetodom. Varijable s JavaScript strane mogu se procijeniti na Python strani, a Python objekti mogu se koristiti i iz JavaScript koda.

JS2Py također uključuje vrlo eksperimentalni virtualni stroj koji procjenjuje JavaScript kôd iz Pythona, ali se još ne preporučuje za produkcijsku upotrebu.

RapydScript

RapydScript obećava "Pythonic JavaScript koji nije sranje." Projekt je sličan CoffeeScriptu jer unosi kod napisan na alternativnom jeziku - u ovom slučaju, okusu Pythona - i generira JavaScript koji se može pokretati bilo gdje onakav kakav jest. 

Stoga RapydScript pruža najbolje iz oba svijeta, donoseći Pythonovu čistu sintaksu JavaScript mogućnostima poput anonimnih funkcija, DOM manipulacijom i mogućnosti iskorištavanja JavaScript knjižnica poput jQuery ili Node.js jezgre. Točno - možete koristiti Rapydscript generirani kôd za pogon web stranica ili aplikacija Node. 

Još jedna prikladna značajka RapydScrypt: nudi nomenklature Python i JavaScript za određene operacije kada je to moguće. Na primjer, $specijalni simbol koji koristi jQuery djeluje onako kako jest u RapydScriptu, a nizovi mogu podržavati i metode .push(JavaScript) i .append(Python).

Transkriptiranje

Ako čujete ime Transcrypt i mislite na TypeScript, niste daleko od oznake. Transcrypt slijedi istu osnovnu ideju - transpilira Python u JavaScript. Također pokušava sačuvati, gdje god je to moguće, strukturu i idiome izvornog Python koda, uključujući konstrukcije poput lambda i višestruko nasljeđivanje među klasama.

Štoviše, izvorne se mape mogu generirati za prepisani kôd koji upućuje na izvorni Python, tako da programeri mogu ispraviti pogreške koristeći taj kôd umjesto generiranog JavaScript-a. Prema dokumentaciji, Transcrypt te zadatke izvršava s CPythonovim modulom Abstract Syntax Tree, koji omogućava programski pristup načinu na koji Python raščlanjuje vlastiti kôd.

Jedna od najvećih prednosti Transcrypta je automatski pristup JavaScript-ovom objektnom modelu dokumenata (DOM). Na primjer, ako pokušate pristupiti  document.getElementById u Pythonu, pretvoreni će kôd koristiti stvarni  document.getElementById u JavaScript-u.

Povezani projekt, koji je i dalje u velikoj mjeri, je Numscrypt, koji prenosi NumPy matematičku i statističku biblioteku na JavaScript. Do sada Numscrypt pruža samo podskup značajki NumPy-a, iako su ove značajke (npr. Matrična matematika) među najčešće korištenim. Međutim, Numscrypt se nije ažurirao od 2018. godine.