[python] problem
superman
feed na centrum.cz
Pátek Leden 4 17:00:59 CET 2008
> No pravda pokud je vynalozene usily nekonecne tak jiste neni problem ani
> extremni varianta ze podle projevu to napisete znovu.
No v případě Pythoního byte kódu je potřeba celkem malé úsilí. Věřte mi.
> Nikdy jsem to nezkoumal ale predpokladam ze compilator se hlavne snazi
> optimalizovat a urychlit zpracovani. Nejedna se tedy jen o nejake
> zakodovani do necitelne formy.
Zase další utopista. Zase další, co nohama není na zemi a pluje kdesi ve
virtuální realitě.
Tak znovu už po tisícté: Optimalizace stojí čas, čas a zase čas! Když
kompilátor překládá třeba moje C++ zdrojáky, tak větší programy na velmi
výkonném počítači do release (tedy optimalizované) verze je schopen
překládat mnoho minut až hodin. Selským rozumem přijdete na to, že
nastartujete Python a program jede - tedy ČASU NA OPTIMALIZACI PYTHON
MOC NEMÁ. Je to odvěká bolístka všech interpretovaných programů, které
cokoli optimalizují/kompilují za běhu programu - chybí jim ČAS na
pořádnou optimalizaci, takže se optimalizuje naprosto minimálně, občas
velmi často vůbec.
Druhá věc je, že dobrá optimalizace je VELMI SLOŽITÝ SW PROBLÉM. Pro
představu ve stávajících kompilátorech je 99% všeho kódu optimalizační
jednotka. Je to to absolutně nejdůležitější, nejsložitější,
nejnamakanější a to nejvíce machrovina, co můžete v sw napsat. Je
tisíckrát jednodušší napsat jádro skvělého operačního systém, nebo třeba
celý dokonalý interpretr Pythonu, ale je velmi až nechutně složité
napsat dobrý neřku-li vynikající optimalizátor - je to IMHO ta nejvyšší
meta jak dokázat svoje kvality jako programátor.
Třetí a velmi podstatná věc je, že optimalizátory přímo magicky
přitahují ty nejhorší možné druhy chyb. Samotný optimalizátor díky své
složitosti a implementaci mnoha velmi sofistikovaných triků je vůbec
problém odladit, ale musíte si uvědomit, že jakákoli chyba, která
zůstane v optimalizátoru vlastně potencionálně způsobuje chybný běh a
chybnou interpretaci všech programů v tomto jazyce/prostředí spuštěném.
Proto se na spolehlivost optimalizátorů kladou obrovské názroky a
většinou se raději udělá horší optimalizátor, než aby byl nespolehlivý.
Chronicky nespolehlivé jsou třeba kompilátory firmy Borland, kde v
případě chyby není občas od věci se podívat do strojáku, zda kompilátor
skuečně přeložil co je ve zdrojovém kódu.
Tedy čtvrtá věc - Python s dobrým optimalizátorem by měl asi tak stokrát
až tisíckrát více řádek zdrojového kódu, než je nyní a jeho vývoj by
stál příslušný násobek času.
Vzhledem k tomu, že autor Pythonu stále řeší gramatické stromy a vnitřní
reprezentaci syntaktického stromu - alespoň tak to pamatuji, když jsem
dění v Pythonu sledoval - a vzhledem k tomu, že zdrojové kódu
interpretetu Pythonu jsem studoval - mohu prohlásit, že optimalizace v
Pythonu se blíží nula, není prakticky žádná.
> Ale z kodu se odstrani vsechny nepotrebnosti jako jsou treba komentare,
> nazvy promenych, bloky ktere nemuzou nikdy nastat (if(0==1):).
Pokud alespoň pár hodin jste programoval v Pythonu a napsal v něm
minimálně "Hello world program", tak jistě víte, že názvy proměnných
jsou ve skutečnosti jen jména v prostoru jmen, a že vzhledem k povaze
Pythonu dost dobře nelze odstraňovat jména proměnných a je dost ztížené
i jejich falšování. Protože těžko vysvětlíte nadřazenému modulu, že se k
proměnné pod pravým názvem jaksi nemohou dostat.
Jinak odstraňování bloků, které nikdy nemohou nastat je možné, ale
předpokládá to dost značnou inteligenci optimalizátoru - a pak platí ty
věci co jsem psal o optimalizaci viz výše.
> Optimalizator by mohl ke stejnymu kusu bytekodu dojit vice cestama.
> Napriklad ruzne moznosti pro vytvoreni cyklu ktere ve vysledku mohou byt
> zkompilovany stejne.
Ano, to teoreticky mohl. Ale prosím, projděte si Python, jeho možnosti a
bude Vám to jasné. Python moc záludností pro byte kód neskrývá,
prakticky žádnou.
> Takze to co dostanete dekompilaci se vasemu puvodnimu zdrojaku podoba,
> stejne se to chova ale vas puvodni zdrojak to neni.
Ne, původní zdroják to není, ale bude velice velice věrně odrážet
původní zdroják. Zvláště v Pythonu dokonce i do takových detailů jako je
třeba dodržení řádek zdrojového kódu (protože nucené odsazení a protože
i v byte kódu jsou informace o řádkách zdrojového kódu a další věci). V
podstatě po dekompilaci byte kódu získám velmi dobrý zdrojový kód, který
mohu dále použít pro další vývoj programu a který se bude maximálně
podobat originálnímu zdrojáku. Na 99,9% bude stejný s mírnými
odchylkami. Názvy proměnných, objektů, funkcí, stejné konstrukce,
naprosto stejné algoritmy jako originální zdroják., Odchylky budou
naprosto nepodstatné.
> Nebo opravdu compilator jen zakoduje zdrojak do strojove lepe citelneho
> tvaru nad kterym uz nemusi provadet syntaktickou analyzu?
V podstatě jste velmi blízko skutečnosti :-)
Miloslav Ponkrác
Další informace o konferenci Python