Rozdíl mezi kompilátorem a interpretem
On 31 prosince, 2021 by adminPodle jejich definic se zdá být rozdíl mezi kompilátorem a interpretem dostatečně jasný:
- interpret je program, který přímo vykonává instrukce zapsané v programovacím jazyce
- kompilátor je program, který transformuje zdrojový kód v nízkoúrovňovém jazyce
Pokud však zapátráte hlouběji, zjistíte, že se tyto dva pojmy poněkud rozmazávají.
V podstatě by interpret mohl překládat zdrojový jazyk do mezivrstvy, aby se urychlilo jeho provádění. To se obvykle děje u jazyka, který se spoléhá na virtuální stroj. To přirozeně vede k některým otázkám:
Jsou všechny jazyky, které používají virtuální stroj, interpretované?
Jsou vlastně všechny zkompilované?“
Dalo by se říci, že obojí: jazyk je nejprve zkompilován do přechodné formy/jazyka a pak je tato přechodná věc interpretována za běhu. Což také vede k další otázce, kompilátor a interpret by neměly být považovány za jeden program, ale spíše za skupinu programů, systém. To, co vy jako uživatel považujete za kompilátor, může ve skutečnosti zahrnovat více než jeden program. Může například zahrnovat linker: program, který spojuje různé objektové soubory do jednoho souboru, aby se s ním dalo snadněji pracovat. Něco podobného by se dalo říci o interpretu.
Můžete mi říci vše o kompilátorech &interpretech?
Z jakých všech částí se skládá kompilátor nebo interpret? Přesnou a odbornou odpověď na takové otázky byste mohli hledat na akademické půdě. Nebo můžete najít diskuse k těmto otázkám na StackOverflow.
Na čem nám jako vývojářům, nebo dokonce nám jako tvůrcům jazyka opravdu záleží, je, jaké jsou rozdíly v práci s nimi. Oba mají své výhody i nevýhody a ve skutečnosti mohou mít některé jazyky jak interpret, tak kompilátor, případně více než jeden. Právě na to se podíváme.
Stále platí to hlavní: interpretr provádí kód hned, kompilátor připravuje zdrojový kód pro provedení, které přijde později. Všechny praktické rozdíly se odvíjejí od těchto rozdílných cílů.
Jak distribuovat program
Z praktického hlediska je jedním z důležitých rozdílů to, že kompilátor vytváří samostatný program, zatímco interpretovaný program ke svému spuštění vždy potřebuje interpret.
Jakmile máte zkompilovaný program, můžete jej spustit, aniž byste potřebovali instalovat cokoli dalšího. To zjednodušuje distribuci. Na druhou stranu spustitelný program pracuje na jedné konkrétní platformě: různé operační systémy a různé procesory potřebují různé zkompilované verze. Například zkompilovaný program v jazyce C++ může fungovat na počítači s procesorem x86, ale ne na počítači s čipem ARM. Nebo může fungovat na systému Linux, ale ne na systému Windows.
Pokud se chystáte program interpretovat, můžete stejnou kopii distribuovat uživatelům na různých platformách. Ti však budou potřebovat interpret, který poběží na jejich konkrétní platformě. Můžete distribuovat buď původní zdrojový kód, nebo zprostředkovanou formu. Intuitivní způsob, jak se dívat na interpret, je následující: je to jako funkce eval
v jazyce JavaScript. Funguje všude, kde funguje JavaScript, ale ke svému běhu potřebuje interpret jazyka JavaScript pro danou platformu.
Podpora různých platforem
Jedná se o technický rozdíl, který vede k důležitým reálným důsledkům: s interpretovaným programovacím jazykem je snazší vytvářet programy pro různé platformy.
To proto, že z velké části vytváříte pouze program pro platformu interpretu. Do správné podoby pro skutečnou platformu (např. Windows/Linux a x86/ARM) jej přeloží samotný interpret. Samozřejmě stále existují určité rozdíly v jednotlivých platformách, kterých si musíte být vědomi. Běžným příkladem je znak oddělovače adresářů.
Při kompilaci programu se naopak musíte sami postarat o všechny drobné rozdíly mezi jednotlivými platformami. Částečně se tak děje proto, že kompilované jazyky bývají jazyky nízké úrovně (například C++), takže vám dávají menší přístup k systému, a tím i větší zodpovědnost. Dalším důvodem je však to, že všechny knihovny, které používáte, musí samy podporovat různé platformy. Pokud tedy nepodporují Windows, nemůžete podporovat Windows.
Rychlost má více tváří
V případě rychlosti se opět setkáváme s určitým paradoxem: kompilátor je rychlejší i pomalejší než interpret. Mnoho lidí ví, že zkompilovaný program je mnohem rychlejší než interpretovaný, ale to není celý obrázek. Zkompilovaný program se spouští rychleji než interpretovaný, ale kompilace a spuštění programu zabere více času než jeho pouhá interpretace.
Kompilátor skutečně vytváří rychlejší programy. Děje se tak zásadně proto, že musí každý příkaz analyzovat jen jednou, zatímco interpret jej musí analyzovat pokaždé. Kromě toho může překladač optimalizovat spustitelný kód, který vytváří. Je to jednak proto, že přesně ví, kde se spustí, a také proto, že optimalizace kódu zabere nějaký čas. Čas, který by interpretaci příliš zpomalil.
Rychlost běhu versus rychlost vývoje
Mohlo by se zdát, že jde o hnidopišství: pokud program zkompilujete, poběží rychleji, na čase, který zabere kompilace, nezáleží. To je obvykle názor staré školy. A bezpochyby je výsledný program spuštěn vícekrát, než je zkompilován. Takže koho zajímá, že vývoj trvá déle? No, určitě to vyžaduje přístup k vývoji ve stylu „bring the pain“, který je do jisté míry obdivuhodný. Ale co když zisk z doby běhu není relevantní, zatímco ztráty v produktivitě vývoje jsou značné?“
Jedna věc je, když vytváříte operační systém, a druhá, když děláte aplikaci pro selfie. Dokonce i vaši uživatelé mohou dát přednost ani ne-pozorovatelné ztrátě rychlosti běhu výměnou za rychlejší získání funkcí. Neexistuje univerzální odpověď: v některých kontextech záleží na produktivitě více než na rychlosti, v jiných je tomu naopak.
Záhady ladění
Existuje ještě jeden konkrétní aspekt, který je nakonec nejistější, než by se zdálo: ladění. Na papíře je ladění jednodušší při použití interpretu než při použití kompilátoru. To je pravda z několika důvodů:
- u interpretu existuje jedna verze spustitelného souboru; nepotřebujete verzi pro ladění pro vývoj a verzi pro vydání pro koncového uživatele
- při použití interpretu je méně chyb specifických pro danou platformu
- protože interpret transformuje kód za běhu, informace ze zdrojového kódu jsou stále k dispozici
- protože interpret provádí jeden příkaz za druhým, je snazší najít chybu
Rozdíl, který dělají vývojové nástroje
Ačkoli je to všechno v praxi pravda, může to být méně důležité, než se zdá. Pokud se totiž zamyslíte nad svými zkušenostmi, pravděpodobně zjistíte, že ladění JavaScriptu je těžší než ladění C++. Proč tomu tak je? Částečně je to návrhem samotných jazyků. JavaScript používá dynamické typování, zatímco C++ používá statické typování. To druhé usnadňuje včasné zachycení chyb. Nakonec však záleží na vývojových nástrojích. Ruční kompilace jazyka C++ je obtížná, proto většina lidí používá k vývoji v tomto jazyce IDE. Na druhou stranu pro vývoj v JavaScriptu můžete snadno použít textový editor a nástroje příkazového řádku.
To v praxi znamená, že pokud vyvíjíte v C++, můžete také ladit C++. Naopak můžete vyvíjet v JavaScriptu, aniž byste věděli, jak správně ladit v JavaScriptu.
Pokud si je dáme do stejného kontextu, přičemž každý z nich má skvělé IDE a podpůrné nástroje, situace se vrátí do normálu. Mnoho interpretovaných prostředí skutečně používají lidé, kteří se chtějí naučit používat nový jazyk. Je snazší testovat a zjistit, co je správně a co ne, když se podíváme, co se děje řádek po řádku a v reálném čase.
Shrnutí
Viděli jsme hlavní rozdíly, na kterých záleží mezi překladačem a interpretem. A co je důležitější, viděli jsme, že důsledky různých filozofií jsou důležitější než ty technické. Stručně řečeno, existují kultury, které přicházejí s určitými technickými volbami, které jsou nakonec relevantní samy o sobě. Pokud chcete rychlost a snadnost vývoje, budete vybírat všechny technologie pro rychlost, a ne jen jednu. A uživatelé vás budou následovat.
To je zásadní aspekt, který je třeba promyslet, zejména pokud chcete vytvořit vlastní programovací jazyk. Rasmus Lerdorf vytvořil jazyk PHP tak, aby se snadno používal. A skutečně byl ve srovnání s alternativami neuvěřitelně snadný na používání, alespoň v době svého vzniku. Začínal však spíše jako knihovna než jako jazyk. A i když se hodně zlepšil, stále trpí svými začátky. Stále můžete vytvářet dobrý kód v PHP, ale dělá to méně jeho uživatelů, než je obvyklé. Protože pokud potřebujete jen něco, co funguje, bezpečnost, údržbu atd. vše ostatní přijde později.
Pokud chcete vědět, jak můžete prakticky vytvořit interpret nebo kompilátor pro svůj jazyk, můžete se podívat na zdroje pro tvorbu programovacího jazyka. Pokud se to chcete naučit a vše, co potřebujete k vytvoření vlastního jazyka, stačí si vybrat skvělou knihu, kterou milují děti i dospělí, o tom, jak vytvářet pragmatické a lehké jazyky.
5 věcí, které je třeba při tvorbě jazyka udělat správně
Získejte kontrolní seznam e-mailem a další tipy k tvorbě jazyků
.
Napsat komentář