Informatické dogmy

Pri vyučovaní informatiky (a čohokoľvek iného) sa asi nedá vyhnúť zjednodušeniam. Ak zahrniete začiatočníka množstvom podrobností, poriadne ho vydesíte. Lepšie je najprv vysvetliť pravidlo... a až keď ho študent pochopí, začať sa venovať výnimkám. Len mám pocit, že niekedy sa na tie výnimky zabúda; a nie vždy je jasné, či kvôli nedostatku času, alebo preto, že si sám učiteľ tieto výnimky neuvedomuje. Výsledkom je akýsi zjednodušený virtuálny svet existujúci iba na pôde vzdelávacích inštitúcií, čoraz viac odtrhnutý od skutočnosti. V tomto článku sa pokúsim odhaliť temné stránky niektorých "jasných" školských poučiek.

Vstupné a výstupné zariadenia

Jedna z prvých lekcií: k počítaču môžete pripájať rozličné zariadenia. Niektoré slúžia na vstup dát do počítača; tie sa nazývajú vstupné zariadenia. Iné slúžia na výstup dát z počítača; tie sa nazývajú výstupné zariadenia. Okrem toho existujú aj zmiešané zariadenia, ktoré sú vstupné aj výstupné. Typické vstupné zariadenia: klávesnica, myš. Typické výstupné zariadenia: obrazovka, tlačiareň. Jednoduché, však?

V skutočnosti je z uvedených štyroch príkladov správna akurát myš (aj tým si nie som u optických myší na 100% istý). U ostatných zariadení prechádzajú dáta obidvoma smermi. Ako používatelia si to neuvedomujeme, lebo pre nás je dôležitý iba jeden smer, ale aby tieto zariadenia dobre fungovali, musia si poskytovať spätnú väzbu.

Na klávesnici je tlačidlo "NumLock", ktoré prepína fungovanie pravej časti klávesnice na zadávanie čísel, alebo navigáciu po texte. Obe funkcie sú vlastne nadbytočné, lebo aj číslice aj navigačné šípky sa nachádzajú aj inde. Väčšina používateľov dáva jednému z nastavení prednosť, len sa nevedia dohodnúť ktorému. Aby si to teda nespokojná menšina nemusela po zapnutí počítača stále prepínať, možno si požadovaný stav tlačidla NumLock určiť v nastaveniach počítača, a pri štarte počítača sa toto tlačidlo automaticky zapne alebo vypne. Táto informácia teda ide z počítača do vstupného zariadenia... a to by sa nemalo, však?

Keď sa vykresľuje obraz na obrazovku, funguje to asi takto: (popisujem CRT; neviem ako je to pri LCD) raz za nejaký čas, povedzme 50-krát až 100-krát za sekundu, prejde vykresľovací lúč po obrazovke zhora dole po riadkoch a vykreslí jeden záber. Potom je chvíľku pauza, a potom sa vykreslí ďalší záber. Postupnou zmenou krátkych záberov vzniká ilúzia pohybu; rovnaký princíp ako pri televízore. Počítačová animácia má teda dve etapy: najprv program vykreslí obrázok do grafickej pamäte, a potom vykresľovací lúč prenesie údaje z grafickej pamäte na plochu obrazovky. Údaje je najlepšie zapisovať do grafickej pamäte vtedy, keď má vykresľovací lúč pauzu. Inak sa môže stať, že grafickú pamäť prepíšeme, keď je vykresľovací lúč na polceste, a tým pádom bude jedna polovica obrazovky o zlomok sekundy pozadu za druhou... ťažko sa to slovami popisuje, ale ak sa na obrazovke výrazný predmet rýchlo pohybuje nabok, bude "roztrhnutý a posunutý" pozdĺž vodorovnej čiary. Informácia o stave vykresľovacieho lúča sa prenáša z výstupného zariadenia do počítača.

Môžete namietať, že tieto dva príklady sú dôležité iba "pre zasvätených" a bežný používateľ o nich nepotrebuje vedieť. Dajme si teda jednoduchší príklad: Čo urobí tlačiareň, keď vytlačí papier? A čo urobí, ak sa papier pri tlači zasekne, alebo sa minie toner? Oznámi to počítaču, ktorý túto informáciu zobrazí používateľovi. Opäť, výstupné zariadenie posiela informáciu do počítača. Koľkí to už videli na vlastné oči? A koľko rúk sa zdvihne na hodine informatiky, keď učiteľ z knižky prečíta dogmu o vstupných a výstupných zariadeniach?

Program a dáta

Lekcia pre mierne pokročilých: V počítači sa nachádzajú dva rôzne typy vecí -- programy a dáta. Program je návod, ktorým sa počítač riadi pri spracovávaní dát. Program je postup, algoritmus, vzorec; dáta sú spracovávaná surovina, polotovar, a výsledný výrobok. Príkladom programu je textový editor alebo hra; príkladom dát je textový dokument alebo uložená pozícia v hre. Program môžete zapnúť alebo vypnúť; dáta môžete spracovávať iba pomocou nejakého programu. Jasné, nie?

Skutočnosť je zložitejšia. Predstavte si, že máte program, ktorý má niektoré nastavenia uložené v konfiguračnom súbore. Čo je konfiguračný súbor: program alebo dáta? Asi poviete, že dáta; špeciálny typ dát, ktoré nie sú určené pre používateľa, ale pre samotný program. Súhlasím; s dodatkom, že keby tieto nastavenia boli uvedené v kóde programu (napríklad ako konštanty), asi by sme ich už považovali za program... či ešte nie? No vráťme sa ku konfiguračnému súboru. Čo ak je v ňom uvedený aj názov pomocného programu, ktorý sa má spustiť pred vykonaním hlavného programu, prípadne pri stlačení špeciálneho tlačidla v hlavnom programe? Čo ak je v ňom uvedená aj podmienka, kedy sa má spustiť; čo ak celý algoritmus?

Konkrétne v operačnom sytéme MS Windows: Zástupcovia, čiže súbory s príponami "pif", "lnk", "scf" (tie prípony sa pri štandardnom nastavení systému nezobrazujú). Sú to také malé obrázky so šípkou v ľavom dolnom rohu; ak sa nachádzajú v štartovom menu alebo paneli rýchleho spustenia, sú bez šípky; keď na ne kliknete, spustí sa daný program alebo súbor. Samotní títo zástupcovia sú programy alebo dáta? Dajú sa spustiť; no neobsahujú žiaden algoritmus. Ak ste odpovedali, že dáta, ako potom označíte súbory typu "bat"? Pôvodne robili len o trochu viac ako zástupcovia; mohli ste do nich napísať niekoľko príkazov a jednoduché podmienky. V každej ďalšej verzii MS Windows sa ich schopnosti rozširujú, a dnes v nich môžete s využitím externých programov napísať pomerne zložité algoritmy.

A čo textový dokument? Jasné dáta, nie? A čo ak je v tomto textovom dokumente uložené aj "makro", čiže krátky program? Ale pre jednoduchosť predpokladajme, že máme obyčajný textový dokument bez makier, a v ňom je napísaný napríklad... návod ako piecť buchty. Obsahuje algoritmus, ale nedá sa spustiť. Predstavme si, že jedného dňa niekto vytvorí kuchynského robota, ktorý bude vedieť takýto textový dokument prečítať a na jeho základe tie buchty naozaj upiecť. V tom prípade sa z textového dokumentu stane program. Čo ak je vlastne každý textový dokument programom, akurát pre niektoré ešte nevymysleli príslušného robota? A predstavme si napríklad stroj, ktorý bude na diskotéke blikať farebnými svetlami. Aby sme nemuseli vymýšľať náhodné čísla, vložíme do stroja disketu s textovým dokumentom; stroj každú sekundu spracuje jeden znak, a keď príde na koniec, začne znova od začiatku. Ak to bude samohláska, zabliká červené svetlo, ak spoluhláska, zabliká zelené svetlo, ak niečo iné, zabliká modré svetlo. V tomto prípade je vlastne každý textový dokument programom pre tento stroj. Alebo nie?

Vezmime si teraz kompilátor, čiže program, ktorý zo zdrojového kódu vytvára spustiteľný program. Práve vytváraný program sú z hľadiska kompilátora počas kompilácie iba dáta; skutočným programom sa stane až po dokončení. Z pohľadu dekompilátora sú zase všetky programy iba dáta, ktoré načíta a rozoberie na iné dáta. A čo z pohľadu emulátora, interpretera, debugera...?

Tieto príklady sa vlastne točia okolo toho, v ktorom okamihu si už interpretované dáta zaslúžia označenie "program". Jeden extrémny pohľad je, že všetko sú vlastne iba dáta... nuly a jednotky... a rozdiel je iba v tom, ktoré z týchto dát vykonáva procesor ako inštrukcie. Z tohoto pohľadu už ani interpretovaný program nie je programom, sú to iba spracovávané dáta. Opačný pohľad zase hovorí, že všetko je potenciálny program, otázka je len, či sa tým programom momentálne niekto riadi; na technických detailoch nezáleží. Tento pohľad sa netýka iba počítačov... v širšom zmysle je aj kód DNA programom, ktorým sa riadi bunka, a kuchárska kniha je zase programom, ktorým sa riadi kuchár. To už sa ale z oblasti informatiky presúvame do oblasti filozofie...

Kompilované a interpretované jazyky

Lekcia pre pokročilých: Počítačové jazyky môžu byť kompilované alebo interpretované. Pri kompilovanom jazyku najprv špeciálny program (kompilátor) preloží zdrojový kód do strojového kódu; počítač potom spúšťa tento strojový kód. Pri interpretovanom jazyku sa pri každom spustení programu zavolá špeciálny program (interpreter), ktorý za behu vykonáva jednotlivé príkazy v zdrojovom kóde. Kompilované programy treba po napísaní skompilovať, potom sú vo všeobecnosti pri spustení rýchlejšie. Nemusíte k nim dodávať zdrojový kód, ale ak ich chcete spúšťať na viacerých systémoch, treba ich pre každý skompilovať osobitne. Interpretované jazyky kompilovať netreba, na ich spustenie musíte mať nainštalovaný kompilátor, a vo všeobecnosti sú pomalšie. Program existuje iba vo forme zdrojového kódu, a môžete ho spustiť na hocijakom systéme, kde existuje príslušný interpreter.

Toto rozlíšenie tiež vyzerá jednoducho. Programy v jazykoch Pascal a C/C++ treba najprv skompilovať a potom ich možno spustiť. Programy v jazykoch PHP a Perl sa nekompilujú, spúšťajú sa pomocou interpretera. Programy v jazyku Java treba najprv skompilovať do pseudokódu (bytecode), a aj potom ich možno spustiť iba s pomocou interpretera (Java Runtime Environment). Prečo? No, v určitom zmysle sa takto spájajú výhody kompilovaných a interpretovaných jazykov. Najpomalšou časťou interpretácie je analýza zdrojového kódu... kde ktoré slovo začína a končí, čo ktoré slovo znamená, akú logickú štruktúru spolu vytvárajú. Toto sa vyrieši pri kompilácii do pseudokódu, takže po spustení beží program pomerne rýchlo; síce o čosi pomalšie ako bežný kompilovaný jazyk, ale omnoho rýchlejšie ako bežný interpretovaný jazyk. Na rozdiel od strojového kódu je pseudokód jazyka Java rovnaký pre všetky operačné systémy; ako hovorí reklamný slogan, naprogramujete raz, spustíte všade. Zatiaľ čo v kompilovaných jazykoch je písanie programov zároveň pre Windows, Linux a Mac zvyčajne veľkým utrpením, v Jave je to úplná pohoda.

Podobným riešením ako Java je aj systém ".NET". Takisto sa kompiluje do pseudokódu (viac-menej) spustiteľného na rôznych platformách, ale navyše z rôznych programovacích jazykov. Vezmime si napríklad zdrojový kód v jazyku Pascal; môžeme z neho vykompilovať klasický strojový kód, alebo pseudokód pre ".NET". Tým sme sa mimochodom dostali k ďalšiemu zaujímavému faktu; či je jazyk kompilovaný alebo interpretovaný, nemusí záležať iba od samotného jazyka, ale od toho, či sa daný program rozhodnete skompilovať alebo interpretovať. Niekto musí akurát naprogramovať príslušný kompilátor a interpreter. Rozhodnutie môže padnúť dokonca aj po spustení programu. Takzvané "just-in-time kompilátory" skompilujú program tesne pred spustením, alebo sa až po spustení rozhodnú skompilovať niektoré jeho najčastejšie používané časti.

Bežné sú aj riešenia, kde sú rôzne časti programu napísané v rôznych programovacích jazykoch. Program v interpretovanom jazyku volá napríklad kompilovanú grafickú knižnicu (zvyčajne v C/C++), lebo grafické operácie sú náročné a musia ísť rýchlo. Alebo kompilovaný program používa skript v interpretovanom jazyku (zvyčajne Python, Lua) na vyhodnotenie základnej logiky.

Dnešné kompilovanie takisto nie je to, čo kedysi; kompilované programy majú (za cenu istého spomalenia) prístup k vlastnostiam, ktoré boli tradične vyhradené pre interpretované jazyky. Napríklad dátový typ "Variant" obľúbený v programovacích jazykoch od firmy Microsoft; môžete doňho priradiť premennú hocijakého typu. Alebo "reflexia" v jazyku Java; umožňuje zavolať objekt alebo funkciu na základe znalosti ich mena. Atď, nepúšťajme sa do ďalších detailov.

Týmto rozhodne nechcem povedať, že by sa na informatike malo prestať učiť o vstupných a výstupných zariadeniach, o rozdiele medzi programom a dátami, o kompilovaných a interpretovaných jazykoch. To všetko sú veľmi dôležité pojmy. Treba však upozorniť, že sú zjednodušené, aby sa nám o nich ľahšie rozmýšľalo, a že skutočnosť je často zložitejšia.

pošli na vybrali.sme.sk

Komentáre: 0


Google