Dynamické jazyky podruhé

30. 11. 2011 14:15 (aktualizováno) zboj

V diskusi pod článkem o smalltalkovském doesNotUnderstand a jeho ekvivalentech v jiných jazycích se objevilo pár nepřesností, takže zde je stručně napravím.

Především je zcela zřejmé, že v C++ žádné dynamické volání nikdy implementovat nemůžeme. To by mělo být jasné každému studentovi po prvním semestru C++. Dynamický dispatch vždy vyžaduje podporu překladače a/nebo runtimu.

A teď k Objective-C. Tento jazyk v současné verzi nepoužívá tabulku řetězců se jmény metod. ObjC má odjakživa selektory a ty jsou vnitřně reprezentovány čísly. Zde je vidět souhra překladače a runtimu. Za běhu se používá inline caching. Nový překladač (clang/LLVM) s rozšířeným runtimem má zrychlené volání zpráv. Díky optimalizacím během překladu i za běhu programu je rychlost volání metod (dispatch objektu známých zpráv) zhruba stejně rychlé jako běžné volání v C++ (ještě nedávno bylo podstatně pomalejší, aspoň co se týče starého runtimu a kódu přeloženého pomocí gcc). Podstatně pomalejší samozřejmě bude případ neznámých zpráv, kdy runtime musí vytvářet instanci NSInvocation.

U Objective-C je dynamický dispatch dotažený téměř k dokonalosti (což je záležitost posledních pár měsíců), navíc se (údajně 7×) zrychlil autorelease pool. Nový překladač zjevně provádí mnoho optimalizací, které gcc nikdy nemělo (pochopitelně, měli plné ruce práce s C++).

Sdílet