Microsoft nedávno poodhalil budoucnost Windows 8. Základem aplikací je nové běhové prostředí (Windows Runtime, zkráceně WinRT). WinRT je implementované v C++ a aplikace nad WinRT v C++ budou nejefektivnější (.NET jazyky můžou k WinRT přistupovat přes wrapper, stejně jako JS). Kód pro WinRT se píše v jazyce zvaném C++/CX (=C++ Component Extensions), což je C++ s rozšířenou syntaxí vypůjčenou z C++/CLI. Paměť je spravována deterministicky (chybí garbage collector), ale automaticky. Třídy ve WinRT jsou vlastně poněkud upravené COM objekty, jejichž čítač referencí je aktualizován samočinně direktivami překladače (to má výhodu oproti nedeterministickému GC, ale vývojář si musí dávat pozor na cykly v odkazech mezi objekty).
Je celkem jasné, proč Microsoft zvolil tento postup. C++ je efektivnější. Nejde ani tak o rychlost, kód C# běží díky JIT kompilaci v podstatě stejně rychle, ale o paměť. I ten nejdokonalejší garbage collector má vyšší nároky na paměť než C++ s manuálním (byť pro vývojaře chytrým překladačem generovaným) uvolňováním nepotřebných objektů. Stejnou cestu zvolil ostatně od počátku i Apple ve svém iOS, díky čemuž si nejnovější iPhone i iPad bohatě vystačí s 512 MB operační paměti. (Nejnovější překladač clang/LLVM nabízí tzv. Automatic Reference Counting, tedy ani v Objective-C pro iOS už se nemusí vývojaři starat o aktualizování čítače referencí u objektů).
Zde podobnost s iOS nekončí. WinRT nápadně připomíná běhové prostředí (runtime) pro Objective-C (které nepochází původně od Applu, ale Brada Coxe, jenž tento jazyk navrhl jako objektově-orientované rozšíření jazyka C). Jde o podobnost náhodnou, protože Microsoft s WinRT jen oprášil a trochu upravil svou „prastarou“ technologii COM a upravil pro ni překladač pro C++, díky ní ovšem můžeme očekávat hladký běh aplikací (a hlavně nižší spotřebu baterie) psaných pro Metro na zařízeních s pomalejším procesorem a menší pamětí.
Poměrně důležité je (za předpokladu, že WinRT bude po dokončení k dispozici pro Windows Phone), že bude možné psát aplikace v C++ pro všechny důležité mobilní platformy (kromě zmíněného WP tež pro iOS, Blackberry (ať už Blackberry 6/7 nebo QNX) i Android). Stále zůstává dost odlišností (zejména v UI), ale alespoň část kódu bude přenositelná.
NB: Protože občas se vyskytnou nejasnosti, zdůrazňuji, že aplikace pro WinRT nejsou založené na .NET, i když rozšířená syntax se téměř neliší od C++/CLI, které naopak překládá pouze pro .NET (byť s možností nativního kódu ve smíšených binárkách). Může se tedy stát, že naprosto stejný kód půjde přeložit kompilátorem pro C++/CLI i C++/CX, i když výsledek (a sémantika) se budou značně lišit.
"At se jde MS s COMem bodnout, uzasnosti typu "delete this" v Release() jsou vskutku k popukani. Na co mame shared_ptr (nyni i v tr1)?"
On to je upravený COM. Jak mají správu paměti přesně ošetřenou teď, nevím. Nicméně ObjC má (aspoň v původní verzi) v podstatě to samé, nemá sice "delete this" (není to postavené nad C++), ale céčkovské "free" na sebe sama má (v rámci metody "dealloc") také.
U dynamických OO jazyků postavených nad C(++) to je normou. Kupodivu WinRT je (podle prvních benchmarků) překvapivě rychlé.
Počítání referencí je sice hezké, ale funguje dost blbě ve vícevláknovém prostředí, čítač každého objektu musí být chráněn zámkem.
Co jsem tak koukal na přednášku od Hejlsberga, tak api WinRT je asynchronní, takže pro řadu aplikací nemusí být vlákna taková nutnost jako dnes. Dnešní JavaScript je taky single-threaded.
No, budu se na to C++/CX muset podívat, jak to tam s těmi vlákny je.
"Počítání referencí je sice hezké, ale funguje dost blbě ve vícevláknovém prostředí, čítač každého objektu musí být chráněn zámkem."
Jistě, o to se ovšem stará překladač, který generuje celou tu "omáčku" kolem komponent. Nicméně zdá se, že celé WinRT funguje trochu jako node.js, služby jsou tedy asynchronní, ale kód napsaný programátorem běží stále (resp. většinou) v jednom vlákně. Předpokládám, že celý kód kolem počítání referencí je optimalizovaný jako v ARC v clangu (překladače Microsoft psát umí).
Autor se zabývá vývojem kompilátorů a knihoven pro objektově-orientované programovací jazyky.
Přečteno 37 802×
Přečteno 26 442×
Přečteno 25 170×
Přečteno 21 297×
Přečteno 19 101×