[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