V sobotu 2. listopadu proběhla mohutná oslava naší plnoletosti !!
Multimediaexpo.cz je již 18 let na českém internetu !!

Křížový překladač

Z Multimediaexpo.cz

Verze z 12. 2. 2015, 14:30; Sysop (diskuse | příspěvky)
(rozdíl) ← Starší verze | zobrazit aktuální verzi (rozdíl) | Novější verze → (rozdíl)

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á 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).

Obsah

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.

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.

Reference

  1. 1,0 1,1 http://fedoraproject.org/wiki/MinGW

Související články