V programátorské praxi čas od času vyvstane požadavek na změnu postupu v numerickém výpočtu podle alternativního použití programu, který takové výpočty provádí. Možností, jak se s takovým zadáním vypořádat, je několik:
Už první letmý pohled na předcházející řádky dává tušit, že (záměrně) vynechaná varianta typu "Zdrojáky přece změním a znova přeložím, né? Tak v čem je problém, vole???" je mimo rámec uvažování autora tohoto textu.
Další (už vyjmenované) možnosti nabízejí výrazně elegantnější metody. První dvě jsou si svým způsobem hodně podobné: je vcelku lhostejno, je-li část programu (před jeho spuštěním) v jiném nebo stejném souboru na disku. Charakteristickou vlastností obou způsobů je fakt, že kód (program) musí být předem přeložen překladačem programovacího jazyka. Jakákoliv změna zamýšlená "v poli" bez možnosti použití vývojových prostředků (assembler, linker, ...) je vyloučena.
Poslední z nabízených možností je právě ta, která zmíněnou flexibilitu nabízí. Je třeba změnit chování zařízení tak, že hodnotu vyčtenou z HW je třeba před odesláním jinému programu nebo dalším zpracováním vynásobit čtyřmi a maskovat číslem 0x01FF místo dosavadního pouhého násobení dvěmi? Žádný problém. Stačí použít jakýkoliv textový editor a před spuštěním inkriminovaného programu příslušné řádky souboru s početním postupem upravit nebo doplnit!
Nic však není zadarmo. Za tuto prudkou eleganci je třeba smířit se se zaplacením daně ve formě vyšších nároků na výpočetní výkon použitého počítače. Dá rozum, že strojový kód generovaný překladačem jazyka "C" bude vždy výrazně rychlejší než sebedokonalejší interpretace nějakého pseudokódu. Je však na zodpovědnosti programátora používajícího interpret, zda-li ho "dá do cesty" nicotnému množství dat zpracovávaných jednou za stovky milisekund, nebo toku třeba obrazových dat z kamery s vyšším rozlišením. Nikdo nemusí být specialistou na interpretery, aby jasně neviděl potenciální neúspěch (nebo alespoň velké potíže) v případě druhé ze jmenovaných možností.
V duelu "spotřeba strojového času" vs. "operabilita" budiž na obranu RPN procesoru uvedeno následující: Navzdory tomu, že vstupem definujícím program je text, interpretovaný kód je binární. Zejména v případě číselných konstant v programu se to jeví jako výrazné ulehčení pro CPU. Bylo by opravdu hloupé každé číslo převádět z textové formy do binární, obzvláště v případě mnohonásobných iterací...
Odpověď je částečně naznačena již v předchozím odstavci. Implementace RPN (pro neznalé - je detailní popis buď zde nebo tady) je nepoměrně méně náročná (z hlediska zátěže CPU) než tradiční algebraický systém. Žádné rozebírání priorit operátorů, žádné nevyřízené operace díky závorkám. Nic takového. Zde stačí pouhé zadání jednoho nebo dvou operandů (podle typu operace) a provedení příslušné operace. Jednodušší a jednoznačnější systém zpracování číselných dat opravdu nemůže být.
Pokud má být nějaký produkt snadno použitelný, musí splňovat alespoň jedno z následujících kritérií:
Zde popisovaný RPN procesor ve formě knihovního modulu pro různé OS oba požadavky splňuje vrchovatě. Osvojit si systém RPN je pro technika, který se s ním nikdy nesetkal, otázkou nejvýše jednoho odpoledne. Pro ostatní to může být příjemný zážitek, plný nostalgických vzpomínek na úžasné kalkulátory firmy Hewlett-Packard z konce sedmdesátých let dvacátého století.
RPN procesor obsahuje sadu instrukcí, která se svým významem, mnemonikou a sdružením do syntaktických celků nápadně podobá instrukcím známým z kalkulátorů HP. Zejména se jedná o typy:
Srovnání možností knihovny "rpnproc" se skvosty mezi staršími kalkulátory přímo vybízí ke zveřejnění parametrů interpreteru. Zde jsou:
Název parametru, problematika | Hodnota parametru, vysvětlení, popis, ... |
---|---|
RPN stack | 4 úrovně |
Maximální počet proměnných (variable) | 1000 (rozlišených hodnotou 000* až 999*) |
Maximální počet návěští (label) | 1000 (rozlišených hodnotou 000* až 999*) |
Registr pro nepřímou adresaci | kterýkoliv z daného rozsahu |
Objekty pro nepřímou adresaci | proměnné, návěští |
Aritmetika s proměnnými | + − × ÷ pro STO i RCL |
Větvení programu | Podmínky (2 × 6 instrukcí: x>y, x<=0, ...), skoky (GTO, XEQ, RTN) |
Počet úrovní podprogramu | 32 (viz instrukce XEQ a RTN) |
Realizace programové smyčky | Instrukce ISG, DSE |
Maximální délka programu | neomezená: "co dá paměť počítače!" |
*) Čísla proměnných jsou ve výpisu zobrazena na 3 místa, zleva doplněna nulami. Jedná se vždy o hodnotu dekadickou.
Souvislého vyprávění už bylo dost, na řadě jsou tabulky a strohé popisy:
Pro případné zájemce o použití je zde i tato rubrika. Stáhnout knihovnu je možné v několika verzích pro různé platformy a překladače. Header (soubor rpnproc.h) je pochopitelně pro všechny stejný.
Soubor test.c (ke stažení zde) obsahuje kompletní zdrojový kód jednoduchého programu, který ukazuje použití knihovny. K jeho sestavení (pro QNX a Linux) postačí příkaz:
gcc -O3 -fomit-frame-pointer -Wall -Wno-parentheses -lrpnproc -o rpnproc test.cVýsledek sestavení lze jednoduše vyzkoušet, zde jsou příklady.