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
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.
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
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.
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é.
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.