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.