dc (programovací jazyk)

Manuálová stránka programu GNU dc říká: 'Dc je kalkulátor s reverzní polskou notací a neomezenou aritmetickou přesností'. Je jednou z nejstarších unixových utilit a předchází dokonce vzniku programovacího jazyka C. Stejně jako jiné utility té doby se vyznačuje mocnými vlastnostmi, také však extrémně strohou syntaxí. Tradičně, na základě dc byl vytvořen uživatelsky příjemnější kalkulační program bc (s infixovou notací), ačkoli většina jeho současných implementací už není s dc nijak spojena.

Nástroje dc a bc byly vyvinuty Lorindou Cherryovou a Robertem Morrisem z Bellových laboratořích[1][2][3].

Tento článek přináší několik příkladů ve snaze ukázat jazyk jako takový. Kompletní seznam příkazů a syntaxe je třeba nastudovat z manuálové stránky konkrétní implementace.

Na rozdíl od bc je dc založen na reverzní polské notaci, což znamená, že matematické výrazy jsou prováděny na způsob zásobníku. Příklad – vynásobení čísel pět a šest (většinu bílých znaků lze vynechat):

4 5 *
p

Toto lze přeložit jako „vlož čtyři a pět do zásobníku, pak s operátorem násobení vyjmi dva prvky ze zásobníku, vynásob je a vlož výsledek zpět do zásobníku.“ Příkaz 'p' slouží k vypsání horního prvku v zásobníku.

Pro výpočet (12 + 3^4)/11-22:

12 3 4 ^ + 11 / 22 -
p

Krom základních aritmetických a zásobníkových operací zahrnuje dc i podporu maker, podmínek a ukládání výsledků pro pozdější použití; bohužel je jeho syntaxe velmi strohá a komplexní programy bývají jen velmi obtížně čitelné.

Mechanismem, který se skrývá se za makry a podmínkami, je tzv. registr. Registr je v dc úložný prostor s jednoznakovým názvem, do nějž lze ukládat a naopak z něj načítat: 'sc' vyjme horní prvek ze zásobníku a uloží jej do registru c; 'lc' vloží hodnotu z registru c do zásobníku:

3 sc 4 lc * p

S registry lze pracovat také jako se sekundárními zásobníky, takže lze mezi nimi a hlavním zásobníkem hodnoty vyjímat a vkládat.

Makra jsou implementována tak, že umožňují, aby hodnoty v registrech a zásobníku byly řetězci i čísly. Řetězec lze vypsat, může být ale také zpracován jako posloupnost příkazů. Kupříkladu je možné do registru m uložit makro pro přičtení jedničky a poté vynásobení dvěma:

[1 + 2 *] sm

S použitím příkazu 'x', který provede operaci na horní pozici zásobníku, je možné:

3 lm x p

Mechanismus maker lze využít i ke konstrukci podmínek. Příkaz '=r' vyjme ze zásobníku dvě hodnoty a makro, uložené v registru r, provede pouze v případě, že jsou si rovny. Následující příklad vypíše řetězec 'shodne' jen tehdy, je-li hodnota na vrcholu zásobníku rovna 5:

[[shodne]p] sm 5 =m

Cyklus je možné vytvořit definicí makra, které podmínečně volá samo sebe.

Příkladem budiž následující příkaz:

dc -e '[[Zadej cislo (v metrech) nebo 0 pro ukonceni.]psj]sh[q]sz[lhx?d0=z10k39.370079*.5+0k12~1/rn[ stop ]Pn[ palcu]P10Pdx]dx'

Ten převede vzdálenost v metrech na stopy a palce. Velká část příkladu se zabývá výzvami pro zadání hodnot na vstup, vypisováním výstupu ve vhodném formátu a probíhání cyklem pro převod dalšího čísla.

Další příklad je implementací Euklidova algoritmu pro nalezení největšího společného dělitele:

dc -e '?[dSarLa%d0<a]dsax+p' # kratsi
dc -e '[a=]P?[b=]P?[dSarLa%d0<a]dsax+[GCD:]Pp' # komfortnější verze

Reference

  1. Lorinda Cherry, Robert Morris - BC - An Arbitrary Precision Desk-Calculator Language dostupné anglicky online
  2. Or if you're a fan of cli tools, check out dc! | Hacker News. news.ycombinator.com [online]. [cit. 2022-02-17]. Dostupné online. 
  3. KRČMÁŘ, Petr. Zemřela Lorinda Cherryová, autorka utilit bc a dc. Root.cz [online]. [cit. 2022-02-17]. Dostupné online. 

Externí odkazy