rychlost překladu nebo výsledku?
ty projekty jsou hodně odlišné, mají jiné zaměření. Nuitka je v podstatě production ready, py2many k tomu má zatím hodně daleko (a to je pro mě zklamání, měl jsem use case)
no pokud (POKUD) se podaří překlad do C++ nebo do Rustu, tak je to srovatelné s Cythonem a Nuitkou (Cython je obecně rychlejší). Jenže ono se to většinou nepodaří, což je zklamání (Cython a Nuitka naproti tomu přeloží prakticky všechno). Tady v py2many je cíl trošku jinej, a to dostat čitelný zdroják, ne mít něco, co se jen podstrčí překladači céčka. A ten cíl ještě není na 100% dosažen (spíš tak někde okolo 50-60%).
PS: to je asi odpověď, co příliš nepotěší...
19. 6. 2024, 18:11 editováno autorem komentáře
Mna by potesilo keby som nasiel program ktory by vedel prekladat z Pythonu do Ruby. Tieto jazyky nie su az tak daleko od seba a aspon na zakladne studium Ruby by to bolo prakticke.
Nie sú to až tak podobné jazyky. V Ruby je dosť pokročilé metaprogramovanie a rôzne iné vychytávky. V pythone až tak nie, to je pragmatickejší jazyk.
to by nemelo vadit, pokud je Python "mene pokrocily" a Ruby vic. Kdyby to bylo naopak, bylo by to horsi a nektere konstrukce Pythonu by se musely prekladat asi dost divoce.
Presne tak. V praci "musim" programovat v Pythone ale srdcom som Ruby :-) Nie su to zlozite programy, skor vela malych programov ale rucne to prepisovat do Ruby sa mi skutocne nechce. Jasne ze neziadam aby vysledny kod bol na 100% funkcny ale aby sa dal citat a nasledne z editovat do pouzitelne formy.
Je to problém, kedže sa kolega chce učiť ruby a to tak, že bude transpilovať python do ruby.
O tom, či jmá takýto transpiler zmysel a či je ho možné spraviť, polemizovať nechcem.
zrovna ten py2many neni uplne nejnarocnejsi "ohnout" na jinej jazyk. Zatim produkuje rekneme ...ne zcela dobry kod :) ... ale postup maji dobrej: Python->AST (melo byt spis CST, ale co uz) -> stub v jinym jazyce -> formatovac toho jazyka
Mozna jim neco pridam, asi Luu (kdyz bude cas + schopnosti)
Rozlišoval bych transpiler a migrační nástroj:
Transpiler – očekávám korektní výstup, není podstatné, aby byl vhodný k ručním úpravám. S výstupním zdrojovým kódem programátor typicky pracuje podobně jako se zkompilovanou binárkou – neupravuje jej, nezkoumá jej, úpravy probíhají na vstupním kódu. Například Scala.js.
Migrační nástroj – očekávám výstup vhodný k ručním úpravám. Výstup nemusí být za každou cenu korektní, někdy se to bez ručních úprav obejít nemusí. Není to pak plně automatické, ale vyřeší to při přepisu tu část, kterou by zvládla cvičená opice. Vypadne z toho spíše první nástřel.
Projekt py2many bych tedy označil spíše za migrační nástroj než transpiler.
BTW, kdyby to měl být opravdový transpiler (jak ho definuji výše), musel by:
a. Omezit se na podmnožinu Pythonu, zejména vyžadovat typy nebo jejich odvoditelnost (IIRC něco takového dělá Cython) nebo
b. přibalit část Pythoního runtime (někdy celkem netriviální) – ono i pouhé x+y může znamenat leccos, když nevíte typy proměnných x a y. Možná sčítání, možná spojení řetězců, možná něco úplně jiného (operátor lze přetížit). A možná to bude chyba za běhu, protože x bude str a y bude int. (A pak bychom pro úplnost museli řešit Pythoní výjimku, kterou bude kód moci zachytit a ošetřit…)
z tech pozadavku dost plyne, ze to skoro nepujde udelat :) Zase na druhou stranu ty AOT pro Python prekladaji do C, i kdyz vysledek je tedy necitelny a kdyz nejsou type hinty, tak i mizerny (ale co ocekavame ze?).
asi zrovna ten zminenej prevod Python->Ruby by sel udelat nejlip, protoze ty jazyky maji hodne spolecneho
Co přesně skoro nepůjde udělat? Transpiler? IMHO půjde, jen je potřeba přijmout nějaké omezení, jak jsem psal.
asi ano s hodne omezenimi, jak pises. Typy budou nutny, jinak z toho opravdu poleze kod, ktery se bude snazit o dynamicke typovani ve staticky typovanem jazyce, a to nebude dobre (pokud to neni F# a spol.;)
Tak ono i mezi dynamický typovanými jazyky je to problém, pokud chceme řešit rozdílnou sémantiku. Před spoustou let jsem přemýšlel o transpilaci PHP do JS. Oba jazyky jsou dynamické. Jenže i tam je problém. Když bez znalosti typů preložím $a + $b jako a+b a jedno z toho bude string, dostanu jiný výsledek. Mohl bych vše převádět na číslo, ale tím mi nebude fungovat přetěžování operátorů – co když budu mít třídu ComplexNumber? Takže jediné, co bych s tím mohl reálně udělat, že přeložit to na něco jako operatorAdd(a, b), a v rámci této funkce implementovat logiku z PHP. Což vlastně znamená přibalit kus PHP runtime.
A takovéto drobnosti se nahromadí. Třeba blbý null/None. Pokud si ty jazyky nejsou extrémně podobné, nepůjde to udělat bez kompromisu některým směrem.
jj vlastne je to tak. Priste bude ukazka, jakej je problem s (trosku zmenim)
"Hello," * repeat
. To je v Pythonu bez problemu validni, ale tranpiler to nezvladne (jina semantika)
To nejni zaporny indenting, ale vystredeny nadpis a podnadpis.
Teda na tabuli by to tak nikdo nikdy neudelal, ale vidim v tom klasicky dokument...
Tak jako transpiler je ultimátní haxe - tohle už snad fakt nikdo nedá.
https://haxe.org
Tam je to ale samostatný ekosystém - píšeš v haxe a padá Ti z toho už hotový a funkční Python, Javascript, C++, Java ... které jen kompiluješ, spouštíš. U toho na co je to primárně určené - hry a multimedia - naprosto dostatečné.
Našlo si to svoje uživatele - pochopitelně největší je to herní studio autora haxe a dvou jeho virtuálních mašin. Kompilátor samotný v OCamlu. Neuvěřitelné.
jo no. akorat to z nejakyho duvodu nechytilo "momentum" a asi uz je ted pozde, aby Haxe nabral dech (mozna ty hry odradily lidi z jinych oboru?). Ale pred par lety se o tom dost psalo, to je pravda.
Když budu chtít dělat aplikaci v Pythonu, proč používat Haxe? Když budu chtít dělat aplikaci v Rustu, proč používat Haxe? Když budu chtít dělat aplikaci v TypeScriptu, proč používat Haxe? Podle mě ty hry (nějaké plošinovky nebo něco podobného) byly asi jediná nika, kde to mohlo někoho ve větším zaujmout.
Ono to nastoupilo právě když končil ActionScript a Flash, tam to chytlo momentum velice dobře, Haxe je ActionScriptu dost podobný.
Nové věci se v tom pořád dělají, hlavně právě ty multi-media a hry. Využívá se transpilace do Javy a C++ pro mobilní verze, JS pro web, C++ pro desktop. C# transpilace myslím pro Unity, C++ pro Unreal. I Godot se v tom dá používat.
PHP, Python, Js/Node ... tam byly přidané hlavně aby jsi z jednoho Haxe spíchnul i herní server, který je u těch online her nakonec také potřeba.
Na multiplatform hry a multi media - bych se to vůbec nebál použít i dneska.
Ale jinde se to prostě moc nechytlo a už nechytne.