Programovací jazyky z vývojářského pekla (dokončení)

Pavel Tišnovský 17. 5. 2016

Ve čtvrté a poslední části článku o esoterických jazycích si nejdříve popíšeme jazyky založené na principu Turingova stroje, jehož páska obsahuje pouze binární symboly.

Obsah

1. Programovací jazyky z vývojářského pekla (dokončení)

2. Boolfuck

3. Smallfuck

4. BitChanger

5. URM – Universal Register Machine

6. Strojový kód

7. OISC – One instruction set computer

8. Proč se omezovat jen na angličtinu?

9. DSSP

10. Lingua::Romana::Perligata

11. Rapira

12. Fjölnir

13. Chinese BASIC a Chinese Python

14. Odkazy na Internetu

1. Programovací jazyky z vývojářského pekla (dokončení)

V dnešním článku si popíšeme tři skupiny esoterických (nebo jinak „šílených“) programovacích jazyků. První skupinu jazyků, se kterou se v dnešním článku alespoň ve stručnosti seznámíme, tvoří jazyky, které jsou založeny na principu Turingova stroje. S takovými jazyky už jsme se několikrát seznámili, ovšem dnešní skupina esoterických jazyků se odlišuje tím, že se namísto celočíselných symbolů na pásku Turingova stroje mohou ukládat pouze binární symboly 0 a 1. To s sebou samozřejmě přináší i nutné změny v množině příkazů a odlišný přístup k vytváření algoritmů. Mezi tyto jazyky patří Boolfuck, Smallfuck a BitChanger. Ve skupině druhé pak nalezneme spíše virtuální stroje programované buď přímo ve strojovém kódu nebo v jednoduchém assembleru. Třetí skupinu pak tvoří ty programovací jazyky, které nejsou založeny na angličtině, ale na jiných mluvených jazycích a popř. i abecedách odlišných od latinky. Sem spadají například DSPP, Lingua::Romana::Perligata, Rapira, Fjölnir či Chinese BASIC.

2. Boolfuck

Weaker, less useful, more futile: Boolfuck.

Prvním programovacím jazykem, s nímž se dnes seznámíme, je jazyk nazvaný Boolfuck. Jak již název tohoto jazyka napovídá, jedná se o další z mnoha variant Brainfucku. Zatímco však Brainfuck pracoval na principu simulace Turingova stroje s páskou, na níž bylo možné ukládat symboly odpovídající (většinou) celočíselným hodnotám 0 až 255, je tomu u jazyka Boolfuck jinak – zde se pracuje pouze s binárními symboly 0 a 1, což znamená, že pásku Turingova stroje tvoří řetězec nul a jedniček. Tyto změny vedly i ke změnám v příkazech jazyka, například operace pro čtení pracuje s jednotlivými bity (omezení vstupu, celý znak je zapotřebí načíst osmi operacemi), operace pro výstup (zapisuje se středníkem namísto tečky) postupně tvoří výstupní proud složených z nul a jedniček, které se skládají do znakového výstupu. Taktéž se změnily dostupné operace, protože se namísto přičtení a odečtení jedničky pouze mění hodnota bitu:

# Příkaz Význam znaku/příkazu
1 > posun ukazatele na „pásce“ doprava na další políčko
2 < posun ukazatele na „pásce“ doleva na předchozí políčko
3 + změna bitu (negace 0→1, 1→0)
4 , načtení bitu a uložení jeho hodnoty do aktuálního políčka
5 ; obsah aktuálního políčka se vloží do výstupního proudu, v němž jsou skládány osmibitové znaky
6 [ v případě, že je hodnota v aktuálním políčku nulová, přesune se program za odpovídající ]
7 ] řízení se přesune na odpovídající [

Ukažme si demonstrační příklad naprogramovaný v Boolfucku. Jedná se o klasický „Hello, world!“, který je nutné přepsat následujícím způsobem (jedná se o optimalizaci, manipulace s binárními symboly je mnohdy výhodnější, než se snažit získat kódy písmen operacemi + a -):

;;;+;+;;+;+;
+;+;+;+;;+;;+;
;;+;;+;+;;+;
;;+;;+;+;;+;
+;;;;+;+;;+;
;;+;;+;+;+;;
;;;;;+;+;;
+;;;+;+;;;+;
+;;;;+;+;;+;
;+;+;;+;;;+;
;;+;;+;+;;+;
;;+;+;;+;;+;
+;+;;;;+;+;;
;+;+;+;

Autor tohoto jazyka uvádí i převodní tabulku mezi Brainfuckem a Boolfuckem (bez jakýchkoli optimalizací):

Příkaz v Brainfucku Příkaz v Boolfucku
+ >[>]+<[+<]>>>>>>>>>[+]<<<<<<<<<
>>>>>>>>>+<<<<<<<<+[>+]<[­<]>>>>>>>>>[+]<<<<<<<<<
< <<<<<<<<<
> >>>>>>>>>
, >,>,>,>,>,>,>,>,<<<<<<<<
. >;>;>;>;>;>;>;>;<<<<<<<<
[ >>>>>>>>>+<<<<<<<<+[>+]<[­<]>>>>>>>>>[+<<<<<<<<[>]+<[+<]
] >>>>>>>>>+<<<<<<<<+[>+]<[­<]>>>>>>>>>]<[+<]

3. Smallfuck

Jazyk nazvaný Smallfuck je v mnoha ohledech podobný výše zmíněnému Boolfucku, takže popis budeme moci zkrátit. Ve Smallfucku nenalezneme žádné příkazy pro vstup a výstup dat, a to z toho důvodu, že se jedná o testovací jazyk, který měl být překládán do dalšího esoterického jazyku nazvaného SMETANA (Self-Modifying Extremely Tiny AutomatoN Application). Další (jen malou) změnou je záměna příkazu + za příkaz * (i když + bylo logičtější):

# Příkaz Význam znaku/příkazu
1 > posun ukazatele na „pásce“ doprava na další políčko
2 < posun ukazatele na „pásce“ doleva na předchozí políčko
3 * změna bitu (negace 0→1, 1→0)
4 [ v případě, že je hodnota v aktuálním políčku nulová, přesune se program za odpovídající ]
5 ] řízení se přesune na odpovídající [

4. BitChanger

Posledním esoterickým (a současně i dostatečně šíleným) programovacím jazykem založeným na principu Turingova stroje s páskou obsahující pouze binární symboly je jazyk nazvaný příznačně BitChanger. I tento jazyk ideově vychází ze slavného Brainfucku, ovšem počet instrukcí se zde snižuje na pouhé čtyři příkazy, které jsou vypsány v následující tabulce:

# Příkaz Význam znaku/příkazu
1 < posun ukazatele na „pásce“ doleva na předchozí políčko
2 } kombinace příkazu > a negace bitu
3 [ v případě, že je hodnota v aktuálním políčku nulová, přesune se program za odpovídající ]
4 ] řízení se přesune na odpovídající [

Zdánlivě chybějící příkaz > je možné nahradit sekvencí „}<}“, protože tato sekvence posune ukazatel doprava na další políčko, poté provede inverzi tohoto políčka (bitu), vrátí se zpět doleva a znovu se posune doprava s inverzí. Ve výsledku se tedy ukazatel pouze přesune doprava, protože dvojí inverze stejného bitu nevede k žádné změně na binární pásce.

Zdánlivě chybějící příkazy pro čtení a zápis (respektive pro práci se standardním vstupem a výstupem) jsou nahrazeny tím, že prvních několik bitů na binární pásce Turingova stroje má speciální význam. Tyto bity si můžeme představit jako SFR (registry speciálních funkcí) v mikrořadičích:

Políčko na pásce Význam
5 pokud je nastaveno na jedničku, jsou povoleny operace vstupu a výstupu
6 po operaci vstupu (čtení dat) je zde 0 pro platný znak a 1 pro EOF
7 řízení směru toku dat: 0=vstup, 1=výstup
8–15 osm bitů pro zápis či přečtení celého ASCII znaku (+ nejvyššího bitu mimo ASCII)

Výsledkem je tedy esoterický jazyk s velmi originální sadou příkazů, u nějž je opět možné najít korespondenci (mapování) mezi příkazy Brainfucku a BitChangeru.

5. URM – Universal Register Machine

O Turingově stroji jakožto teoretickém konceptu, na němž jsou některé esoterické programovací jazyky založeny, jsme se již hned několikrát zmiňovali. Ovšem kromě tohoto konceptu existují i koncepty takzvaných registrových strojů (https://en.wikipedia.org/wi­ki/Register_machine). Pokud máte nainstalovaný balíček vim-enhanced, máte interpret jednoho takového stroje k dispozici ve formě Vimovských maker navázaných na určité klávesy. Celý interpret je tvořen pouhými pěti řádky (viz $VIMRUNIME/macror/urm/urm.vim, čitelnost pravda poněkud utrpěla, což ovšem dobře zapadá do konceptu tohoto článku):

map * 1G/INIT^V^Mj"iT@i1G/INIT^V^MdG
map g 1G/^[(as;.]^V^Mi^V^M>,^V^[mkkmw@k
map T y$
map F yl
map = 'kf,

Důležité je především první mapování (klávesa *), protože touto klávesou se celý interpret inicializuje a druhou zkratkou g se spustí nad textem uloženým v aktuálním bufferu. A jak vlastně vypadá zdrojový text zpracovávaný tímto interpretrem? První řádky (může jich být prakticky libovolný počet) začínají znakem >. Ihned za tímto znakem je uloženo číslo. Tyto řádky obsahují stav registrů při spuštění interpretru, tj. počáteční stav a současně se tyto řádky přepisují při interpretaci, takže ihned můžete vidět výsledek nějaké operace. První registr má index 1, ne 0 (to je však v podstatě jedno). Za těmito řádky již začínají vlastní příkazy, které mohou být tvaru:

# Příkaz Význam
1 a[n] zvýšení obsahu registru n o jedničku
2 s[n] snížení obsahu registru n o jedničku
3 x;y spojení příkazů x a y, nejprve se provede příkaz x, potom příkaz y
4 (x)n dokud je registr n nenulový, provádí se příkaz x (smyčka typu while)
5 . ukončení interpretru

Po zkušenostech s Brainfuckem vás asi nepřekvapí, že i tak základní operace, jakou je kopie hodnoty z registru do jiného registru či součet obsahů dvou registrů, musí být implementovány nějakou formou smyčky:

Vynulování registru číslo 42:

(s42)42.

Hodnota z registru číslo 3 se přičte k obsahu registru číslo 2 a současně se registru číslo 3 vynuluje:

(a2;s3)3.

Kopie je už mnohem složitější, a to proto, že nejdříve provedeme operaci a1=a2, a3=a2, a2=0 a poté operaci a2+=a1 (obnovení původní hodnoty). Předpokladem je, že na začátku je a1=0 a a3=0:

(a1;a3;s2)2; (a2;s1)1.

Násobení a2=a2*a3 (registry a4 a a5 plní pomocnou funkci):

(a4;a5;s2)2; ((a2;s4)4; s3; (a1;a4;s5)5; (a5;s1)1)3.

Dělení na závěr (celý program má být na jednom řádku):

(a9;s2)2; (a2;a10;s3)3; (a3;s2)2; (a2;(s3)3)3; a3;
(s3;s2)2; (s3;a2)3; (a2)2;(a2;s9)9;(a3;s10)10;
(a9;a10;s2)2; (a11;a12;s3)3; (a2;s12)12; (a3;s9)9;
(s2;s3)3; (a3;s2)2; (a2;(s3)3)3; a3; (s3;s2)2;
(s3;a2)3; (a1;s2)2; (a2;s10)10; (a3;s11)11;
((a12;a13;s3)3; (a3;s13)13; (s2;s3)3; (a3;s12)12;
a14; (s1)1; (a9;a10;s2)2; (a11;a12;s3)3; (a2;s12)12;
(a3;s9)9; (s2;s3)3; (a3;s2)2; (a2;(s3)3)3; a3;
(s3;s2)2; (s3;a2)3; (a1;s2)2; (a2;s10)10; (a3;s11)11)1;
(s2)2; (a2;s14)14.

6. Strojový kód

Existuje hned celá řada návrhů procesorů s „esoterickým“ (čti: dostatečně šíleným) strojovým kódem resp. přesněji řečeno se šílenou instrukční sadou. Typicky se jedná o instrukční sady, v nichž je počet instrukcí snížen na nejnutnější minimum, což je v přímém kontrastu například s instrukční sadou procesorů řady x86. A jaký je vlastně minimální počet instrukcí, které ještě dávají smysl? Některé mikrořadiče se spokojí přibližně s 35 instrukcemi (PIC s 12bitovými instrukcemi), ovšem to samozřejmě ještě není nejmenší číslo. Zajímavý je návrh instrukční sady procesoru nazvaného jednoduše „Viktor's amazing 4-bit processor“. Tento procesor obsahuje pouze šestnáct instrukcí, které pravděpodobně budou srozumitelné všem čtenářům, kteří někdy pracovali v assembleru (u některých typů procesorů se pouze podmíněné skoky mění na podmíněné větvení, tedy branch):

# Instrukce Význam
1 CLF vymazání příznaků
2 AND bitová operace AND, nastavení příznaku zero
3 OR bitová operace OR, nastavení příznaku zero
4 ADD součet akumulátoru s operandem (konstantou)
5 SUB součet akumulátoru s negací operandu (konstantou)
6 CMP porovnání akumulátoru s operandem (konstantou)
7 ROL rotace akumulátoru (+ carry) doleva
8 ROR rotace akumulátoru (+ carry) doprava
9 LDA načtení hodnotu z absolutní adresy a uložení do akumulátoru
10 STA uložení akumulátoru na zadanou absolutní adresu
11 JMP nepodmíněný skok na zadanou adresu
12 JNZ podmíněný skok při zero==0
13 JNC podmíněný skok při carry==0
14 JND podmíněný skok na základě polohy přepínače (či tlačítka) na panelu
15 SPC hodnota čítače instrukcí se uloží do paměti na absolutní adresu
16 HLT ukončení programu

Povšimněte si, že se jedná o akumulátorový CPU, v němž je většinou druhým operandem pouhá konstanta. Relativní skoky či skoky do podprogramu se musí řešit nepřímo kombinací instrukcí SPC a JMP, podobně jako pokročilejší adresovací režimy.

7. OISC – One instruction set computer

Zajímavým konceptem jsou instrukční kódy s jedinou instrukcí, což vlastně znamená, že vůbec není zapotřebí ukládat operační kód instrukce, ale pouze adresu (adresy) operandu (operandů). Příkladem může být univerzální instrukce SBNZ neboli „Subtract and branch if not equal to zero“. Tato instrukce má čtyři operandy – první dva operandy obsahují adresy dvou míst v paměti, které se od sebe odečtou; třetí operand obsahuje adresu, kam se uloží výsledek a konečně operand čtvrtý obsahuje adresu další instrukce v případě, že je výsledek rozdílu nenulový. Pokud je výsledek nulový, pokračuje program v následující instrukci. Dalším příkladem univerzální instrukce je SUBLEQ neboli „Subtract and branch if less than or equal to zero“, která se odlišuje tím, že má pouze tři operandy: adresu prvního čísla, adresu čísla druhého (a současně adresu výsledku) a adresu další instrukce v případě, že je podmínka splněna. Jak se dají implementovat další instrukce s využitím SUBLEQ ukazují následující příklady:

JMP c
subleq Z, Z, c
 
ADD a, b
subleq a, Z
subleq Z, b
subleq Z, Z
 
MOV a, b 
subleq b, b
subleq a, Z
subleq Z, b
subleq Z, Z

atd.

8. Proč se omezovat jen na angličtinu?

Pravděpodobně každý vývojář si alespoň jednou položil otázku, jestli je angličtina skutečně tím jediným a nejlepším jazykem pro zápis programů, resp. přesněji řečeno pro zápis klíčových slov. Už od dob FORTRANu se totiž v programování používají klíčová slova typu IF, DO, oblíbené GOTO/GO TO, CONTINUE atd. Samozřejmě však vzniklo mnoho jazyků s národními variantami příkazů. Někteří čtenáři si možná pamatují na českou verzi jazyka Karel (což i přes jméno není původní tuzemský jazyk) s příkazy KROK, VLEVOVBOK, POLOZ, ZVEDNI apod. Na Slovensku později vznikl jazyk pojmenovaný Robot Karol++ a později Robot Emil (takový předchůdce Minecraftu :-) s příkazy, které naleznete na této stránce: http://www.emil.input.sk/info_sk.htm. Avšak zajímavější a šílenější jsou další jazyky, které si popíšeme v navazujících kapitolách. Mým osobním favoritem je Fjölnir.

9. DSSP

DSSP was not invented. It was found. That is why DSSP has not versions, but only extensions. Forth is created by practice. DSSP is created by theory.

Velmi zajímavý je průzkum programovacích jazyků používaných v bývalém Sovětském Svazu. Některé z používaných jazyků byly částečně či úplně převzaty ze západních zemí, ovšem v SSSR vzniklo i poměrně mnoho originálních (a minimálně v jednom případě i elegantních) programovacích jazyků. Z převzatých technologií se jedná především o FORTRAN (první vyšší programovací jazyk vyvinutý firmou IBM, ale později používaný i v zemích RVHP, především v souvislosti s vývojem počítačů kompatibilních s mainframy firmy IBM), COBOL (v azbuce zapisovaný Кобол) a taktéž ALGOL (Алгол, využitý například na počítačích Elbrus a Odra), popř. jeho varianta pojmenovaná Алгэк, která byla jakýmsi hybridem mezi COBOLem a originálním ALGOLem. Ovšem v Sovětském Svazu se používaly i mnohé další programovací jazyky. Mezi ně patří i originální Sovětský programovací jazyk nazvaný DSSP, který byl původně vyvinut pro tvorbu aplikací „trojkovém“ počítači Setuň (Сетунь), ale později se z různých důvodů rozšířil i na mnohé další platformy, například i na třicetidvoubitové osobní počítače PC.

Z instrukčního kódu počítače Setuň (pracujícího z dnešního pohledu velmi netradičně ve vyvážené trojkové soustavě namísto dnes obvyklé soustavy binární) byl na začátku osmdesátých let minulého století odvozen vyšší programovací jazyk nazvaný (v překladu) DSSP neboli Dialog System for Structured Programming. Některé syntaktické i sémantické konstrukce, které můžeme v tomto programovacím jazyku nalézt, pochází z programovacího jazyka Forth Chucka Moorea, ovšem tvůrci DSSP se při návrhu tohoto jazyka, na rozdíl od Forthu, poměrně striktně drželi hesla: „One word of text – One word of machine code“ (jde samozřejmě o slovní hříčku, neboť termín „slovo“ má v tomto hesle dva odlišné významy). To zjednodušeně řečeno znamená, že téměř každé klíčové slovo či speciální znak se přímo překládá do jednoho operačního kódu uloženého v operační paměti v jednom slově, což je v případě počítače Setuň n-tice tritů (nikoli bitů). V následujících odstavcích si velmi stručně popíšeme některé základní konstrukce, ze kterých se programy vytvářené v programovacím jazyce DSSP skládají.

Oba výše zmíněné programovací jazyky, tj. jak „východní“ DSSP, tak i „západní“ Forth, jsou založeny na použití dvou zásobníků. První z těchto zásobníků se nazývá zásobník operandů, druhý zásobník návratových adres. Většina matematických operací je prováděna buď s jedním operandem (uloženým na vrcholu zásobníku operandů, což je místo označované zkratkou TOS neboli Top Of Stack) nebo s dvojicí operandů (první je uložený v TOS, druhý těsně pod prvním operandem). Funkce zásobníku návratových adres je zřejmá – obsahuje adresy, na které se má řízení programu vrátit při opuštění právě prováděné funkce. Ukažme si, jakým způsobem lze v programovacím jazyku DSSP vytvářet nová slova. Nově definované slovo (funkce) vždy začíná znakem : (tím se interpret jazyka přepne do režimu překladu) a končí znakem ;, který se překládá na instrukci RETURN:

( toto slovo očekává na zásobníku operandů dvě hodnoty, které sečte a výsledek uloží do TOS )
: soucet + ;
 
( slovo C má v DSSP stejný význam jako slovo DUP ve Forthu - zduplikuje hodnotu v TOS )
( nejprve se tedy nějaká hodnota X zkopíruje, takže zásobník obsahuje dvojici X X )
( posléze se oba shodné operandy vynásobí a výsledek je uložen zpět na vrchol zásobníku )
: mocnina C * ;
 
( vynulování proměnné X )
( ve Forthu by se toto slovo zapsalo jako 0 X ! ovšem syntaxe DSSP je odlišná)
: clear_x !0 X ;

Programovací jazyky DSSP a Forth se i přes mnohé společné prvky v několika oblastech odlišují. Týká se to především konstrukce podmínek a programových smyček, ale i některých základních slov, z nichž některé jsou v obou jazycích odlišné. Autoři jazyka DSSP evidentně dávali přednost kratšímu zápisu základních slov, tj. slov (funkcí) implementovaných přímo v jádru jazyka. Ovšem v případě potřeby většinou není velkým problémem si vytvořit slova, jež mají stejný význam jako slova základní. V jazyce DSSP je například možné vytvořit slovo DUP s využitím základního slova C (pravděpodobně se jedná o zkratku ze slova „copy“) následujícím způsobem – : DUP C ;. V tabulce zobrazené pod tímto odstavcem jsou pro ilustraci vypsána některá slova, která jsou v obou programovacích jazycích rozdílná:

DSSP Forth Význam slova
D DROP odstranění operandu z vrcholu zásobníku
C DUP duplikace (kopie) operandu ležícího na vrcholu zásobníku
. DUP . tisk operandu ležícího na vrcholu zásobníku bez jeho odstranění
DD 2DROP odstranění dvou operandů ze zásobníku
SP SPACE vložení ASCII znaku mezery na zásobník operandů

Programovací jazyky DSSP a Forth se kromě odlišných jmen některých základních slov (funkcí) navzájem liší i ve způsobu tvorby podmínek (podmíněných příkazů) a programových smyček. Zatímco jazyk Forth je v tomto ohledu jazykem na poněkud vyšší úrovni, protože jak základní podmínkový příkaz (if-else-then), tak i všechny podporované programové smyčky mohou ve svém těle obsahovat libovolné množství slov, včetně dalších smyček či podmínek, v jazyku DSSP se jeho tvůrci tvrdošíjně drželi svého hesla „One word of text – One word of machine code“, což mj. znamená, že se například v každé větvi podmíněného příkazu může vyskytovat pouze jedno slovo (tj. volání příkazů, které toto slovo představuje).

To je sice z hlediska tvorby aplikací poněkud nepříjemná vlastnost (je to podobné, jako by například v Céčku nebo Javě nebylo možné za příkazem if vytvořit blok pomocí složených závorek {}, ale bylo by povoleno uvést pouze jedno volání funkce či metody), ale je vhodné si uvědomit, že vytváření i volání slov v DSSP či Forthu je velmi jednoduché, dokonce s velikou pravděpodobností mnohem jednodušší, než v jakémkoli jiném programovacím jazyce. Druhá výhoda tohoto přístupu k tvorbě podmínek a programových smyček spočívá v tom, že se tyto příkazy dají přímo převést na instrukce procesoru. Pokud by bylo možné například v obou větvích podmíněného příkazu zapisovat libovolné množství příkazů (tj. programový blok), musel by se plný podmíněný příkaz převést na minimálně jeden podmíněný a jeden nepodmíněný skok.

Řídicí příkazy vypadají zajímavě, protože některé z nich obsahují rozeskok na tři příkazy (nikoli jen na dva). To samozřejmě plyne z toho, jakým způsobem je počítač Setuň implementován (třístavová logika):

Podmíněný příkaz Význam
IF+ A pokud je operátor ležící na TOS větší než 0, proveď slovo A
IF- A pokud je operátor ležící na TOS menší než 0, proveď slovo A
IF0 A pokud je operátor ležící na TOS nulový, proveď slovo A
BR+ A B pokud hodnota na TOS je větší než 0, proveď slovo A, jinak slovo B
BR- A B pokud hodnota na TOS je menší než 0, proveď slovo A, jinak slovo B
BR0 A B pokud je hodnota na TOS nulová, proveď slovo A, jinak slovo B
BRS A B C TOS záporné: proveď A, TOS nulové: proveď B, jinak proveď C

10. Lingua::Romana::Perligata

Uživatelé Perlu se možná již setkali se zajímavým modulem nazvaným Lingua::Romana::Perligata. V tomto modulu se původní „šum na lince“, kterým se mohou (ale nemusí) zapisovat programy v Perlu, mění na formu Latiny, přičemž nejde o pouhou náhradu klíčových slov, ale i takových konstrukcí, jakou je vytvoření pole, aritmetické operace apod. Například aritmetická operace součtu se zapisuje v závislosti na kontextu slovy adde, addentum či addementa, smyčka typu for-each začíná slovem per apod. Zajímavá jsou čísla – čísla do desíti je možné zapisovat buď slovy (unum, duodecem) nebo římskými číslicemi. U větších hodnot máme k dispozici jen druhý způsob. Vyjádřit lze i zlomky, například 3.141 = MMMCXLI Mimum a 0.25 = 1/4 = unum quartum, 3/10 = tres decimum. Asi nejzajímavější je indexování vícerozměrných polí:

$unimatrix[1][3][9][7];
septimum noni tertii primi unimatrixorum

Není to krása?

11. Rapira

Zajímavým programovacím jazykem je Rapira (Рапира), který se používal v Sovětském svazu při výuce programování, a to na různých typech počítačů, včetně počítačů s klony čipů 8086 a Z80. Rapira je odvozena od klasického strukturovaného jazyka ALGOL, s nímž má podobnou strukturu zápisu programů, ovšem všechna klíčová slova se původně zapisovala v azbuce a to v některých případech navíc ještě ve zkrácené formě. Uveďme si typický příklad – „Hello world“ v ruštině. Povšimněte si klíčových slov ПРОЦ (procedura), КНЦ (konec) a procedury ВЫВОД (výstup):

ПРОЦ СТАРТ()
    ВЫВОД: 'здравствуй, мир!!!'
КНЦ ПРОЦ

Interpret rozeznával například následující klíčová slova:

ВОЗВРАТ   ИНАЧЕ     ПРОЦ
ВСЕ       КНЦ       ФУН
ДО        ОТ        ШАГ
ИНАЧЕ     ЕСЛИ      ПОВТОР

Ukázka delšího programu (znalci azbuky pravděpodobně nebudou mít problém s pochopením):

12. Fjölnir

V roce 1980 vytvořil profesor Snorri Agnarsson programovací jazyk, který se měl používat při výuce na Islandské univerzitě. Tento jazyk se strukturou podobá klasickým jazykům typu Algol či Pascal, ovšem nejzajímavější je samozřejmě použití klíčových slov pocházejících z islandštiny. Kromě krátkých a celkem bezproblémových slov typu fyrir (for), ef (if) či þá (then) v tomto jazyku najdeme perly typu skrifastreng (println/puts), lykkjulok (pravděpodobně endfor) a stofnlok (endcase) i zápisy typu:

widgety

d:=st rstisameiginlegideilir(k 100,125)

popř.:

{
a.al ->
  stef(;)
  sta.v.r handfang:=opnaskr.(;vi.fang(;1),'l')
  innflutt t.k
  stofn
    handfang e.a handfang:=0,
    HefjaLesgreiningu(;handfang),
    t.k:=LesaLes(;),
    forrit(;),
    handfang=0 e.a lokaskr.(;handfang),
  stofnlok
}

13. Chinese BASIC

Kromě SSSR vlastní varianty programovacích jazyků vyvíjeli i v Číně. Příkladem může být Chinese BASIC pocházející z počátku osmdesátých let minulého století, tj. z období, kdy byl nějaký dialekt BASICu základním interpretrem pro většinu domácích mikropočítačů. Chinese BASIC vychází z ve své době populárního Applesoft BASICu, což je pro změnu varianta původního Microsoft BASICu upravená takovým způsobem, aby ji bylo možné použít na počítačích Apple II (kromě Applesoft BASICu však existoval i původní „Integer BASIC“ nahraný přímo do ROM, jak to ostatně bývalo zvykem). Chinese BASIC vlastně nahrazuje původní anglická klíčová slova (GOTO, IF, THEN, LET, FOR, NEXT atd.) čínskými „obrázkovými ekvivalenty.“ Struktura původního BASICu však zůstala zachována, včetně operátorů, závorek, čísel řádků apod. Proměnné a poznámky mohly být zapsány latinkou (ASCII) či pomocí čínských znaků, viz též https://en.wikipedia.org/wi­ki/Chinese_BASIC.

14. Odkazy na Internetu

  1. Chinese BASIC
    https://en.wikipedia.org/wi­ki/Chinese_BASIC
  2. Boolfuck
    http://samuelhughes.com/boof/
  3. Smallfuck
    http://esolangs.org/wiki/Smallfuck
  4. BitChanger
    http://esolangs.org/wiki/BitChanger
  5. Programming Puzzles & Code Golf – Interpret ///
    http://codegolf.stackexchan­ge.com/questions/37014/in­terpret-pronounced-slashes
  6. Reg Xy
    http://c2.com/cgi/wiki?RegXy
  7. Queue (abstract data type)
    https://en.wikipedia.org/wi­ki/Queue_%28abstract_data_ty­pe%29
  8. Register Machine
    https://en.wikipedia.org/wi­ki/Register_machine
  9. Fueue
    http://esolangs.org/wiki/Fueue
  10. ///
    http://esolangs.org/wiki////
  11. Esolang, the esoteric programming languages wiki
    https://esolangs.org/wiki/Main_Page
  12. Esoteric Topics in Computer Programming
    http://web.archive.org/web/20020609152409/www­.catseye.mb.ca/esoteric/in­dex.html
  13. Programming Languages designed by Wouter von Oortmerssen
    http://strlen.com/programming-languages
  14. Two-dimensional languages
    https://esolangs.org/wiki/Category:Two-dimensional_languages
  15. Piet (homepage)
    http://www.dangermouse.net/e­soteric/piet.html
  16. Piet (na Esolang)
    https://esolangs.org/wiki/Piet
  17. Piet IDE
    http://www.rapapaing.com/blog/?pa­ge_id=6
  18. JSFuck (homepage)
    http://www.jsfuck.com/
  19. JSFuck (na Esolang)
    https://esolangs.org/wiki/JSFuck
  20. JSFuck (na Wikipedii)
    https://en.wikipedia.org/wiki/JSFuck
  21. Malbolge (na Esolang)
    https://esolangs.org/wiki/Malbolge
  22. Malbolge (na Wikipedii)
    https://en.wikipedia.org/wi­ki/Malbolge
  23. Befunge (na Esolang)
    https://esolangs.org/wiki/Befunge
  24. Befunge (na Wikipedii)
    https://en.wikipedia.org/wiki/Befunge
  25. Minifuck
    https://esolangs.org/wiki/Minifuck
  26. XMLfuck
    https://esolangs.org/wiki/XMLfuck
  27. The False Programming Language
    http://strlen.com/false-language
  28. The FALSE Programming Language Manual
    http://strlen.com/false/false.txt
  29. Wouter van Oortmerssen
    http://esolangs.org/wiki/Wou­ter_van_Oortmerssen
  30. dc (computer program)
    https://en.wikipedia.org/wi­ki/Dc_%28computer_program%29
  31. dc (na Esolang)
    http://esolangs.org/wiki/Dc
  32. Whitespace – tutorial
    http://compsoc.dur.ac.uk/whi­tespace/tutorial.html
  33. Programovací jazyk Forth a zásobníkové procesory
    http://www.root.cz/clanky/programovaci-jazyk-forth-a-zasobnikove-procesory/
  34. Seriál Programovací jazyk Forth
    http://www.root.cz/serialy/pro­gramovaci-jazyk-forth/
  35. Programovací jazyk Factor
    http://www.root.cz/clanky/programovaci-jazyk-factor/
  36. Grafický metaformát PostScript
    http://www.root.cz/clanky/graficky-metaformat-postscript/
Našli jste v článku chybu?
Lupa.cz: Jak levné procesory změnily svět?

Jak levné procesory změnily svět?

120na80.cz: Pálení žáhy: která jídla ne a co nás uzdraví?

Pálení žáhy: která jídla ne a co nás uzdraví?

Vitalia.cz: Tesco nabízí desítky tun jídla zdarma

Tesco nabízí desítky tun jídla zdarma

Lupa.cz: Proč jsou firemní počítače pomalé?

Proč jsou firemní počítače pomalé?

Měšec.cz: TEST: Vyzkoušeli jsme pražské taxikáře

TEST: Vyzkoušeli jsme pražské taxikáře

DigiZone.cz: DVB-T2 ověřeno: seznam TV zveřejněn

DVB-T2 ověřeno: seznam TV zveřejněn

Vitalia.cz: Jak Ondra o astma přišel

Jak Ondra o astma přišel

DigiZone.cz: Funbox 4K v DVB-T2 má ostrý provoz

Funbox 4K v DVB-T2 má ostrý provoz

Podnikatel.cz: Letáky? Lidi zuří, ale ony stále fungují

Letáky? Lidi zuří, ale ony stále fungují

Podnikatel.cz: Udělali jsme velkou chybu, napsal Čupr

Udělali jsme velkou chybu, napsal Čupr

Lupa.cz: Patička e-mailu závazná jako vlastnoruční podpis?

Patička e-mailu závazná jako vlastnoruční podpis?

120na80.cz: Co je padesátkrát sladší než cukr?

Co je padesátkrát sladší než cukr?

Vitalia.cz: Pryč se zastaralým stravováním ve školách

Pryč se zastaralým stravováním ve školách

DigiZone.cz: Nova opět stahuje „milionáře“

Nova opět stahuje „milionáře“

DigiZone.cz: Numan Two: rozhlasový přijímač s CD

Numan Two: rozhlasový přijímač s CD

DigiZone.cz: Světový pohár v přímém přenosu na ČT

Světový pohár v přímém přenosu na ČT

Vitalia.cz: Tohle jsou nejlepší česká piva podle odborníků

Tohle jsou nejlepší česká piva podle odborníků

DigiZone.cz: Samsung EVO-S: novinka pro Skylink

Samsung EVO-S: novinka pro Skylink

Lupa.cz: Jak se prodává firma za miliardu?

Jak se prodává firma za miliardu?

Podnikatel.cz: Byla finanční manažerka, teď cvičí jógu

Byla finanční manažerka, teď cvičí jógu