Rozdíl mezi interpretovaným a kompilovaným jazykem

... Petr Blahoš, 28. 7. 2017 Python

Zní to jako nesmyslná otázka, protože rozdílů je hodně, a dva lidé se těžko shodnou na tom, kde vůbec začít. Když jsem psal o modulech, tak jsem si uvědomil, že by bylo vhodné jeden z těch rozdílů zdůraznit.

Jména

V C nebo C++ nebo Javě definujete nějaké symboly, které se pak někde jinde v kódu používají. Např. v Javě vytvoříte třídu v .java souboru, překladač ji přeloží do .class, a ClassLoader je pak schopen ji najít a nahrát. Takže když někdo udělá import Něco, tak se zjistí, jestli už je to Něco v paměti, pokud ne, tak ji class loader nahraje, a do nějaké tabulky symbolů přidá odkaz, a třída se dá používat. Class loader nahraje kód, který připravil překladač, a který vlastně říká: Tento symbol znamená tento kód.

V C nebo C++ je to podobné. Nadefinujete funkci. Překladač ji přeloží, a vpodstatě si do tabulky zaznamená, že tento symbol znamená tento kód. Když vytvoříte dynamicky linkovanou knihovnu, tak vlastně vytvoříte nějakou strukturu, které rozumí operační systém, a která definuje nějaké symboly. Při běhu pak program říká: Operační systéme, budu používat tuto knihovnu! Operační systém knihovnu nahraje, a vytvoří tabulku funkcí, které pak může program volat.

V případě staticky linkovaných knihoven vezme linker tu knihovnu, vytáhne z ní funkce, které program volá, a vloží je do výsledného spustitelného souboru.

Ve všech případech to ale je tak, že ve svém modulu definujete nějaká jména (funkce, třídy). Překladač z nich udělá nějaký balíček (sdílenou knihovnu, archív funkcí - což je statická knihovna, soubor class s jednou třídou, případně jar z celým balíkem tříd), a Váš program může nějak tato jména používat. Důležité je uvědomit si, že modul je množina nějakých jmen, která pak můžete dál používat.

Kód

V pythonu to funguje jinak. Modul je soubor, který můžete importovat. Není to seznam nadefinovaných symbolů. Není to seznam funkcí nebo tříd. Je to kód, který se importem provede.

Takže import os nenaimportuje funkce nebo třídy z modulu os, ale provede modul os. Jako vedlejší efekt se nadefinují ty funkce nebo třídy.

Proto taky v modulech musíme psát

if "__main__" == __name__:
    do_something()

Proto může náš modul nadefinovat jiné funkce dopoledne, než odpoledne. Proto se může podívat na okolní prostředí, a podle toho se rozhodnout, co vlastně bude dělat.

(Nenechte se zmýlit. Když máte ve Vašem programu import jednoho modulu vícekrát, provede se jen jednou.)

Závěr

Rozhodně bych nerad, aby to vyznělo tak, že jedno je dobře a druhé špatně. Je to prostě jen něco, co je třeba mít na paměti.