Hlavní navigace

Programovací jazyky z vývojářského pekla: špagetový kód na kalkulačkách

14. 6. 2016
Doba čtení: 14 minut

Sdílet

 Autor: Shutterstock.com
Dnes se seznámíme s programováním některých klasických kapesních kalkulaček, protože výsledkem snah vývojáře byl většinou „nádherný“ špagetový kód.

Obsah

1. Programovací jazyky z vývojářského pekla: špagetový kód na programovatelných kalkulačkách

2. HP-9100: první stolní programovatelný kalkulátor společnosti HP

3. HP-65: první programovatelný kapesní kalkulátor

4. Programovatelné kalkulačky společnosti Texas Instruments

5. Další výrobci programovatelných kalkulaček

6. Série HP 10c

7. Programování na kalkulačkách série HP 10c

8. Základní příkazy zadávané z klávesnice

9. Jednoduchá nekonečná smyčka od 0 do (téměř) nekonečna

10. Počítaná smyčka od n do 0

11. Výpočet faktoriálu

12. Odkazy na Internetu

1. Programovací jazyky z vývojářského pekla: špagetový kód na programovatelných kalkulačkách

Ve čtyřdílném miniseriálu o programovacích jazycích pocházejících z programátorského pekla jsme se zabývali převážně různými esoterickými programovacími jazyky, které byly většinou schválně navrženy takovým způsobem, aby programy v nich byly nečitelné, popř. aby se využíval zcela minimální počet instrukcí či příkazů. Ovšem i některé komerčně prodávané výrobky jsou v některých případech vybaveny programovacím jazykem, který není přehledný a už vůbec ne elegantní. Příkladem mohou být některé programovatelné kalkulačky, zejména ty produkty, které obsahují pouze sedmisegmentový displej. A nemusí se přitom jednat pouze o muzeální kousky hardwaru, protože například kalkulačka HP 12c je stále velmi populární a společnost HP ji běžně prodává. A právě při programování těchto kalkulaček se setkáme se špagetovým kódem, v němž se to jen hemží instrukcemi GTO (goto) a absolutními indexy (adresami) příkazů (nehledě na to, že se může využívat RPN a tedy i zásobníkový kód). I přesto v těchto jazycích vzniklo mnoho úspěšných výpočetních subrutin i jednoduchých her.

2. HP-9100: první stolní programovatelný kalkulátor společnosti HP

Jedním z prvních stolních programovatelných kalkulátorů je model HP-9100, který byl vyráběn ve variantách A a B. Tento kalkulátor vůbec nebyl levný, protože byl prodáván za 5000 (tehdejších) dolarů, ovšem na rozdíl od konkurence, která většinou nabízela jednoduché kalkulačky se čtyřmi základními operacemi, byl model HP-9100 mnohem komplikovanější, protože například umožňoval výpočet logaritmů, druhé odmocniny, trigonometrických funkcí apod. K HP-9100 bylo možné připojit i tiskárnu či plotter, dodávána byla i čtečka magnetických karet (pro programy i data). Právě v HP-9100 se objevuje použití RPN (převrácené polské notace), ovšem zásobník zde měl pouze tři úrovně označované symboly X, Y a Z (později byla přidána poslední úroveň T – temporary či top). Kromě zásobníku bylo možné při programování použít šestnáct pracovních registrů, ovšem kvůli sdílení paměti mezi registry a programem se musel uživatel rozhodnout, jak program strukturovat (každý registr zabíral paměť odpovídající čtrnácti programovým krokům). Způsob programování je vysvětlen v sedmé kapitole.

Mimochodem: ke vzniku HP-9100 se váže pěkná historka. Spolumajitel firmy HP Bill Hewlett měl ve své kanceláři stůl, na němž bylo mj. i místo určené pro běžný psací stroj. Bill měl tento stůl rád, a tak po designérech požadoval, aby se právě vyvíjený model HP-9100 vešel do místa určeného pro psací stroj. Když byla navržena první verze tohoto modelu, přišli inženýři do Billovy kanceláře a s hrůzou zjistili, že se do místa určeného pro psací stroje jejich prototyp nevejde. Ovšem díky tomu, že pan spolumajitel byl zrovna na dovolené a po návratu mu bylo nutné ukázat prototyp, povolali designéři stolaře, který stůl trošičku poupravil, takže když se Bill Hewlett vrátil z dovolené a viděl prototyp kalkulátoru na svém stole přesně ležící na určeném místě, pouze prohlásil: „You see! I knew you could do it!“

3. HP-65: první programovatelný kapesní kalkulátor

Přelomovým a vlastně i revolučním kalkulátorem se stal model HP-65. Jednalo se o první programovatelný kapesní kalkulátor HP, jehož design byl odvozen od slavné HP-35, včetně použití červených LED pro sedmisegmentový displej. V HP-65 bylo možné vytvářet relativně rozsáhlé programy o délce až sta řádků, přičemž každá instrukce byla zakódována do šesti bitů (64 kombinací). V HP-65 se pro rozvětvení používaly čtyři typy testů: x!=y, x<=y, x==y a x>y, přičemž každý test porovnával prvky na zásobníku (první s druhým). Objevuje se zde i klávesa SST (single step), ovšem ne již klávesa BST (back step), což činilo editaci programů poněkud složitou. Podobně jako kalkulačka MK-52 zmíněná níže, se i HP-65 používal ve vesmírných misích, konkrétně v programu Sojuz-Apollo jako záloha pro případ, že by hlavní počítač nebyl funkční a spojení se Zemí přestalo fungovat (popř. by astronauti nebyli v dosahu pozemní stanice). Programy byly samozřejmě připraveny a otestovány dopředu a uloženy na magnetických kartách. Rychlost výpočtů nebyla kritická a přesnost naopak zcela dostatečná – na deset desetinných míst.

Obrázek 1: HP-65 i s vloženou magnetickou kartou.
Zdroj: Wikipedia.

4. Programovatelné kalkulačky společnosti Texas Instruments

Společnost HP samozřejmě nebyla jedinou firmou na světě, která dokázala navrhnout a vyrobit programovatelné kalkulačky. Jejím dlouholetým konkurentem s poněkud odlišným portfoliem je další slavná firma: Texas Instruments (TI).

Ve druhé polovině sedmdesátých let minulého století začala i společnost Texas Instruments prodávat programovatelné kalkulačky. Základem, od něhož byly odvozeny oblíbené kalkulátory řady TI-5×, je model SR-52, což byla první programovatelná kapesní kalkulačka firmy TI. V SR-52 se používal jednořádkový displej z červených LED a především se zde objevila možnost programování. Programy mohly mít délku až 224 kroků a kromě klasických instrukcí pro skok a podmínky se zde objevuje i možnost skoku do subrutiny (podprogramu) a definice návěští (label), což je lepší režim, než použití absolutních adres, s nímž se setkáme níže. Řada TI-5× převzala základní vlastnosti modelu SR-52, ovšem možnosti se rozšířily (například se zvětšila paměť pro programy 2× až 4×, byl přidán konektor pro připojení externího ROM modulu s téměř neuvěřitelnou kapacitou 5000 kroků apod.). Důležitým rozdílem od kalkulaček HP byl algebraický režim, který byl pro mnoho uživatelů jednodušší na používání (a právě rozdíl mezi HP s RPN a TI s algebraickým režimem vedl k rozdělení uživatelů na dvě téměř znepřátelené skupiny, podobně jako to známe dnes u uživatelů mobilů atd.)

Pravděpodobně nejpopulárnějšími programovatelnými kalkulátory Texas Instruments je řada TI-8× následovaná řadou TI-9×. Všechny kalkulačky z těchto dvou řad jsou grafické, tj. obsahují větší rastrový monochromatický displej (klasické LCD) s rozlišením původně 96×64 pixelů, na němž bylo možné zobrazit jak celé výrazy, které se měly vypočítat (v algebraické podobě), tak i průběhy 2D a 3D funkcí. Starší modely řady TI-8× byly založeny na populárním osmibitovém mikroprocesoru Zilog Z80, novější a výkonnější modely pak na jádře procesoru Motorola 68000. Ovšem z uživatelského hlediska byla důležitější podpora programování, která zahrnovala programovací jazyk odvozený od zjednodušeného BASICu.

Model TI-81 z roku 1990 zahájil celou sérii.

Příkladem může být například jednoduchá hra pro hádání čísel, kterou je možné naprogramovat v TI BASICu takto:

:ClrHome
:randInt(1,1000)→N
:Disp "Guess a number"
:For(I,1,10)
:Input "Guess?",G
:If N=G:Then
:Disp "You've got it!","Guesses:",I
:Pause
:Stop
:Else
:If N>G:Then
:Disp "Higher..."
:Else
:Disp "Lower..."
:End
:End
:End
:Disp "You lose!","The number was:",N

Právě díky ucelené kombinaci grafického rastrového displeje a jednoduše pochopitelného TI BASICu se tyto kalkulačky staly velmi populární a vznikaly pro ně různé typy aplikací, včetně různých her. Později se dokonce (původně neoficiálně) objevila i možnost programování ve strojovém kódu a některé nejnovější modely (TI-Nspire) je možné programovat ve známém programovacím jazyce Lua.

Model TI-92 Plus vsadil na odlišný design s QWERTY klávesnicí.

5. Další výrobci programovatelných kalkulaček

Programovatelné kalkulačky vyrábělo i mnoho dalších společností. Nesmíme zapomenout na Casio, která vlastně stála na samotném začátku těchto produktů, protože její model stolního programovatelného kalkulátoru AL-1000 pochází z poloviny šedesátých let minulého století, tj. z období před vznikem mikroprocesorů a samozřejmě i mikropočítačů. Později tato společnost začala nabízet jak klasické programovatelné kalkulačky se sedmisegmentovým displejem, tak i kalkulačky se dvěma či více řádky textu (FX-850P) a samozřejmě i plnohodnotné grafické kalkulačky (FX-7000G, první grafická kalkulačka dostupná veřejnosti).

Ovšem programovatelné kalkulačky se vyráběly i v zemích RVHP. Příkladem je stolní programovatelný kalkulátor ISKRA 123 z počátku sedmdesátých let minulého století. Kapesní kalkulačky se začaly vyrábět o přibližně šest let později: Elektronika B3–21, Elektronika B3–34 a zejména pak Elektronika MK-52. Tento poslední model je zajímavý mj. i tím, že byl použit v kosmickém programu Sojuz (let TM-7, doba trvání celkem 151 dnů) jako záloha za hlavní řídicí počítač. Tento model byl, podobně jako kalkulačky TI na západě, velmi populární, a to i díky tomu, že vzniklo mnoho výukových programů, ale i her (ostatně pro mnoho uživatelů se programovatelné kalkulačky staly prvním „počítačem“, s nímž se kdy setkali). Mimochodem – tyto kalkulačky používaly RPN, podobně jako je tomu u mnoha modelů HP.

6. Série HP 10c

Popis způsobu programování si ukážeme na sérii HP 10c, která je dodnes populární, a to do té míry, že se vyrábí klony těchto kalkulaček, protože HP příliš nemá zájem o udržování svého portfolia (až na jednu výjimku). V sérii HP 10c vzniklo pět základních modelů:

Model Popis
HP-10c vědeckotechnická kalkulačka – základní model
HP-11c vědeckotechnická kalkulačka – střední model
HP-12c kalkulačka nabízející složitější algoritmy pro obchodníky, burzu, hypotéky atd.
HP-15c vědeckotechnická kalkulačka – nejvyšší model
HP-16c programátorská kalkulačka s převody mezi soustavami

Zajímavé je, že model HP-12c se vyrábí dodnes – a to od roku 1981!

7. Programování na kalkulačkách série HP 10c

Programování se na všech kalkulačkách série HP 10c provádí stejným způsobem, ovšem možnosti jednotlivých modelů se od sebe odlišují, protože některé instrukce jsou dostupné jen v konkrétních modelech. Obecně platí, že HP-12c je vybavena nejméně instrukcemi a naopak HP-15c má instrukcí nejvíce. Všechny instrukce jsou zaznamenány formou kódu stisknuté klávesy popř. kombinací dvou či tří kláves. Kód klávesy se zjišťuje jednoduše – pro numerické klávesy se kód rovná přímo cifře (0==0 atd.), pro ostatní klávesy se její kód získá z pozice klávesy na klávesnici. Například klávesa RCL je ve čtvrté řadě na páté pozici, tudíž je její kód 45. Klávesy +, -, × a ÷ jsou v desáté řadě, která se kóduje jako 0, tj. ÷ má kód 10, × má kód 20, – má kód 30 a + má kód 40.

Obrázek 2: Rozmístění kláves na kalkulačce HP-12c: čtyři řady po deseti klávesách.

Samotný program se zaznamenává stiskem příslušných kláves, takže kalkulačky neobsahují žádný parser a vlastně ani žádnou kontrolu validity kódu. Při programování se využívá pět speciálních klávesových kombinací:

Klávesa Význam
P/R Program/Run – přepínání režimu programování/běhu
R/S Run/Stop – umožňuje kdykoli zastavit a znovuspustit program
MEM Memory – zobrazí využití paměti (počet zaznamenaných kroků)
SST Single Step – krokování popř. přechod na další příkaz
BST Back Step – přechod na předchozí příkaz

8. Základní příkazy zadávané z klávesnice

Při programování lze využít dvacet registrů dostupných přes klávesy STO (store) a RCL (recall) a taktéž několik zásobníkových operací, především pak x<>y (swap), R↓ (roll down, funguje i jako drop) a samozřejmě Enter (dup).

Jak jsme si již řekli v předchozí kapitole, jsou programy přímo „ťukány“ na klávesnici, stejně jako běžné výpočty. Ovšem některé příkazy mají smysl jen při programování:

Příkaz Význam
PSE pozastaví program na jednu sekundu a zobrazí mezivýsledek (vrchol zásobníku)
GTO skok na příkaz xyz, kde xyz je trojmístné číslo různé od 000
GTO 000 konec programu (END)
x<=y pokud je prvek na vrcholu zásobníku menší nebo roven druhému prvku, provede se další instrukce
x=0 pokud je prvek na vrcholu zásobníku nulový, provede se další instrukce, jinak se tato instrukce přeskočí

S využitím kombinace GTO, x<=y a x=0 lze implementovat jak programové smyčky, tak i rozeskoky na základě podmínky.

A to je vše! Programátoři musí vystačit pouze se zásobníkem s hloubkou čtyř prvků, dvaceti pracovními registry, třemi operacemi nad zásobníkem, dvěma podmínkami a nepodmíněným skokem. To kupodivu stačí i na složitější programy a výpočty.

Složitější program naleznete zde: http://www.rskey.org/hp11c.

9. Jednoduchá nekonečná smyčka od 0 do (téměř) nekonečna

Podívejme se nyní na způsob naprogramování jednoduché nekonečné smyčky, která bude postupně s jednosekundovou pauzou zobrazovat číselnou řadu 0, 1, 2, … Samotný program je velmi jednoduchý a předpokládá, že na zásobníku bude na začátku uložena alespoň jedna nula (pokud tam bude jiné číslo, bude smyčka začínat na této hodnotě). Ve smyčce se postupně hodnota na zásobníku zvýší o jedničku operací 1 +, následně se výsledek zobrazí uživateli po dobu jedné sekundy příkazem PSE (pause) a posléze se příkazem GTO (goto) skočí zpět na první instrukci:

Návěští Shift Klávesa Číslo Cíl Poznámka
001     1   vložení konstanty 1 na zásobník
002   +     přičtení jedničky k předchozí hodnotě
003 g PSE     pauza 1sec na zobrazení výsledků uživateli
004 g GTO   001 skok na začátek smyčky

Program uvedený v tabulce je relativně dobře čitelný, ovšem programátor na displeji uvidí pouze následující řádky odpovídající kódům kláves (43=čtvrtá řada, třetí klávesa zleva), zadaným číslům (1) a cílům skoku (001):

001,        1
002,       40
003,    43 31
004,43,33,001

Povšimněte si toho, že se všechny číslice bez problémů vejdou na LCD s deseti znaky, čárky jsou totiž umístěny mezi čísly, nejedná se o plnohodnotné znaky)

10. Počítaná smyčka od n do 0

Zkusme si napsat složitější program, který nyní bude obsahovat počítanou smyčku od n (tato hodnota bude uložena na zásobníku před spuštěním programu) do nuly. Zde již nevystačíme s pouhým příkazem GTO pro nepodmíněný skok, ale musíme provést test na nulu s tím, že se v případě rovnosti x==0 provede instrukce ihned za testem a v případě nerovnosti se tato instrukce přeskočí:

Návěští Shift Klávesa Číslo Cíl Poznámka
001     1   vložení jedničky na zásobník
002       odečtení této jedničky od původní hodnoty
003 g PSE     pauza 1sec na zobrazení výsledků uživateli
004 g x=0     test, zda je výsledek nulový
005 g GTO   000 podmínka splněna: cíl 000=konec programu
006 g GTO   001 skok na začátek smyčky

Podobně jako v předchozím příkladu, i zde uživatel při editaci programu na displeji uvidí pouze následující sekvenci numerických hodnot:

001,        1
002,       30
003,    43 31
004,    43 35
005,43,33,000
006,43,33,001

11. Výpočet faktoriálu

Posledním příkladem, který si dnes ukážeme, je výpočet faktoriálu, a to opět na kalkulačce HP 12c vybavené RPN a jen základními programovacími schopnostmi (mimochodem – jedná se o nejdéle laděný výpočet faktoriálu, který jsem zatím vytvořil, i assembler je mnohem jednodušší :-).

Návěští Shift Klávesa Číslo Cíl Poznámka
001   STO 0   uložení n do registru číslo 0
002     1   uložení jedničky (mezivýsledku) na zásobník
003   RCL 0   uložení n na zásobník z registru číslo 0
004   ×     výpočet: n×mezivýsledek
005     1   uložení jedničky na zásobník
006   STO – 0   odečtení této jedničky on n (to je v registru 0)
007   R↓     odstranění pomocného mezivýsledku
008 g PSE     pauza 1sec na zobrazení mezivýsledků uživateli
009   RCL 0   uložení n na zásobník z registru číslo 0
010 g x=0     test, zda je n nulové
011 g GTO   000 podmínka splněna: cíl 000=konec programu
012 g GTO   004 další výpočet, tentokrát n-1×mezivýsledek

Po dokončení programu je možné si aktuální výsledek zobrazit klávesou R↓.

Poznámka: největší faktoriál, pro nějž dává výpočet smysl, je pro n=69. V tomto případě je vhodné vynechat osmou instrukci, jinak bude výpočet trvat poměrně dlouho (minutu a cca 20 sekund).

Stejně jako v obou předchozích příkladech se uživatel při programování musí smířit se zobrazením sekvence číslic:

001,     44 0
002,        1
003,     45 0
004,       20
005,        1
006,44   30 0
007,       33
008,    43 31
009,     45 0
010,    43 35
011,43,33,000
012,43,33,004

To už se pomalu blížíme i ke slavnému Brainfucku… :-)

12. Odkazy na Internetu

  1. Comparison of Texas Instruments graphing calculat
    https://en.wikipedia.org/wi­ki/Comparison_of_Texas_In­struments_graphing_calcula­tors
  2. Keystroke Programming
    https://en.wikipedia.org/wi­ki/Keystroke_programming
  3. The Museum of HP Calculators
    http://hpmuseum.org/
  4. HP 9100
    http://www.hpmuseum.org/hp9100.htm
  5. TI calculators
    http://www.ticalc.org/
  6. Programmable calculator
    https://en.wikipedia.org/wi­ki/Programmable_calculator
  7. Elektronika MK-52
    https://en.wikipedia.org/wi­ki/Elektronika_MK-52
  8. Casio FX-502P emulator
    http://sim41.webcindario.com/sim502­.htm
  9. Casio FX-502P series
    https://en.wikipedia.org/wiki/Casio_FX-502P_series
  10. Elektronika MK-61
    https://en.wikipedia.org/wi­ki/Elektronika_MK-61
  11. Chinese BASIC
    https://en.wikipedia.org/wi­ki/Chinese_BASIC
  12. Boolfuck
    http://samuelhughes.com/boof/
  13. Smallfuck
    http://esolangs.org/wiki/Smallfuck
  14. BitChanger
    http://esolangs.org/wiki/BitChanger
  15. Programming Puzzles & Code Golf – Interpret ///
    http://codegolf.stackexchan­ge.com/questions/37014/in­terpret-pronounced-slashes
  16. Reg Xy
    http://c2.com/cgi/wiki?RegXy
  17. Queue (abstract data type)
    https://en.wikipedia.org/wi­ki/Queue_%28abstract_data_ty­pe%29
  18. Register Machine
    https://en.wikipedia.org/wi­ki/Register_machine
  19. Fueue
    http://esolangs.org/wiki/Fueue
  20. ///
    http://esolangs.org/wiki////
  21. Esolang, the esoteric programming languages wiki
    https://esolangs.org/wiki/Main_Page
  22. Esoteric Topics in Computer Programming
    http://web.archive.org/web/20020609152409/www­.catseye.mb.ca/esoteric/in­dex.html
  23. Programming Languages designed by Wouter von Oortmerssen
    http://strlen.com/programming-languages
  24. Two-dimensional languages
    https://esolangs.org/wiki/Category:Two-dimensional_languages
  25. Piet (homepage)
    http://www.dangermouse.net/e­soteric/piet.html
  26. Piet (na Esolang)
    https://esolangs.org/wiki/Piet
  27. Piet IDE
    http://www.rapapaing.com/blog/?pa­ge_id=6
  28. JSFuck (homepage)
    http://www.jsfuck.com/
  29. JSFuck (na Esolang)
    https://esolangs.org/wiki/JSFuck
  30. JSFuck (na Wikipedii)
    https://en.wikipedia.org/wiki/JSFuck
  31. Malbolge (na Esolang)
    https://esolangs.org/wiki/Malbolge
  32. Malbolge (na Wikipedii)
    https://en.wikipedia.org/wi­ki/Malbolge
  33. Befunge (na Esolang)
    https://esolangs.org/wiki/Befunge
  34. Befunge (na Wikipedii)
    https://en.wikipedia.org/wiki/Befunge
  35. Minifuck
    https://esolangs.org/wiki/Minifuck
  36. XMLfuck
    https://esolangs.org/wiki/XMLfuck
  37. The False Programming Language
    http://strlen.com/false-language
  38. The FALSE Programming Language Manual
    http://strlen.com/false/false.txt
  39. Wouter van Oortmerssen
    http://esolangs.org/wiki/Wou­ter_van_Oortmerssen
  40. dc (computer program)
    https://en.wikipedia.org/wi­ki/Dc_%28computer_program%29
  41. dc (na Esolang)
    http://esolangs.org/wiki/Dc
  42. Whitespace – tutorial
    http://compsoc.dur.ac.uk/whi­tespace/tutorial.html
  43. Programovací jazyk Forth a zásobníkové procesory
    http://www.root.cz/clanky/programovaci-jazyk-forth-a-zasobnikove-procesory/
  44. Seriál Programovací jazyk Forth
    http://www.root.cz/serialy/pro­gramovaci-jazyk-forth/
  45. Programovací jazyk Factor
    http://www.root.cz/clanky/programovaci-jazyk-factor/
  46. Grafický metaformát PostScript
    http://www.root.cz/clanky/graficky-metaformat-postscript/

Autor článku

Pavel Tišnovský vystudoval VUT FIT a v současné době pracuje ve společnosti Red Hat, kde vyvíjí nástroje pro OpenShift.io.