Archiv rubriky: Jak se stát ajťákem

Virtuální paměť

Kernel space a User space

Procesor s RAM* pamětí interaguje velice rychle a stahuje z ní instrukce, které má rozeběhnout: toto jsou instrukce jak OS tak i softwaru, který pod OS běží.

Proto OS dělí paměť na dvě části:

  • Kernel space: toto je prostor OS a nikoho jiného
  • User space: zde je veškerý ostatní software
    • Každá aplikace zároveň vidí pouze svoji vlastní paměť a zpravidla nemůže zapisovat do paměti jiných aplikací.

Do kernel space má přístup jen operační systém, žádný jiný software se do tohoto prostoru paměti nedostane.

Co je RAM? Anglicky „Random Access Memory“ neboli „Paměť náhodného přístupu“. To znamená, že každý bit nebo bajt má svoji vlastní adresu a pomocí této adresy přečtete obsah na dané adrese ihned.

Existují i jiné typy pamětí, například „SAM“ (kde „S“ znamená Sekvenční) což je třeba stará filmová páska. Pokud chcete v nějakém přehrávači na filmovou pásku vidět konkrétní část filmu, musíte celý film „přetočit“ na dané místo.

Virtuální paměť

Aplikace a software běžící v OS vůbec na prostor v RAM paměti nevidí. OS zprostředkovává každé aplikaci virtuální paměť což je z pohledu aplikace „neomezený“ prostor který tady někde plave ve vzduchu a software má naprostou svobodu v množství paměti, kterou spotřebuje.

Aby se aplikace vůbec k paměti dostaly tak OS nabízí tyto dvě základní funkce:

  • dej mi bajty z virtuální paměti
  • vem si bajty zpátky
Jak software interaguje s pamětí

Paging / swapping

Software má naprosto svobodu v tom, kolik paměti využije. Operační systém nemá vůbec žádný názor na to, kolik paměti jaká aplikace potřebuje, OS je jenom zprostředkovatel. Některé aplikace potřebují víc paměti, některé méně, některé aplikace potřebují někdy více, někdy méně. Záleží, na co počítač používáš.

RAM paměť však není omezená. Když programátor tvoří software, musí si dát pozor, aby jeho software nevyužíval více paměti, než kolik doopravdy potřebuje.

Co se stane, když RAM paměť dojde? OS provádí tzv. paging což znamená, že OS začne přehazovat malé bloky dat mezi RAM pamětí a nějakým jiným avšak většinou podstatně pomalejším úložištěm než je RAM paměť jako je HDD/SSD.

Jakmile začne docházet k pagingu, uživatel to citelně pozná – počítač se začne „kousat“ a práce s ním začne být nesnesitelná. Zahlcení RAM paměti má samozřejmě vliv i na ostatní procesy.

Swapping je pojmenování pro starší, již nepoužívaný způsob přehazování celých procesů (ne jen jejich dílčích bloků) mezi RAM a jiným uložištěm, zmiňuji se o tom, že se tento pojem používá dodnes i když moderní PC už swapping nedělají.

Shrnutí

  • OS dělí RAM paměť na dvě části: kernel space a user space
  • Kernel space je prostor paměti, ve které se nachází operační systém
  • User space je prostor paměti, ve které se nachází běžící aplikace.
  • Aplikace běžící v OS vidí pouze svoji vlastní paměť a do kernel space nebo do user space jiných aplikací nevidí
  • Virtuální paměť je způsob, jakým OS zprostředkovává paměť jednotlivým aplikacím.
  • Aplikace mají možnost rezervovat si pro sebe bajty z paměti a nebo tyto bajty vrátit
  • Aplikace jsou zodpovědné za množství paměti, se kterým pracují
  • Paging je způsob, jakým se OS vypořádává s nedostatkem RAM paměti přehazováním datových bloků mezi RAM a jiným úložištěm jako HDD/SSD

Interakce software s OS

Aby software běžící v OS mohl nějakým způsobem interagovat se zařízením – například interagovat s pamětí, s disky, reagovat na stisk klávesnice, musí využít funkce nebo události OS.

Tyto funkce a události souhrně nazývám „nízko-úrovňové“ protože při běžném programování jsou OS funkce ta nejnižší dostupná úroveň. Každý operační systém je však nazývá jinak.

  • Ve Windows je jeden kompaktní balík funkcí kterému se říká Win32 API.
  • V Linuxu to není jeden kompaktní balík ale hromada funkcí různě rozházených v Linuxové dokumentaci, souhrnně se těmto funkcím říká syscalls (System call). To ještě zesložiťuje fakt, že neexistuje jeden Linux ale spousta různých Linuxů.
Vztah mezi OS a uživatelskými aplikacemi

Nízko-úrovňové události jsou operačním systémem zpracovaná přerušení procesoru. Software v OS má možnost se na tyto události „navěsit“ a díky tomu zprostředkovaně reagovat na události jako je například pohyb myši nebo stisk klávesnice.

Prostředí OS z pohledu software

OS před softwarem schovává konkrétní složitosti daného zařízení a místo toho vytváří úplně nové koncepty. Podívejte se na tabulku níže. V této kapitole jsem pojmenoval nízko-úrovňové funkce a události OS, v následujících kapitolách vysvětlím další pojmy.

ZařízeníCo vidí osco vidí software běžící v os
Fyzická RAM paměťFyzická RAM paměť
Kernel space
User space
Virtuální paměť
HDD/SSD diskyHDD/SSD disky
NTFS, FAT32, ext3, ext4…
Souborový systém
USB zařízeníUSB zařízení
Ovladače
Nízko-úrovňové
funkce a události OS
Fyzická jádra procesoruFyzická jádra procesoru
Scheduler
Procesy
Vlákna
Context switch
Procesy a vlákna
Co vidí OS a co vidí software

Shrnutí

  • Software interaguje s počítačem skrz nízkoúrovňové funkce OS
  • Počítač interaguje se software skrz nízkoúrovňové události OS. Toto jsou jen delegovaná přerušení procesoru.

Hypervisor

Moderní procesory mají ještě virtualizační režim. Tento režim je nad privilegovaným režimem. To znamená, že operační systém nemá přístup k instrukcím ve virtualizačním režimu.

Režimy procesoru seřazené podle možných instrukcí, které mohou v procesoru spouštět

Aplikacím, které běží ve virtualizačním režimu se říká hypervisory a to jsou aplikace, které jsou schopné vytvářet a spouštět virtuální zařízení na jednom fyzickém zařízení. To znamená, že na jednom fyzickém zařízení může být provozováno několik virtuálních počítačů, každý se svým vlastním OS.

Shrnutí

  • Hypervisor je program, který umožňuje instalovat virtuální zařízení na fyzické zařízení. Hypervisor běží ve virtualizačním režimu procesoru, ke kterému operační systém ve virtuálním zařízení nemá přístup.

Interakce OS s procesorem

V nějaké kapitole o procesorech jsem se zmiňoval, že moderní procesory jsou stavěné pro software. Většina procesorů počítá s tím, že na nich poběží operační systém.

Toto bych rád rozvinul trochu víc do detailu protože si myslím, že je důležité pochopit, jak operační systém s procesorem interaguje a co to znamená pro člověka, který s operačním systémem pracuje.

Co všechno může procesor dělat

Už byste z předchozích kapitol měli vědět, že procesor je hlava a srdce celého počítače které komunikuje s ostatními komponentami.

Procesor a komponenty

Co to znamená?

To znamená, že procesor obsahuje instrukce, které na signální úrovni interagují se všemi těmi zařízeními okolo sebe.

To je první důvod, proč je těžké napsat vlastní operační systém. OS obstarává instrukce v procesoru, které interagují s ostatními zařízeními a před obyčejným uživatelem schovává obrovskou složitost a komplexitu těchto interakcí. Různá zařízení mají celou řadu různých „protokolů“ a „kódů“ se kterými komunikují a operační systém na to musí být připravený, jinak se procesor se zařízeními okolo sebe nedorozumí.

Kromě toho, při špatném nebo zlomyslném použití těchto instrukcí je možné počítač nebo jeho komponenty fyzicky zničit!

Režim procesoru

Instrukce procesoru jsou proto rozdělené na dvě kategorie:

  • privilegovaný režim = ty instrukce, ke kterým má přístup jen operační systém. Jedná se hlavně o instrukce, které nějakým způsobem řídí interakce s ostatním hardwarem v počítači.
  • uživatelský režim = všechny ostatní instrukce

Při startu počítače si operační systém v procesoru nastaví sám pro sebe privilegovaný režim. Jakýkoliv software, který běží v rámci operačního systému k těmto instrukcím nemá vůbec žádný přístup nebo pouze zprostředkovaně přes operační systém.

Znázornit by se do dalo takto:

Privilegovaný a uživatelský režim

Co z toho plyne?

Pokud chce aplikace pracovat nějakým způsobem s různými zařízeními, musí to udělat prostřednictvím operačního systému.

Pokud tedy například programátor chce uložit něco do RAM paměti, detekovat stisk klávesy na klávesnici a podobně, musí si tyto interakce vykomunikovat s operačním systémem.

Programátory s orientací na software přímý přístup do konkrétního zařízení zpravidla ani nezajímá.

Ovladač (driver)

Operační systém nemůže znát všechny typy zařízení, které na světě existují a nemůže být zodpovědný za všechny interakce v privilegovaném režimu. Proto mají operační systémy zabudovaný koncept ovladačů nebo driverů, které mají možnost přistupovat k privilegovaným instrukcím procesoru.

Proto je nutné si dávat hodně bacha na to, jaké ovladače si na počítač instalujete a operační systém se vás většinou jasně zeptá, jestli si jste fakt jisti, že chcete nějaký ovladač instalovat protože, teroeticky, jakýkoliv ovladač může váš počítač zničit. Prakticky toto není pro většinu uživatelů problém, OS v dnešní době vědí, jak komunikovat i s těmi nejběžnějšími komponentami.

Taky je to tím, že zníčit počítač tímto způsobem vyžaduje obrovské znalosti, které baseballová pálka nevyžaduje.

Shrnutí

  • Instrukce procesoru lze napsat tak, že dojde k fyzickému poškození komponent v počítači
  • Z toho důvodu se instrukce dělí na několik režimů: privilegovaný a uživatelský režim
  • Operační systém má přístup k privilegovanému režimu. Aplikace pouze k uživatelskému režimu.
  • Pokud chce aplikace provést nějakou operaci v nějaké komponentě počítače, musí to udělat skrz funkce operačního systému.
  • Ovladač je software, který umožňuje správnou interakci procesoru s nějakým zařízením, se kterým OS neumí jinak komunikovat

OS jako program v nekonečné smyčce

Vzpomeňte si, jak funguje procesor. Toto zařízení neumí „nic nedělat“ a neustále přijímá příkazy.

První operační systémy byly velmi jednoduché programy:

Chování jednoduchých operačních systému

Všimněte si, že tato jednoduchá aplikace je v nekonečné smyčce. Pokud by operační systém skončil, procesor by přestával dostávat instrukce a v důsledku toho by se celý počítač vypnul, nebo se restartoval.*

Moderní OS, přestože jsou řádově komplexnější a složitější, také běží v nekonečné smyčce, v případě Linuxu to jsou minimálně 2 vlákna v nekonečných smyčkách:

  • Uživatelské vlákno, které čeká na vstupy od uživatele
  • „Čekací vlákno“ (v Linuxu pojmenované jako „idle loop“) které předává procesoru instrukci pro „nic nedělání“ v případě, že procesor nemá dost věcí na práci. (a v případě, že procesor instrukci pro „nic nedělání“ podporuje. Pokud ne, Linuxy předají procesoru nesmyslné ale neškodné instrukce.)

*V dnešní době by se počítač nevypnul ani automaticky nerestartoval. Počítače v dnešní době mají v sobě UEFI nebo minimálně BIOS, což jsou vlastně velmi omezené OS pro základní správu zařízení integrované přímo v čipech na základních deskách počítačů.

Shrnutí

  • Operační systémy jsou programy, které běží v nekonečné smyčce, ve které čekají na uživatelský vstup.

Operační systém

Teď už toho víte o počítačích docela dost. Jak počítače pracují s bity a bajty, jak pracují s čísly, zápornými i desetinnými a jak reprezentují znaky.

Z prvních kapitol už máte zároveň nějakou představu o tom, jakou roli v počítači hraje procesor a ostatní komponenty.

Bare-metal programming

Pokud počítač nemá operační systém tak je to jen kus železa. Procesor čeká na instrukce a pokud žádné instrukce nenajde tak pošle celou vaši rodinu do koncentráku.

Ale víte co, ty instrukce mu můžete dodat napřímo. V historii operační systémy neexistovaly a software se psal tak, že zařízení spustilo program, který jste mu zadali. Jakmile program skončil, počítač se musel ručně vypnout, restartovat (třeba s jiným programem nebo jinými vstupy) nebo se vypnul sám.

Takto můžete programovat počítače i dnes. Říká se tomu bare-metal programming v překladu doslova „programování nad holým železem“.

K tomu se pojí i pojem embedded programming které znamená „programování nad vestavěnými zařízeními“ což se vztahuje na různé drobné počítače vestavěné do nějakého zařízení s konkrétním účelem, například bankomaty.

Existují taková mrňavá zařízení jako například raspberri pi nebo Arduino. Toto jsou prostě jenom miniaturní počítače s ARM procesory. Existuje celá komunita ajťáků, kteří se tomu věnují a pokud se vám líbí myšlenka přímého programování nad zařízením tak nejdřív dočtěte tento návod a pak se zkuste podívat na návod jak napsat operační systém pro raspberry pi.

Mé vlastní raspberri pi s přídavným displejem.

Varování: bare-metal programming nad běžným stolním PC je sebevražda. Současné operační systémy existují už desítky let, pracovalo na nich za tu dobu tisíce lidí a umí pojmout obrovskou hromadu hardwarových složitostí, které čas od času nějaký nadšenec do technologií chce všechny naprogramovat za víkend. Byli jste varováni.

Hotový operační systém

Já jsem líný ajťák. Používám odjakživa Windows jak k osobním tak pracovním věcem. Moje práce zahrnuje manipulaci i s nějakým Linuxem. Na telefonu mám Android, což je ve skutečnosti Linux.

Na macOS jsem v životě sáhnul jen párkrát ale nikdy mě Apple produkty nezajímaly a nikdy jsem žádný Apple nevlastnil.

Většina dobře placeného ajťačení, kterému se ajťáci věnují, je na úrovni existujícího operačního systému. Bare-metal programming a psaní operačních systémů se věnují jenom nadšenci, lidé co to mají jako koníček nebo studenti co se chtějí něco naučit….a nebo lidé, kteří reálně pracují na operačních systémech jako Windows nebo Linux, které všichni používáme.

Proto v tomto návodu cokoliv, o čem budu dále mluvit, je ve vrstvě operačního systému. A k tomu je důležité operačním systémům porozumět.

Vrstva operačního systému

Shrnutí

  • Bare-metal programming je praxe psaní softwaru přímo pro fyzické zařízení.
  • Zkusit si napsat vlastní OS pro raspberri pi může být zábava hraničící s patologickým masochismem.
  • Psát vlastní OS pro klasické stolní počítače je zaručeně už jen patologický masochismus bez zábavy.
  • Většina ajťačení o kterém budu v tomto manuálu mluvit probíhá na existujícím hotovém operačním systému jako Windows, Linux nebo macOS.

Znakové sady

Z předchozích dílů byste už měli vědět, jak počítače pracují s čísly, negativními čísly ale i desetinnými čísly.

Pamatujete si, jak jsem mluvil na začátku o morseovce? Morseovka je kód, kde kombinací signálů předáváte jednotlivá písmena. Podobný „kód“ je dohodnutý i v počítačích, protože obyčejní lidé nechtějí pracovat s bity, obyčejní lidé chtějí pracovat s normálními čísly (v desítkové číselné soustavě) ale i s abecedou.

Potřebujeme přidat novou vrstvu, kterou bych nazval „bitová interpretace“. Je to prostě pohled na bity způsobem, kterému lidé nejvíc rozumí. Desítkovou číselnou soustavu všichni chápeme a pro komunikaci chceme psát písmena, slova, věty.

Přidaná vrstva bitové interpretace

V počítačích můžete říct, že nějaká kombinace bitů reprezentuje konkrétní písmeno. Znaková sada je „kód“ který přiřazuje ke konkrétní bitové hodnotě konkrétní znak.

ASCII

Nejznámější a nejstarší znaková sada se jmenuje ASCII. Je důležité ji znát. Běžný počítačový uživatel na ní nejspíš nenarazí ale rodící se ajťák dřív nebo později ano.

A i kdyby ne, stejně je důležité ji znát, protože všechny důležité znakové sady vychází právě z ASCII.

Tato znaková sada se zapisuje na 8 bitů. (Historicky to bylo 7 bitů jako základ pro angličtinu a 8 bitů pro rozšířené znaky jakéhokoliv jiného jazyka, tato vlastnost se ale už nikde nepoužívá).

ASCII tabulka

Velké „A“ je číslo 65 což je v bitech 1000001, malé „a“ je 97 a podobně.

ASCII je velmi stará znaková sada (1963). Spoustu těch znaků v rozsahu 0-31 původně reprezentovala různé divné stavy, táhla, spínače, tlačítka, světýlka a pípátka které tehdejší počítače měly.

Dnes už mají počítače hlavně USB klávesnici a myš. Klávesnice předává informace úplně jiným kódem (USB HID, strana 53) který se znakovými sadami nijak nesouvisí. Operační systém se stará o to, aby přeložil signál z klávesnice do aktivní znakové sady.

Unicode

Jak počítače začalo používat mnohem víc lidí všude po světě, začaly vznikat další jazykové sady pro mnoho různých jazyků. Samotné ASCII neumí české znaky jako „ř“ nebo „ň“, pouze anglickou abecedu.

Kdysi byl ve znakových sadách bordel. Pro různé jazyky vznikaly různé znakové sady. Toto období naštěstí skončilo protože všichni začali používat Unicode což je název organizace která vymyslela znaková sadu se stejným názvem, která má 32 bitový rozsah. Už víte, že 32 bitů je 232 a to je 4294967296 — 4 miliardy možných znaků!

To je víc znaků, než kolik celé lidstvo vůbec vymyslelo. Do 4 miliard se vejdou všechny abecedy světa, všechny symboly jazyků jako čínština které obsahují tisíce různých znaků, dále tam narvete i všechny možné historické znaky, různé varianty různých znaků, dokonce i fiktivní, vymyšlené abecedy…a to jste pořád někde na čísle 100000? 200000? Pořád máte 4 miliardovej nevyužitej prostor.

Třeba na emoji 🤪 Ano, emoji nejsou nic jiného, než znaky ve znakové sadě Unicode.

UTF-8

Plná znaková sada se jmenuje UTF-32. Každý znak zabírá 4 bajty, jenže většina latinkou psaného textu je už zahrnuta v ASCII, ze kterého historicky spousta dalších znakových sad vycházela.

UTF-8 je varianta, která toto zohledňuje. Prvních 8 bajtů odpovídá ASCII a ty další 3 bajty lze vynechat. Pokud ale potřebuji vyjádřit znak, který v ASCII není, jako například české „ř“ nebo emoji tak se využijí i zbývající 2 až 4 bajty. Díky tomu UTF-8 šetří místem a zároveň je kompatibilní s jakýmkoliv textem napsaným v ASCII.

Historické české znakové sady

Každý ajťák by si měl všude vynucovat Unicode. Bez diskuze. Unicode je totiž záruka, že zde lze použít jakýkoliv jazyk a nemusíte už řešit podporu různých znakových sad.

Jediný argument, proč používat jinou znakovou sadu je jen tehdy, pokud musíte pracovat se starým softwarem, který Unicode ještě nezná nebo jste nějakým jiným způsobem donuceni použít něco jiného, než Unicode. Je tedy dobré vědět, že historicky existují tyto české znakové sady, na které můžete narazit:

  • ISO-8859-2
  • Windows-1250
  • Kód Kamenických. Toto už je fakt moc stará srágora, pokud na to někde narazíte, polejte počítač benzínem a zapalte ho.

„Rozsypaný čaj“

Upřímně jsem šťastný, že už doba problémů špatných konverzí mezi různými znakovými sadami pominula. Už jen velice vzácně narážím na situace, kdy se mi český text zobrazuje ve špatné znakové sadě, než v jaké byl uložen.

Je ale dobré rozumět tomu, co se děje, když na to narazíte. Jakmile se pokusíte zobrazit nějaký text ve znakové sadě, se kterou daný text nebyl uložen, uvidíte bordel nebo „rozsypaný čaj“.

  • Žluťoučký kůň úpěl ďábelské ódy (uloženo a zobrazeno UTF-8)
  • Ĺ˝luĹĄouÄŤkĂ˝ kůň ĂşpÄ›l ďábelskĂ© Ăłdy (UTF-8 zobrazeno ve Windows-1250)
    • možná to nejde úplně poznat ale všimněte si, že písmena bez diakritiky prošla. To právě díky tomu, že UTF-8 i Windows-1250 vycházejí z ASCII, kde jsou znaky anglické abecedy, které jsou stejné i v češtině.

Souhrn

  • Znaková sada je „kód“ který určuje, jak se bity překládají do konkrétních znaků
  • Nejstarší znaková sada, ze které všechny ostatní znakové sady vychází, se jmenuje ASCII.
  • Nejmodernější a všude používaná znaková sada, která obsahuje i emoji, se jmenuje Unicode a má rozsah 4 miliardy znaků, většina tohoto rozsahu je nevyužita.
  • Pro šetření dat existuje varianta UTF-8 která s ASCII znaky pracuje pouze s 8 bity. Zbylé znaky zobrazuje v rozsahu 2 až 4 bajtů.
  • Pokud text uložený v jedné znakové sadě zobrazíš v jiné znakové sadě, zobrazí se vám nesmysly.

ALU

Tato kapitola je poslední kapitola, ve které vysvětluji, jak procesor pracuje s čísly.

Každý procesor obsahuje část, které se říká ALU – v angličtině „Arithmetic logic unit“, v češtině Aritmeticko-logická jednotka.

Tato část procesoru není nic jiného než kalkulačka, která umí dělat operace s celými čísly ve dvojkovém doplňku a s desetinnými čísly v plovoucí desetinné čárce . (Někdy se části procesoru pracující s desetinnými čísly říká FPU – „floating-point unit“ nebo „jednotka plovoucí desetinné čárky“)

Souhrnně ALU (nebo ALU+FPU) není nic jiného, než kalkulačka, která umí všechny možné matematické operace, které jsou v ní sestavené pomocí hradel nad 32 nebo 64 bitovými hodnotami, ať už jde o celá čísla ve dvojkovém doplňku, nebo o desetinná čísla v IEEE 754.

Zpravidla je to zadrátované tak, že procesor ovládá nějakou sadu matematických instrukcí, jejichž provedení deleguje právě do ALU.

Nezapomeňte na to, že všechny tyto matematické operace okolo dvojkového doplňku a plovoucí desetinné čárky nejsou reálně není nic jiného, než elektřina putující v reálných elektrických obvodech ve fyzické vrstvě!

Vrstva binární aritmetiky

Shrnutí

  • ALU je část procesoru, která se zabývá veškerými matematickými operacemi s celými a desetinnými čísly (někdy se část pracující s desetinnými čísly označuje jako FPU)

Plovoucí desetinná čárka

V minulém díle jsem pojmenoval jeden způsob, „kód“, jakým lze reprezentovat desetinná čísla v počítačích – fixní desetinná čárka. Tento způsob se v počítačích ale nepoužívá, protože nelze rozumně odhadnout, jaký by měl být poměr mezi celou a desetinnou částí.

Plovoucí desetinná čárka je další způsob, další „kód“, kterým lze desetinná čísla reprezentovat. Už z názvu je jasné, že rozdělení na celou a desetinnou část není fixní ale plovoucí nebo proměnlivé.

IEEE 754

IEEE je organizace v USA která vymýšlí různé standardy a jeden z těchto standardů je „kód“ na plovoucí desetinnou čárku s názvem IEEE 754.

Tento způsob vyjádření desetinných čísel s používá v počítačích dodnes, v každém procesoru.

Jak to funguje?

Vychází to z toho, že každé desetinné číslo lze reprezentovat tímto vzorečkem:

Desetinné číslo = mantisa * 10exponent

Já si myslím, že tuto reprezentaci jste už někde určitě viděli na nějaké kalkulačce, i když nejste ajťáci a slovo „mantisa“ vidíte poprvé. Je to jednoduchá rovnice.

1,2345 = 12345 * 10-4

Hodnota desetinného čísla IEEE 754 se ukládá buď do 32 nebo 64 bitů a je rozdělena na další 3 hodnoty: znaménko, exponent a mantisa. Na obrázku níže je ukázka tohoto rozdělení na 64 bitech.

64-bitové desetinné číslo dle IEEE 754
Zdroj: Wikipedia
  • První bit je znaménko (ano, z toho plyne negativní a pozitivní nula, viz. níže)
  • Dalších 11 bitů je exponent
  • Zbylých 52 bitů je mantisa

Podivné hodnoty, se kterými IEEE 754 počítá

Kladná a záporná nula

První bit je znaménko. Z předchozích kapitol už víte, že z toho plyne, že IEEE 754 podporuje kladnou a zápornou nulu.

Ajťáci z IEEE co to vymysleli si řekli, že bude jednodušší, aby se procesory nějak vypořádaly s kladnou a zápornou reprezentací nuly, než aby vymýšleli nějakou variantu „dvojkového doplňku“ pro desetinná čísla.

Tato prazvlášnost negativní a pozitivní nuly je zahlazena už v definici. Standard IEEE 754 narovinu říká, že záporná a kladná nula se mají chovat naprosto stejně, jako kdyby to byla jen jediná nula.

Kladné a záporné nekonečno

IEEE 754 obsahuje reprezentaci kladného nekonečna +∞ a záporného nekonečna -∞ a určuje, jak se s těmito hodnotami má nakládat při výpočtech s ostatními hodnotami.

Kladné a záporné NaN

NaN znamená „Not a Number“, jinými slovy: „Toto není platné číslo“. Prostě hodnota, která reprezentuje „nesmysl“…ale ne jeden nesmysl ale dokonce kladný nebo záporný nesmysl. Tuto hodnotu lze získat při některých matematických operacích, například dělení nulou.

Pokud provedete dělení nulou u celých čísel tak procesor provede nad vaším programem přerušení a pokračuje v toku instrukcí, který buď nadefinoval programátor nebo operační systém. Při dělení nulou v kontextu desetinných čísel se ale přerušení neprovádí a místo toho se vrátí hodnota NaN.

Shrnutí

  • Počítače pracují s desetinnými čísly pomocí plovoucí desetinné čárky přes standard který se jmenuje IEEE 754
  • IEEE 754 ukládá desetinné číslo do 3 částí: znaménko, mantisa a exponent.
  • IEEE 754 umí pracovat s „podivnými“ hodnotami:
    • Kladná a záporná nula
    • Kladné a záporné nekonečno
    • Kladné a záporné NaN — NaN znamená „Není číslo“ nebo „Nesmysl“ které může vzniknout po operacích jako je dělení nulou

Fixní desetinná čárka

V minulém díle jsem mluvil o tom, jak počítače nedokážou reprezentovat většinu desetinných čísel přesně. Nemluvil jsem ale o tom, jak se s desetinnými čísly vlastně konkrétně v počítačích pracuje.

Už víte, že pro celá čísla je nutné, aby to číslo mělo nějaký rozsah. Například 1 bajt je číslo v rozsahu 28 což může být číslo od 0 do 255 nebo od -128 do +127.

Pro desetinná čísla se používá 32 bitový a 64 bitový rozsah.

Příklad

Řekněme, že máte 32 bitů.
00000000000000000000000000000000

Jak do toho uložíte třeba číslo pí, které si zaokrouhlíme na 3,14?

  • Desetinné číslo se skládá z celé a desetinné části.
  • Jsou to vlastně dvě skupiny cifer: 3 a 14.

Takže můžete prostě jednoduše říct, že tato čísla převedete do dvojkové soustavy jako celá čísla:

  • 310 = 112
  • 1410 = 11102

Takže máte teď bity 11 a další bity 1110 které potřebujete nějak uložit do 32 bitů. Jak to uděláte? Všimněte si, že bity jsou prostě jen bity, signál je signál a žádné desetinné čárky v těch obvodech nejsou.

Jeden možný způsob je fixní desetinná čárka.

32 bitů rozdělíte na dvě skupiny: na celou a desetinnou část, třeba půl na půl: 16 bitů pro celou část, 16 bitů pro desetinnou část

0000000000000011: celá část
0000000000001110: desetinná část
3,14 = 00000000000000110000000000001110

Tento způsob není moc užitečný z několika důvodů

  • Pokud procesor postavíte nad fixní desetinnou čárkou, nemáte možnost to změnit.
  • Musíte při výrobě procesoru odhadnout, jak velká by měla být celá část a jak velká desetinná část. Jedno je na úkor druhého. Jenže různá odvětví vyžadují různě přesná/velká čísla, jako výrobce procesorů si nemůžete dovolit vyrábět pro každé odvětví procesory s různě stanovenými fixními čárkami, proto musíte vymyslet jiné řešení. Viz. další kapitola.

Shrnutí

  • Fixní desetinná čárka je „kód“, jakým lze reprezentovat desetinná čísla.
  • Tento způsob se v počítačích nepoužívá protože nelze nijak inteligentně určit, v jakém poměru by měla být celá a desetinná část.