Hlavní navigace

Matematika v příkazové řádce II - nástroj bc

31. 1. 2006
Doba čtení: 7 minut

Sdílet

Ve druhém pokračování seriálu o programových nástrojích určených pro matematické výpočty v příkazovém řádku se budeme zabývat popisem utility bc, která slouží k provádění výpočtů s numerickými hodnotami o prakticky neomezené přesnosti a rozsahu. Nástroj bc také nabízí možnosti programování (skriptování) za pomoci snadno naučitelného a použitelného skriptovacího jazyka.

Obsah

1. Stručný popis utility bc
2. Přednosti a zápory utility bc
3. Parametry příkazové řádky
4. Syntaktické elementy jazyka a základy ovládání
5. Číselné hodnoty
6. Proměnné
7. Operátory a výrazy
8. Obsah dalšího pokračování tohoto seriálu

1. Stručný popis utility bc

Program bc je v dokumentaci často nazýván an arbitrary precision calculator language, což poměrně přesně vystihuje funkci tohoto nástroje. Jedná se totiž o nástroj, jenž svým uživatelům nabízí jak možnost přímého provádění jednoduchých matematických (numerických) výpočtů se základními operacemi a funkcemi, tak i strukturovaný programovací jazyk, který je možné použít pro výpočty složitější; například ve chvíli, kdy je zapotřebí použít funkci, která není do bc ani jeho matematické knihovny vestavěna.

Důležité přitom je, že numerické hodnoty, které se pomocí operací a funkcí v bc zpracovávají, nejsou prakticky omezeny – týká se to jak rozsahu, tak i přesnosti numerických hodnot. To představuje velký rozdíl oproti základním datovým typům mnoha jiných programovacích jazyků – tyto typy (označované typicky float, double) jsou typicky omezeny na rozsah a přesnost podporovanou matematickým koprocesorem na dané platformě. Na druhou stranu jsou numerické operace většinou prováděné v bc rychleji, než v jiných skriptovaných jazycích, které také nabízejí neomezenou přesnost a rozsah zpracovávaných hodnot (příkladem může být oblíbený jazyk Python, v němž jsou některé numerické operace prováděny až několikanásobně pomaleji).

Další předností bc je použitý programovací jazyk, který je navržen tak, aby se ho jednoduše a rychle naučili programátoři pracující v C nebo syntakticky podobném jazyku (C++, Java). Narozdíl od kompilovaného céčka se však jedná o interpretovaný jazyk, který je navíc syntakticky i sémanticky značně zjednodušený, takže ho může po krátkém zaučení používat i neprogramátor – o tom se budeme moci přesvědčit v dalších odstavcích, kde bude tento jazyk podrobněji popsán.

V současné době existují dvě hlavní vývojové větve tohoto nástroje. První varianta, jež se drží standardu POSIX, je naprogramována pomocí utility dc (tou se budeme zabývat v dalších pokračováních tohoto seriálu), druhá varianta vzniká pod licencí GPL a jedná se o běžný céčkový program, který na dc nezávisí – to se výrazně podílí na vyšší rychlosti zpracování skriptů a v některých rozšiřujících možnostech, například víceznakových názvech proměnných.

2. Parametry příkazové řádky

Při volání bc je možné z příkazové řádky zadat několik parametrů. Následující popis parametrů je platný pro GNU verzi bc. Všimněte si, že – podobně jako v mnoha dalších GNU programech – mohou být parametry zadány jak ve zkrácené (jednopísmenné) podobě, tak i jako celé slovo. Před zkrácenou podobou parametru se píše jedna pomlčka, u dlouhé verze se používá dvojice pomlček.

Parametry
Krátká verze Dlouhá verze Význam parametru
-h  –help výpis základních informací o použití nástroje bc a následné ukončení běhu interpreteru
-l  –mathlib definuje standardní matematickou knihovnu, tj. knihovnu obsahující různé matematické funkce
-w  –warn vypíše varování o tom, že je použita rozšířená varianta této utility (rozšíření se v tomto případě chápe vůči POSIXovému standardu)
-s  –standard přepne interpreter do režimu kompatibilního s POSIXovým standardem
-q  –quiet zakáže výpis úvodní zprávy o nástroji bc, kterou GNU varianta disponuje
-v  –version vypíše informace o verzi utility bc, současně se vypíšou i informace o copyrightu a interpreter se posléze ukončí
-i  –interactive nastavení interaktivního režimu

3. Přednosti a zápory utility bc

Některé přednosti utility bc již byly zmíněny v první kapitole, můžeme si však udělat malou rekapitulaci. Mezi nejvýznamnější přednosti nástroje bc patří:

  1. Možnost práce s numerickými hodnotami majícími prakticky neomezenou přesnost a rozsah. Horní hranice rozsahu sice existuje (už proto, že počítače disponují konečnou pamětí), ale je mnohem větší, než je tomu u základních datových typů matematického koprocesoru.
  2. Použitý skriptovací jazyk je syntakticky podobný céčku, ale je přitom mnohem jednodušší na naučení i používání.
  3. Poměrně velká rychlost výpočtů, zejména při porovnání s dalšími nástroji pracující s neomezenou přesností a rozsahem numerických hodnot (rychlost není samozřejmě tak velká, jako při použití základních datových typů matematického koprocesoru).
  4. Běh této aplikace je možný i z příkazové řádky, dokonce nemusí být přítomna ani knihovna pro ovládání kurzoru (curses, ncurses apod.).
  5. Možnost volání bc ze skriptů shellu, čímž se možnosti shellu rozšiřují o pokročilejší matematické operace.
  6. Standardní součást prakticky všech typů operačního systému Unix, vlastnosti bc jsou dokonce definovány v normě POSIX.
  7. GNU verze utility bc je rozšířena o další funkcionality, zejména rozšíření skriptovacího jazyka.

Jako každý jiný softwarový nástroj má utilita bc své zápory. Mezi ně patří:

  1. Pro začínající uživatele je řádkově orientované uživatelské rozhraní tohoto nástroje příliš strohé a neintuitivní. Pro tyto uživatele může být řešením používání grafických „kalkulaček“.
  2. POSIXová verze má několik závažných omezení, nejvážnější je maximální počet šestadvaceti proměnných, který je zaviněn omezením jmen proměnných na jediný znak.
  3. Některé operátory známé z programovacího jazyka C nejsou v bc implementovány, i když by se pro provádění určitých výpočtů hodily. Jedná se zejména o bitové posuvy, které se musí nahradit voláním uživatelských funkcí.

4. Syntaktické elementy jazyka a základy ovládání

Mezi základní syntaktické elementy skriptovacího jazyka nástroje bc patří numerické hodnoty, proměnné (jejich jména), příkazy, výrazy, funkce, pseudo příkazy a komentáře. Všechny zmíněné syntaktické elementy budou popsány v dalších kapitolách. Budu se zabývat především GNU variantou utility bc, která je pravděpodobně v dnešní době již rozšířenější než poněkud omezená POSIXová verze.

Před popisem syntaxe bc a uvedením demonstračních příkladů si řekněme, jakým způsobem se bc ovládá. Pokud je již bc nainstalován (ať už z balíčku nebo přímo ze zdrojových kódů), je možné ho ze shellu zavolat příkazem bc (jak jinak). Při tomto volání se bc nachází v takzvaném interaktivním režimu, ve kterém je vstupním zařízením klávesnice a výstupním zařízením textová obrazovka (či textový terminál). Pokud je v systému nainstalována i knihovna readline, je možné při editaci textu na řádku používat běžné editační příkazy, jakými jsou [Ctrl+A] (přesun na první znak na vstupním řádku), [Ctrl+E] (přesun na poslední znak na vstupním řádku) apod. Historii zadaných příkazů je možné vyvolat buď kurzorovými klávesami [šipka nahoru] a [šipka dolů], nebo pomocí klávesových zkratek [Ctrl+P] (předchozí příkaz v historii) a [Ctrl+N] (následující příkaz v historii). Více informací o knihovně readline podá manuálová stránka – „man readline“.

Při spuštění nástroje bc v interaktivním režimu, tj. při zadávání příkazů z klávesnice, jsou výsledky numerických výrazů přímo tištěny na obrazovku. Výjimku tvoří přiřazení výsledné hodnoty výrazu do proměnné, v tomto případě se na obrazovku nic nevytiskne. Kromě implicitního zobrazení výsledků je také možné použít funkci (resp. pseudop­říkaz) print, která po svém zavolání vytiskne hodnotu svého argumentu. Běh interpreteru se ukončí pseudo příkazem quit nebo známou klávesovou zkratkou [Ctrl+D].

5. Číselné hodnoty

Číselné (numerické) hodnoty tvoří základní element skriptovacího jazyka bc. Zadávaná i zpracovávaná čísla mohou mít libovolnou přesnost, přičemž formát uložení je odlišný od běžných integerůfloatů. Každé číslo je rozděleno na svou celou část a část za desetinou tečkou. U každé numerické hodnoty se pracuje se dvěma atributy: celkovou délkou (length) a měřítkem (scale). Délka udává počet všech platných číslic, měřítko potom počet platných číslic umístěných za desetinnou čárkou (tečkou). Pokud se jedná o desetinné číslo, které se nachází v rozsahu 0…1, je nula před desetinnou tečkou považována za nevýznamnou. Příklady:

Číselné hodnoty
Numerická hodnota Délka Měřítko
42 2 0
42.0 3 1
0.01 2 2
.01 2 2
1234.567 7 3

Délku čísla (jak přímo zadaného, tak i čísla uloženého v proměnné) je možné zjistit zavoláním funkce length(), měřítko pomocí funkce scale(). V interaktivním režimu, tj. při spuštění utility bc bez dalších parametrů, se zadávané numerické hodnoty vyhodnocují samy na sebe a ihned po vyhodnocení se vytiskne jejich hodnota. Následuje příklad ukazující základy práce s numerickými hodnotami. Příkazy zadávané z klávesnice jsou zvýrazněny pomocí tučného písma, výstup programu je zobrazen běžným fontem:

[tisnik]# bc
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
10
10
20
20
length(42)
2
scale(42)
0
length(42.0)
3
scale(42.0)
1
length(0.01)
2
scale(0.01)
2
quit
[tisnik]# 

6. Proměnné

Proměnné tvoří velmi důležitou část jakéhokoli reálně použitelného programovacího jazyka. Jak jsem se již zmiňoval o několik odstavců výše, je skriptovací jazyk bc do značné míry beztypový, tj. proměnné není zapotřebí žádným speciálním způsobem deklarovat, postačí jim pouze přiřadit nějakou inicializační hodnotu (lokální proměnné uvnitř funkcí se však vytváří pomocí klíčového slova auto). Proměnné mohou být pouze dvou typů: skalární hodnoty (skaláry) a pole. V následujícím příkladu jsou ukázány základní operace s proměnnými:

[tisnik]# bc
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
a=10
a
10
print(a)
10
b=20
print(b)
20
print(c)
0
quit
[root]# 

7. Operátory a výrazy

Ve skriptovacím jazyku bc je možné používat výrazy, jejichž syntaxe je odvozena od programovacího jazyka C. K dispozici jsou zejména aritmetické a relační operátory, které jsou shrnuty v následujících dvou tabulkách.

Aritmetické operátory
+ - * /
+= -= *= /=
++ ^ ^=
Relační operátory
== !=
< <=
> >=

Aritmetický operátor ^ a ^= má však v bc jiný význam – zde slouží k provedení operace umocnění, nikoli k bitové operaci nonekvivalence.

V GNU verzi jsou k dispozici i další operátory, které je možné použít při zpracování booleovských výrazů. Jedná se o operátory && (logické and), || (logické or) a ! (logická negace).

root_podpora

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

V dalším pokračování tohoto miniseriálu budeme pokračovat v popisu nástroje bc. Ukážeme si způsoby vytváření nových funkcí, použití podmínek i programových smyček a na závěr budou uvedeny demonstrační příklady provádějící pokročilejší operace.

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.