S příchodem 64bit Windows se objevil i požadavek na 64 bit kompilátor Delphi, který byl až do příchodu Embarcadera na scénu ignorován.
Nyní (polovina roku 2010) je nový kompilátor již třetím rokem vyvíjen s tím, že začátkem příštího roku bude k dispozici preview kompilátoru. Zkusím o něm (a příbuzných tématech) napsal pár poznámek.
V současné době se lze na platformě Windows setkat se dvěma typy 64 bit procesorů:
Itanium od Intelu (neboli IA-64) je nyní chápán jako slepá větev. Bývá osazen prakticky jen v serverech (a navíc často jen od HP a navíc s HP-UX jako OS). V současné době ho i MS přestal podporovat, tj. nemá cenu se jím zabývat. Např. Visual Studio 2010 je poslední verzí s podporou Itanium (to se hlavně týká těch, kdo píší serverové aplikace pro .NET – jsem zvědav jak to budou v budoucnu řešit).
Ohledně 32bit aplikací - 32bit kód se provádí jen díky emulaci – tj. pomalu. Tento typ procesoru klidně můžeme ignorovat - v praxi se s ním pravděpodobně ani nesetkáme.
Procesory s podporou x86-64, tj. 64bit rozšíření, které je plně zpětně kompatibilní s klasickou 32bit architekturou. Původně vytvořeno AMD (nyní pod obchodním názvem AMD64) jako odezva na Itanium, později akceptováno Intelem (prakticky bez výrazných změn pod názvem EM64T) nebo firmou VIA a dalšími. Značka x86-64 je používána jako neutrální název. Prakticky každý procesor nyní prodávaný je této architektury.
Důležité je, že 32 bit aplikace na této platformě běží beze ztráty rychlosti, často rychleji než na 32bit procesorech.
Tím je snad i vyjasněn běh 32bit programů na 64bit procesorech.
S příchodem Windows 64bit vzniká problém s během 32bit programů na této platformě. Pro bezproblémový běh 32bit aplikací na těchto nových Windows tak vznikl WOW64 (Windows on Windows) subsystém, který zprostředkovává rozhraní např. k 64bit jádru nebo přístup k registrům. V podstatě se jedná o lehkou vrstvu, která přístupy na určitá místa (některé části registru nebo souborového systému) přesměrovává jinam, přičemž lze ale přistoupit i na "opravdové místo" pokud člověk chce.
Obecně většina typů aplikací tj. konzolové, GUI i service aplikace jsou podporovány, viz. MSDN ohledně běhu 32bit procesů na 64bit Windows (zde jsou i informace o přesměrování registrů a souborového systému). Většina (dejme tomu 95% aplikací) se o to vůbec nemusí zajímat.
Ohledně rychlosti běhu 32bit aplikací na 64bit Windows via WoW64 - ve zkratce: běh na x86-64 procesorech je ekvivalentní běhu na 32bit procesorech (píši x86-64).
No, ale jak zjistit, že běžíme ve WoW64? Jednoduše zavoláme IsWow64Process, IsWow64Process pro Delphi.
Základním problémem je, že 64bit proces může zavádět jen 64bit knihovny (neplatí pro resource DLL). To mimochodem znamená, že jelikož je Windows Shell takový proces, nelze psát jeho rozšíření (tj. např. integrace do průzkumníka). Částečně to lze obejít přes registry.
S tím souvisí, že pokud máte 64bit MS Office, tak 32bit rozšíření nepůjdou zavést (nejčastěji se to týká Outlooku). Naštěstí sám MS je zatím s doporučováním 64bit office opatrný, což dává EMBT určitý čas.
Ohledně IE (Internet Exploreru): v systému jsou dvě verze - jedna 32bit, jedna 64bit - kvůli tomu, že některé ActiveX jsou 32bit, tak se použije 32bit verze IE.
Dále může být problémem, pokud se chce Váš program hlouběji rýpat v systému, někdy to jde obejít, někdy ne.
Autoři si uvědomují, že nelze neustále upravovat stávající kompilátor. Z toho důvodu se dospělo k rozhodnutí upravit stávající kompilátor, tak aby byl více modulární. Jak to tedy je v současnosti a jak to vypadá do budoucnosti?
Delphi samozřejmě není jen kompilátor, ale je to souhrn několik částí (kompilátor, linker, RTL, VCL a IDE).
Samotný kompilátor (a linker) je psaný v C - s tím, že se postupně upravuje na C++ (resp. to byl záměr – viz Barry Kelly na stackoverflow - velmi zajímavé). Mimochodem v tom dotazu Barry píše, že počet změněných nebo přidaných řádků proti nezměněným je cca 30% za rok, což je docela síla (při velikosti 300K řádků). S tím, že testy kompilátoru jsou budovány cca 20 let. Mimochodem třeba kompilátor FreePascalu je celý psán ve FreePascalu a je sám sebou přeložitelný.
Ale zpět: zbytek je psaný (tj. včetně IDE) v Delphi, resp. Object Pascalu.
V současnosti je výsledkem 32bit kód (jak pro Win32, Linux nebo Mac OSX) – o optimalizacích jsem něco psal, přičemž šablony generátoru (codegen) jsou ručně laděny pro dobré plánování instrukcí v moderních procesorech.
Zjednodušeně: kompilátor při kompilaci zpracuje vstupní .pas soubor a celý stav kompilátoru je uložen do souboru .dcu. Toto umožňuje kdykoliv příště načíst soubor z disku a pokračovat v kompilaci. Nevýhodou je, že dcu je závislé na verzi kompilátoru a prakticky s každou verzí se liší (snad vyjma D2006 a D2007). Výhodou je velmi rychlá kompilace, kdy se kompiluje jen co je třeba a zbytek je použit z předchozí kompilace bez velkého zdržení. Výsledek kompilace je předhozen linkeru.
Následující informace jsou takové spíše střípky.
Kompilátor pro 64bit by měl být první instancí vylepšeného kompilátoru, s tím, že se kompilátor rozdělí na frontend kompilátoru (tj. asi parser a spol.), který zůstane stejný a backend (tj. codegen pro konkrétní procesor), který bude variabilní.
Sem tam prosakuje, že by nový kompilátor měl umět i nový dcu formát, který by nezávisel na verzi Delphi (tj. asi nějaký mezikód generovaný frontend částí). Všechno toto jsou tak spíše naznačované informace, uvidíme snad v první polovině roku 2011.
Ale zaujala mne odpověď David I v konferenci (tj. jednoho z nejvýše postavených lidí ve firmě):
|Yes, of course. I am just wondering whether EMBT think that x86 and
|x64 is all or whether they are planning on compilers for other
|architectures.
With a back end compiler architecture - we are not limited to just
Intel (x86, x64) only. It will be possible to plug in any number of
optimizers and code emitters - whether this work is done by Embarcadero
engineers, chip manufacturers or other engineers and community members.
Což zní velmi zajímavě – ale uvidíme.
S tím totiž možná souvisí i naznačovaní zvažované podpory ARM procesorů (což by bylo moc prima), ale není tak jednoduché, jelikož ARM má několik módu, kdy i třeba FPC podporuje jen základní a nepodporuje THUMB MODE; mně osobně to ale nevadilo, když jsem zkoušel programovat ve freepascalu pro Nintendo DS (mimochodem geniální HW na programování).
Určitě jsem na něco zapomněl, neváhejte mne doplnit x opravit v diskuzi.
Datum: 2010-08-05 22:09:00 Tagy: delphi64, kompilátor, embarcadero, FPC