Hlavní navigace

Matematika v příkazové řádce I

24. 1. 2006
Doba čtení: 9 minut

Sdílet

Dnešním dnem začíná na Rootu krátký seriál, ve kterém se budeme věnovat nástrojům určeným pro provádění nejrůznějších matematických operací. Zaměříme se přitom zejména na ty nástroje, které je možné spouštět i z "pouhého" příkazového řádku, tj. bez nutnosti práce s grafickým uživatelským rozhraním, které může v některých případech přinést více škody než užitku.

Obsah

1. Úvod
2. Numerické výpočty prováděné z příkazového řádku
3. Stručný popis utility dc
4. Stručný popis utility bc
5. Popis kalkulátoru calc
6. Tabulkové procesory s uživatelským textovým rozhraním
7. Úvodní informace o tabulkovém procesoru sc
8. Obsah dalšího pokračování tohoto seriálu

1. Úvod

Unixové systémy byly již od svého samotného počátku (počítaje k tomu i jejich ideového předchůdce Multics) vytvořeny s ohledem na to, aby svým uživatelům i administrátorům dovolovaly provádět jednoduché a přitom účinné zpracování textů, tj. dat organizovaných po (textových) řádcích obsahujících obecně různě dlouhé řetězce znaků. Celá filozofie unixových systémů klade velký důraz na dávkové zpracování a také na řešení problémů principem rozdělení zpracování i velmi komplexní úlohy mezi více jednoúčelových nástrojů, které konají pouze úzce definovanou činnost, ale zato tuto činnost konají bezchybně. Mezi převážně původní nástroje pro zpracování textů patří například utility typu wc, sort, sed, diff, head, tail, cat, grep, troff apod. K těmto nástrojům se postupně přidaly i složitější, převážně textově orientované nástroje a programovací jazyky, jakými jsou m4, awk nebo Perl (Perl však již dávno překročil hranici pouhého „drtiče textů“ a dnes se jedná o plnohodnotný programovací jazyk).

Počítače však – jak ostatně napovídá už jejich český či anglický název – nemusejí zpracovávat a vytvářet pouze textové informace, ale i číselná, resp. numerická data. Zpočátku byla numerická data v unixových systémech zpracovávána především pomocí nestandardních programů napsaných většinou v programovacím jazyku Fortran (nestandardních v tom smyslu, že se nejednalo o standardní součást operačního systému). Z tohoto pravidla existovala jedna význačná výjimka, kterou představovala utilita dc (desk calculator), na ovládání složitý a přitom mocný a Turingovsky úplný program, jehož historie je dokonce delší než historie programovacího jazyka C, který je s vývojem Unixu prakticky nerozlučně spjatý. V pozdější době se k poměrně kryptické utilitě dc přidávaly i další podobné nástroje, například bc (řádkově orientovaný kalkulátor s přívětivější syntaxí příkazů a infixovou notací zápisu operací), factor (program určený na faktorizaci čísel), calc (uživatelsky příjemný kalkulátor s céčkovskou syntaxí), sc (tabulkový procesor určený především pro textové terminály podporující adresaci kurzoru) atd.

V tomto krátkém seriálu, který dnes začíná na Rootu vycházet, se zaměřím na popis nástrojů, které jsou určeny především pro numerické výpočty a dále pro zpracování číselných/nume­rických dat. Budou popsány přednostně ty nástroje, které je možné provozovat i v textovém terminálu (samozřejmě včetně vzdáleného připojení), bez nutnosti mít nainstalovaný či spuštěný systém X-Window. Některé dále zmíněné nástroje si vystačí s „pouhým“ příkazovým řádkem, jiné nástroje pracují s celým textovým oknem, tj. ke svému běhu vyžadují funkce pro adresaci kurzoru v textovém okně (většinou je používána knihovna curses nebo ncurses). Dnešní díl bude zaměřen na zevrubný popis jednotlivých nástrojů, v dalších dílech budou tyto nástroje popsány podrobněji.

2. Numerické výpočty prováděné z příkazového řádku

V současné době existuje několik standardizovaných (tj. POSIXových) nástrojů, které umožňují provádět numerické výpočty i na příkazovém řádku, bez nutnosti použití systému X-Window. Použití příkazového řádku má samozřejmě své přednosti i zápory. Mezi nezanedbatelné přednosti patří menší nároky na systémové zdroje (operační paměť, požadovaný výpočetní výkon mikroprocesoru, výkon grafického subsystému, požadavky na nainstalované programové knihovny a jejich verze atd.), možnost předávat vstupní data i výsledky pomocí přesměrování a rour a v neposlední řadě také možnost jednoduše volat tyto nástroje ze skriptů – tím se poměrně chudé možnosti výpočtů shellovských skriptů obrovským způsobem rozšiřují.

Naproti tomu jsou různé „grafické kalkulačky” většinou vytvořeny jako nástroje, které jsou od svého aplikačního okolí značným způsobem izolovány – přenos číselných hodnot se většinou provádí přes schránku. V tomto ohledu překvapivě vítězí standardní kalkulačka dodávaná společně s Microsoft Windows, do které je možné přes schránku přenést celý matematický výraz, který se poctivě „vyťuká“ na vykreslené klávesničce :-). Možnosti většiny (ale ne všech) „grafických kalkulaček“ jsou dále omezeny tím, že pro výpočty většinou používají některý ze standardních numerických datových typů procesoru, a také nemožností naprogramování uživatelských funkcí, smyček či podmínek.

V následujících třech kapitolách budou uvedeny základní informace o třech matematicky orientovaných nástrojích pracujících v příkazovém řádku. Ve třetí kapitole si povíme o utilitě dc, v kapitole čtvrté o nástroji bc a konečně v páté kapitole o uživatelsky přívětivé kalkulačce calc.

3. Stručný popis utility dc

Nástroj dc (desk calculator) slouží k provádění numerických operací s prakticky neomezeným rozsahem a přesností použitých čísel. Na rozdíl od všech dále popsaných utilit se dc vyznačuje především tím, že se pro zápis všech aritmetických operací používá takzvaná obrácená polská notace (reverse polish notation, také postfixová notace), tj. nejdříve jsou uvedeny operandy a teprve po nich operátor. Předností tohoto způsobu zápisu matematických operací je absence závorek a zjednodušení vlastního interpreteru, který by při použití „obyčejné“ (infixové) notace nejprve musel zadané výrazy upravovat do notace postfixové (ať již přímou formou, přes derivační stromy nebo rekurzivním sestupem). Postfixová notace je také konzistentní, infixově se totiž zapisují pouze některé operace (sčítání, odečítání atd.), funkce se většinou zapisují prefixově, tj. před operand, některé též postfixově (například faktoriál).

Další zvláštností utility dc jsou takzvané registry. Na ty lze prohlížet jako na proměnné, jejich počet je však omezen počtem písmen abecedy – jména registrů jsou totiž pouze jednoznaková, podobně jako u některých primitivnějších interpreterů jazyka Basic. V registrech však nemusí být uložena pouze jedna hodnota, každý registr se chová jako samostatný zásobník, do nějž je možné hodnoty postupně ukládat (operace push) i vybírat (operace pop). V makrech (což jsou ve skutečnosti textové substituce) jsou tyto operace velmi často používány.

dc je po všech stránkách pozoruhodná aplikace. Syntaxe jejích příkazů je totiž tak „zašmodrchaná“, že se jí vyrovnají snad pouze konfigurační soubory programu sendmail nebo některé Perlovské skripty :-). Na druhou stranu se však ukazuje, že spojení zásobníkově orientovaného jazyka (které s sebou přináší i zmíněnou obrácenou polskou notaci) a propracovaného systému maker umožňuje vytvářet i složité programové konstrukce a dokonce i celé složité nadstavbové aplikace.

4. Stručný popis utility bc

Jménem bc je označen nástroj, který uživatelům nabízí možnost programování matematických výpočtů pomocí jednoduchého strukturovaného programovacího jazyka. Numerické hodnoty, které je možné zpracovávat programy napsanými v tomto jazyce, nejsou prakticky omezeny, a to ani svým rozsahem, ani přesností (to je značný rozdíl oproti základním datovým typům mnoha jiných – zejména staticky typovaných – programovacích jazyků). Jazyk používaný nástrojem bc je navržen tak, aby se ho jednoduše a rychle naučili zejména programátoři pracující s programovacím jazykem C, na druhou stranu jde oproti céčku o jazyk značně zjednodušený, který může po krátkém zaučení používat i neprogramátor – není například zapotřebí specifikovat typ proměnných, jsou omezeny strukturované datové typy apod. V současné době se můžeme setkat se dvěma hlavními vývojovými větvemi tohoto nástroje. Jedna větev je vyvíjena podle standardu POSIX, druhá větev – označme ji „GNU bc” – nabízí některé rozšiřující možnosti, například dlouhé názvy proměnných atd. POSIXová varianta je naprogramována ve výše popsané utilitě dc (což jen dokládá mocnost této utility), GNU varianta je céčková.

5. Popis kalkulátoru calc

Na aplikaci calc se můžeme z uživatelského hlediska dívat jako na dosti podstatné rozšíření výše popsané utility bc. Jedná se o nástroj umožňující programování matematických výpočtů pomocí programovacího jazyka, jež se, především svou syntaxí i sémantikou příkazů, do značné míry podobá programovacímu jazyku C. Podobně jako u utilit dc a bc i zde je možné veškerou práci provádět interaktivně, tj. uživatelem zapsané programy (skripty) se nemusí explicitně překládat, protože se postupně provádí již při svém zápisu. K dispozici jsou příkazy známé už z céčka i dalších jazyků postavených (syntakticky) nad céčkem: podmínkové příkazy (if, else), smyčky (while, for), operátory a výrazy (==, ++, *=) apod. Na rozdíl od céčka se však jedná o beztypový jazyk, tj. u proměnných, argumentů funkcí ani u jejich návratových hodnot není zapotřebí definovat typ, veškeré výpočty se provádí s čísly majícími prakticky neomezenou přesnost a rozsah.

6. Tabulkové procesory s textovým uživatelským rozhraním

Význam tabulkových procesorů, jež byly určené převážně k zpracování numerických dat, pravděpodobně není zapotřebí dlouze popisovat, vždyť první prodávaný tabulkový procesor VisiCalc se ve své době stal dokonce takzvanou „killer aplikací”, tj. programem, kvůli němuž si jednotlivci i celé firmy pořizovali počítače. V době VisiCalcu se jednalo především o počítače Apple II, až později byly preferovány modernější počítače řady IBM PC a kompatibilní, na nichž byl provozován buď upravený VisiCalc (mimochodem, ten je dokonce možné spustit i na dnešních počítačích) nebo známý tabulkový procesor Lotus 1–2–3. Už VisiCalc oplýval uživatelským rozhraním, které se od té doby prakticky nezměnilo, samozřejmě pokud nepočítáme přechod z textového celoobrazovkového režimu do režimu grafického (samotných tabulek se však tento přechod nijak nedotknul – viz screenshoty zobrazené na www.bricklin.com/fir­stspreadsheet­question.htm, které ukazují programy vzdálené od sebe téměř 20 let(!), nebo zajímavou animaci). Pokud není zapotřebí generovat složité grafy nebo barevně „vylepšovat“ tabulky, je možné i dnes použít tabulkový procesor pracující v textovém režimu, i když se to někomu může zdát nemoderní.

Pro Linux a další operační systémy především unixového typu je k dispozici tabulkový procesor sc, který si pro svůj běh vystačí s běžným textovým terminálem. Tím se tento tabulkový procesor odlišuje od dalších nástrojů, například OpenOffice.org Calc, Gnumeric apod. Základní informace o tomto tabulkovém procesoru budou uvedeny v následující kapitole.

7. Úvodní informace o tabulkovém procesoru sc

Tabulkový procesor sc, jehož původním autorem je známý James Gosling, je určený pro běh na operačních systémech disponujících knihovnou curses nebo ncurses (tyto knihovny jsou – zjednodušeně řečeno – určeny pro ovládání textového kurzoru a zápis znaků s barvovými a dalšími atributy do textového okna). Kromě prakticky všech unixových systémů je možné sc provozovat i na DOSu či v terminálovém okně ve Windows. Na rozdíl od většiny ostatních tabulkových procesorů, které pro své ovládání vyžadují myš, si sc vystačí pouze s klávesnicí – tomu také odpovídají použité klávesové zkratky a práce ve více módech, takže uživatelé textových editorů vi, vim, elvis apod. si práci s tímto tabulkovým procesorem velice rychle osvojí (ostatní uživatelé však pravděpodobně budou při prvních pokusech o ovládání zmateni a možná raději nastartují svá X-ka :-).

Jednotlivé buňky v tabulkách mohou obsahovat doleva či doprava zarovnaný text, numerické hodnoty a (samozřejmě) vzorce. Adresace buněk je prováděna podle dnes již běžného schématu A1, buňky je však také možné pojmenovat uživatelsky tak, jak to známe z pokročilejších tabulkových procesorů. sc obsahuje obvyklou sadu základních matematických, statistických i finančních funkcí, které je možné do vzorců v jednotlivých buňkách zadat. Je samozřejmé, že díky znakové povaze textového terminálu nejsou přímo podporovány grafy a složitější formátování buněk, data je však možné vyexportovat a převést například do formátu, který je zpracovatelný známou aplikací Gnuplot – výsledné grafy jsou pak mnohdy vytištěné kvalitněji než z profesionálních tabulkových procesorů, nehledě na větší možnosti práce s PostScriptem a jednoduššího dodržení „štábní kultury“ vytvořené grafiky. Blíže viz www.gnuplot.info.

CS24_early

8. Obsah dalšího pokračování tohoto seriálu

V následujícím pokračování tohoto seriálu si popíšeme práci s nástrojem bc, který byl stručně představen ve čtvrté kapitole.

Jaký nástroj používáte pro základní numerické výpočty?

Byl pro vás článek přínosný?

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.