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.
Autor se zabývá vývojem kompilátorů a knihoven pro objektově-orientované programovací jazyky.
Přečteno 36 261×
Přečteno 25 412×
Přečteno 23 832×
Přečteno 20 213×
Přečteno 17 921×