Strojový kód: Porovnání verzí

Smazaný obsah Přidaný obsah
m Editace uživatele Chytrak94826 (diskuse) vráceny do předchozího stavu, jehož autorem je 193.165.212.242
m linky
Řádek 1:
'''Strojový kód''' je v [[Informatika|informatice]] posloupnost [[Strojová instrukce|strojových instrukcí]] prováděných [[procesorCentrální procesorová jednotka|procesorem]]em počítače, která je zapsána pomocí posloupnosti číselných kódů těchto strojových instrukcí. Hnutí [[GNU]] pojem strojový kód chápe [[strojový kód#Definice GNU|obecnějším způsobem]].
 
Instrukce jsou uloženy v [[operační paměť|paměti]] jako sekvence [[bit]]ů, tedy jako čísla. Nejčastěji se instrukce skládá z bitového pole určující kód instrukce a bitových polí popisující operandy. Instrukce může mít několik operandů (třeba i čtyři operandy), existují ovšem i instrukce bez operandů (nebo s operandy implicitními, tedy vždy stejnými, bez zvláštního bitového pole v kódu instrukce).
Řádek 20:
 
=== Šířka instrukčního pole ===
Počet bitů kódu instrukce, tj. základní šířka instrukčního slova je většinou násobkem osmi, takže instrukce zaujímá v paměti celý počet bytů. Výjimkou jsou např. některé řady [[mikrokontrolér]]ů [[Mikrokontrolér PIC|PIC]], které používají dvanáctibitové nebo čtrnáctibitové instrukční slovo.
 
Čím výkonnější má být určitý procesor, tím větší šířku instrukčního slova používá. Do širšího instrukčního slova je možné zakódovat více informací, takže instrukce pak mohou být výkonnější. Nevýhodou širšího instrukčního slova je nižší hustota kódu. Široké instrukční slovo sice dovoluje udělat více věcí najednou. Například [[Digitální signálový procesor|DSP]] mohou mít instrukci, která vynásobí dvě buňky z kruhových bufferů, výsledek násobení posune o daný počet bitů doprava a přičte do akumulátoru, přičemž současně posune indexy kruhových bufferů na následující prvek. V případě že potřebujeme jednoduchou akci (přičíst do registru jedničku), bude pravděpodobně kód schopný vyjádřit složité operace zbytečně dlouhý.
 
== Kompatibilita strojového kódu ==
Řádek 45:
 
== Virtuální strojový kód ==
Tvrdá vazba aplikací na konkrétní strojový kód společně s dírami v definicích standardů a s diverzitou používaných procesorů vede k velkým problémům s kompatibilitou programů. I když máme zdrojový kód napsaný například ve vyšším [[programovací jazyk|programovacím jazyce]] ([[C (programovací jazyk)|C]], [[C++]], ...), tak vzhledem k dírám v definici jazyka a k rozdílům v adresování paměti může (a často také bude) při překladu pro různé procesory a operační systémy fungovat různě. Odstraňování zjevných i skrytých chyb při přechodu do jiného operačního prostředí může být velmi náročné.
 
To nenastává u interpretovaných programovacích jazyků, nastávají však jiné problémy. Hlavním problémem je, že interpretace dlouhého a složitého kódu je časově velmi náročná a rovněž interprety mohou být komplikované (což znemožňuje jejich chod na jednoduchých zařízeních). Rovněž distribuce aplikací ve formě [[zdrojový kód|zdrojového kódu]] by byla v mnoha případech komerčně neúnosná a zabírala by mnohem více místa. Připočteme-li fakt, že aplikace mohou být znehodnocovány i samotným vývojem poměrně snadno modifikovatelného interpretovaného jazyka, je zřejmé jak snadné je s tímto přístupem skončit ve slepé uličce.
Řádek 60:
Strojový kód vzniká většinou překladem zdrojového kódu psaného ve vyšších [[programovací jazyk|programovacích jazycích]], nebo alespoň v jazyku symbolických adres ([[assembler]]), které jsou specializovanými programy ([[překladač]]i) překládány do strojového kódu příslušného procesoru. Proces překladu se tradičně dělí na několik kroků. Zdrojový kód psaný ve vyšším programovacím jazyce se překládá do assembleru (tento krok bývá volitelný, může být nutný při podezření na nesprávnou funkci překladače). Dalším krokem je překlad pomocí assembleru do relativního modulu (jeho soubor má obvykle příponu .obj). Každý relativní modul obsahuje skupinu funkcí a proměnných softwarového projektu. Spojením relativních modulů pomocí linkeru vzniká výsledný kód použitelný pro určitý operační systém, nebo jako obsah paměti, který lze nahrát do embedded systému. Aby nemusely být do každého projektu vkládány desítky či stovky modulů obsahujících běžně používané funkce, bývají jejich přeložené relativní moduly seskupeny v knihovnách (.lib). Linker při spojování projektu automaticky vytáhne z knihovny pouze ty moduly, na které se ostatní relativní moduly odkazují.
 
Překladu do strojového kódu se obecně vzato nelze vyhnout, každá aplikace nějakým způsobem musí běžet ve strojovém kódu, protože [[Centrální procesorová jednotka|procesor]] žádný jiný kód z principu své funkce nemůže přímo interpretovat. I interprety jazyků jako je [[BASIC]], různé "frameworky" nebo interprety virtuálních strojových kódů, mohou běžet jedině v nativním strojovém kódu procesoru. Některé pokročilé interprety používají techniku [[JIT]] kompilace (tj. kompilace "právě včas"), což znamená že místo přímé interpretace mohou průběžně vytvářet kousky nativního strojového kódu, který následně spouštějí, což vede k rychlejšímu chodu programu.
 
== Příklady ==