Křížový překladač
Křížový překladač je v informatice upravený kompilátor, který generuje kód spustitelný na jiné platformě, než na které je samotný překlad zdrojových kódů spuštěn. Používá se v případech, kdy jsou zdrojové kódy společné pro více cílových platforem, na kterých může být program provozován (Linux a Microsoft Windows)[1] nebo různé varianty téhož systému (16bitový, 32bitový a 64bitový). Často je též využívána pro generování spustitelných souborů pro vestavěné systémy a při překladu pro platformy, které nejsou samy schopny kompilace (např. jednočipové počítače bez operačního systému nebo mobilní telefony). Zvláštním případem jsou překladače, které generují místo spustitelného cílového kódu mezikód (viz mezijazyk), jako například programovací jazyk Java (tzv. java bytecode).
Nesprávně je pojmem křížová kompilace někdy označován překlad z jednoho programovacího jazyka do druhého (anglicky source-to-source compiler).
Použití křížové kompilace
Hlavním důvodem použití křížové kompilace je oddělení návrhu programu od cílové platformy, což je užitečné z různých důvodů:
- Embedded systémy (počítače), u kterých mají zařízení velmi omezené funkce a prostředky. Takový počítač není dostatečně výkonný, nemá operační systém a nemůže na něm běžet kompilátor ani vývojové prostředí. Křížová kompilace tak přináší mimo jiné i možnost jednodušší tvorby programu, jeho testování a ladění. Lze také snadněji odhalit a odstranit případné chyby programu.
- Kompilace pro různé operační systémy a počítače. Křížovou kompilaci lze spustit na jediném počítači a vytvořit spustitelné soubory pro různé verze operačních systémů a počítačů pouze změnou nastavení parametrů překladu. Výstupem pak jsou soubory spustitelné na požadovaných počítačích bez nutnosti na každém z nich provozovat kompilátor a spouštět překlad.
- Bootstrapping (self-hosting) pro novou platformu. Při vývoji software pro budoucí platformu (například mobilní telefon) je napsán jednoduchý kompilátor pro danou platformu, který pak zkompiluje finální kompilátor, ve kterém je možno přeložit ostatní části zdrojových kódů (křížová kompilace pak probíhá přímo na novém zařízení bez nutnosti kompilovat program na jiném počítači).
- Kompilace zdrojových kódů pro emulátory dnes již nepoužívaných platforem (například Commodore 64). Pomocí křížové kompilace je zajištěna možnost provozování starších programů na dnešních platformách (s operačními systémy Windows, Linux, atd.).
Jedním z důvodů pro vznik a vývoj křížové kompilace je použití virtuálních strojů jako například Java Virtual Machine. Virtuální stroj je schopen na různých platformách spouštět zkompilovaný program od jednoho překladače. Poskytuje tak podobný výsledek jako při použití křížové kompilace, avšak výstupem křížové kompilace je spustitelný soubor pouze pro cílovou platformu.
Křížovou kompilaci lze využít nejen v případech, kdy se liší hardwarová architektura počítače, ale také pokud se liší pouze operační systém (například lze zkompilovat program pro operační systém FreeBSD pod Linuxem).
Canadian Cross
Canadian Cross je technika vytvoření křížového kompilátoru pro jiné počítače. Na prvním počítači (A) je vytvořen kompilátor, který běží na druhém počítači (B). Na počítači (B) je potom finálně zkompilován program pro třetí počítač (C).
Pokud použijeme techniku Canadian Cross s GCC, mohou být zapojeny čtyři kompilátory:
- Vlastní nativní kompilátor pro počítač A(1) je použit pro vytvoření GCC nativního kompilátoru pro počítač A (2).
- GCC nativní kompilátor pro počítač A (2) je použit pro vytvoření GCC křížového kompilátoru z počítače A na počítač B (3).
- GCC křížový kompilátor z počítače A na počítač B (3) je použit k vytvoření GCC křížového kompilátoru z počítače B na počítač C (4).
Výsledný GCC křížový kompilátor (4) není možné spustit na počítači A, kde byl vytvořen. Místo toho bude použit na počítači B pro kompilování aplikace do spustitelného souboru. Výsledný spustitelný soubor se zkopíruje na počítač C, kde je možné jen spustit.
Například NetBSD poskytuje POSIX Unix shell skript s názvem build.sh
, se kterým je za pomoci kompilátoru hostitele nejprve vytvořen vlastní toolchain. Pomocí takto získaného toolchain lze vytvořit křížový kompilátor, který bude dále použit na vytvoření celého systému.
GCC a křížová kompilace
GCC je sada volně dostupných kompilátorů, které obsahují i podporu křížové kompilace. GCC podporuje mnoho platforem a programovacích jazyků, ale protože je zprovoznění křížové kompilace většinou náročné na správné nastavení kompilátoru, existují snahy vše maximálně zjednodušit.[1]
GCC vyžaduje, aby zkompilovaná kopie binutils byla k dispozici pro každou cílovou platformu. Zvláště důležitý je GNU Assembler. Z tohoto důvodu musí být jako první zkompilován binutils správně s nastavením přepínače --target=some-target
(parametry přepínače jsou odesílané pomocí konfiguračního skriptu). Vlastní GCC musí být také nakonfigurováno se stejnou hodnotou --target
cílové platformy. GCC je pak možné spustit normálním způsobem za předpokladu, že nástroje, které binutils vytváří, jsou k dispozici v zadané cestě. V operačních systémech založených na UNIXU to lze pomocí bash provést následujícím příkazem:
PATH=/path/to/binutils/bin:${PATH} make
Při křížové kompilaci s GCC je požadováno, aby na hostitelské platformě byly k dispozici části cílové platformy se standardní knihovnou jazyka C. Minimálně komponenta standardní knihovny jazyka C s názvem crt0 musí být k dispozici. Komponenta crt0 po svém zkompilování do programu zajišťuje veškeré potřebné inicializace před voláním hlavní funkce programu. Další možností je do cílového programu zkompilovat celou standardní knihovnu jazyka C. Výsledný spustitelný soubor ale může být pro mnoho platforem příliš velký.
Vhodnou alternativou se nabízí použití newlib, což je malá standardní knihovna jazyka C, která obsahuje jen ty nejzákladnější součásti potřebné pro kompilaci zdrojových kódů napsaných v jazyce C. Chcete-li nakonfigurovat GCC takovým způsobem, aby při kompilaci zdrojového kódu používal knihovnu newlib, použijte přepínač --with-newlib
.
GNU build systém, také známý jako GNU autotools, je sada programovacích nástrojů (např. autoconf, automake a libtool), které mají pomoci k vytváření balíčků zdrojového kódu přenositelných mezi operačními systémy založenými na Unixu. V GNU build systému jsou běžně používány pojmy jako vytvářející platforma (build platform), hostitelská platforma (host platform) a cílová platforma (target platform). Vytvářející platforma (build platform) je platforma, kde je zdrojový kód aktuálně kompilován. Hostitelskou platformou nazýváme platformu, na které bude zkompilovaný kód spouštěn. Cílová platforma se obvykle vztahuje pouze na kompilátory, kde reprezentuje, jaký typ strojového kódu bude samotný balíček GNU autotools produkovat.
Další metodou, která je populární zejména mezi vývojáři vestavěného Linuxu, je použití nástrojů gcc, g++, gjc, atd., s technologií scratchbox nebo novější scratchbox2. Tyto nástroje vytvoří chroot, kde je možné umístit standardní knihovny jazyka C a další knihovny nutné ke kompilaci zdrojového kódu, aniž by bylo třeba zvlášť nastavovat cesty k těmto knihovnám. Nevýhodou použití scratchboxu je mírná ztráta rychlosti při kompilaci a ztrátě přístupu k mnoha nástrojům umístěným mimo scratchbox. Tyto nástroje je však možné do scratchboxu dodatečně přesunout a tím problém vyřešit.
Manx Aztec C křížové kompilátory
Ve firmě Manx Software Systems byly kompilátory pro jazyk C vyvíjeny již od roku 1980 pro různé platformy (například IBM PC kompatibilní a Macintosh). Již v té době firma nabízela křížové kompilátory pro tyto platformy i pro počítače Commodore 64 a Apple II.
Manx Aztec C programovací jazyk byl dostupný pro různé platformy zahrnující, MS DOS, Apple II, DOS 3.3 a ProDOS, Commodore 64, Macintosh 68XXX a Amiga.
Od 80. let pokračuje dále po celou dobu 90. let dokud Manx Software Systems nezaniklo, MS-DOS verze Aztec C byla nabídnuta jako nativní kompilátor a také jako křížový kompilátor pro ostatní platformy s různými procesory zahrnující Comodore 64 a Apple II. Internetové distribuce stále pro Aztec C existují a zahrnují na MS-DOS založený křížový kompilátor. Používají se ještě dnes.
Manx Aztec C86, jeho nativní 8086 MS-DOS kompilátor, byl také křížový kompilátor. Ačkoliv to nekompilovalo kód pro jiný procesor, jako jsou Aztec C65 6502 křížové kompilátory pro Commodore 64 a Apple II, vytvořili binární spustitelné soubory pro tehdejší operační systémy pro 16bitovou 8086 rodinu procesorů.
Když byl poprvé představen IBM PC byl dostupný s možností výběru operačního systému CP/M-86 nebo PC DOS. Aztec C86 byl poskytován s knihovnami pro generování kódu pro oba operační systémy IBM PCjr. Dále v 80. letech verze Aztec C86 (3.xx, 4.xx a 5.xx) přidávala podporu pro MS-DOS verze 1 a verze 2, které byly méně robustní než MS-DOS verze 3 a novější na které se Aztec C86 zaměřil až po jejich ústupu.
Nakonec Aztec C86 poskytnul vývojáře jazyka C se schopností produkovat ROM-able "HEX" kód mohl být dále přenesen pomocí ROM vypalovače přímo na 8086 procesory. Paravirtualizace mohou být častější, ale v praxi vytváření low-level ROM kódu je mnohem běžnější že jí vytváří jeden člověk během těch let kdy je ovladač zařízení vyvíjen často aplikačními programátory pro jednotlivé aplikace. Pro aplikační programátory je méně časté přijít do styku přímo s hardwarem bez podpory od výrobce. Tato praxe je podobná dnešním vestavěným systémům.
Thomas Fenwick a James Goodnow II byly dva hlavní vývojáři Aztec-C. Fenwick se později stal podivuhodně autorem Microsoft Windows CE jádra nebo také nazvaného NK ("New Kernel").
Křížová kompilace u firmy Microsoft
Historie křížové kompilace u firmy Microsoft sahá do počátku 80. let 20. století. Křížová kompilace byla využívána při přechodu z Lattice C na Microsoft C. Koncem 80. let 20. století začalo mnoho vývojářů přecházet k používání programovacího jazyka Microsoft C a ještě více následovalo během vývoje Microsoft Windows až do současného stavu. Objevily se produkty jako Clipper a později Clarion, které umožňovaly jednoduchý vývoj databázových aplikací za použití techniky křížení jazyků tím, že dovolovaly, aby část jejich programů byla kompilovatelná v jazyce C.
V roce 1987 byla vydána verze jazyku Microsoft C 5.1, která nabízela „cross-language“ vývojové prostředí (křížení jazyků) v MS DOSu. 16bitový objektový kód psaný v Jazyce symbolických adres a také v jiných jazycích Microsoftu, jako Fortran, QuickBASIC a Pascal, mohl být poté spojen do jednoho programu v procesu zvaném „Mixed Language Programming“ – programování za použití více různých jazyků a nyní také „InterLanguage Calling“ – mezijazykové volání. Kód v jazyce C musel být napsán tak, aby při překladu procházel své proměnné v obráceném pořadí, než jak byly uloženy na zásobníku a aby vracel jejich hodnoty zpět na zásobník, nikoli do procesorového registru. Byla zde i jiná pravidla programování, aby bylo možné primět různé programovací jazyky spolupracovat, nicméně toto konkrétní pravidlo přetrvalo celým vývojem křížení jazyků, který pokračoval skrze 16bitové a 32bitové verze Windows až dodnes. Je známé jako „volací konvence Pascalu“ (Pascal Calling Convention), ale je tak běžně používané, že je bráno jako samozřejmé a jeho přesný název je užíván zřídka.
Během 90. let se Microsoft s začínající verzí MSC 6 zaměřil na Windows, ale také OS/2 a vývoj GUI programů. Například API pro Windows 3.x bylo napsáno pomocí MSC 6. Tato verze byla také rozšířena o lepší podporu 32bitových záležitostí. Pro křížení programů s 16bitovými a 32bitovými instrukcemi byla představena technika zvaná Thunk. Podpora MS DOSu a programování 16bitového kódu pokračovala až do verze MSC 8.00c, která byla svázána s Microsoft C++ a Microsoft Application Studio 1.5, předchůdcem Microsoft Visual Studia.
V roce 2001 vyvinul Microsoft Common Language Runtime (CLR), což vytvořilo jádro pro jejich .NET překladač ve Visual Studiu IDE. Tato vrstva (CLR), která je v API operačního systému, umožňuje míchání různých programovacích jazyků přes různé platformy, na kterých ovšem běží Windows. Ve vývojovém nástroji Microsoft Visual Studio je také možno vytvářet a kompilovat programy i pro mobilní platformu Windows Mobile na procesorech ARM. Runtime non-Windows operačních systémů (včetně Linuxu), jako například Mono, samozřejmě poskytují kompatibilitu pro křížově překládané .NET programy.