Hlavní navigace

Ztraceno v překladu

27. 9. 2013 17:01 zboj

Nikdo jistě nepochybuje o tom, že kompilace je proces na všech úrovních velmi komplikovaný. A v praxi téměř vždy ztrátový. Pokud například překládám kód v C# do Javascriptu, „int x“ a „string x“ se přeloží do „var x“, čímž se ztrácí informace o typu. Při překladu do strojového kódu se samozřejmě z konceptů vyšší úrovně ztratí skoro vše.

Z praktického hlediska je mnohdy žádoucí zachovat strukturu výrazu. Pokud například v C++ použiju

auto filteredCollection = collection.filter(LAMBDA(x > 3));

pro získání podmnožiny nějaké kolekce, je vhodné se zamyslet nad tím, jak by se měl výraz „x > 3“ v ideálním případě přeložit a interpretovat. LAMBDA zde reprezentuje abtrakci lambda výrazu. Například se použije přímo „[](int x) {…}“, to ovšem nemusí to být v obecném případě nejefektivnější. Pokud je totiž kolekce indexovaná (nejde o prosté pole), je vhodnější vytvořit z „x > 3“ AST a ten předat kolekci bez vyhodnocení (chytře implementovaná kolekce tak může použít index a vše bude rychlejší).

Uvedenému způsobu překladu se říká duální. Spočívá v tom, že zdrojový kód se přeloží více způsoby a za běhu se použije ten výhodnější (jde o to, že při duálním překladu se vždy „ztratí“ jiná část informace než při překladu jiným způsobem). V příkladu výše bychom se nejspíše rozhodovali podle typu kolekce. Pochopitelně ne každý jazyk tuto metodu umožňuje. C++ je příkladem jazyka, ve kterém ji lze použít.

Sdílet