Ez itt a Bitsy nevű script-nyelv bemutatásának harmadik része:
- A Bitsy nyelv aritmetikája az integerre korlátozódik. A Bitsy változói is csak 32 bites, előjeles integer értékeket tárolhatnak. A változók azonosítói, mint az már említve lett, az angol ABC "B" és "Z", valamint e kettő közötti betűi lehetnek.
A B C D E F G H I J K L M N O P QRS T U V W X Y Z
Ezek közül van egy, az "R", amely egy random számot generál, valahányszor az értéke kiolvasásra kerül. Az "R"-t írni is lehet (pl. R = 700). Ekkor állítódik be a véletlenszám generátor maximális értéke (700), tehát az az érték, amelynél nagyobbat az "R" nem fog szolgáltatni ha az értékét olvassák. Az "R" tehát egy véletlenszám generátor.
A PRN utasítással csak változók értékei írathatók ki. Számok nem, legalábbis, közvetlenül nem. Betűk, karakterek, szövegek pláne nem. Ráadásul, egy PRN utasítás mögött csak egy változó-azonosító állhat. Egy PRN, egy változó. Ha mondjuk azt szeretné a programozó látni a képernyőn, hogy 344, akkor azt így nem tudja megtenni, hogy:
PRN 344 vagy, hogy PRN "344" csak így:
C = 344 PRN C
Olykor azonban szükség lehet szövegek kiírására is. Ha az "R" után következő változó-azonosítók (S,T,U,V,W,X,Y,Z ) értékét akarjuk kiiratni a PRN (print) utasítással, akkor azt találjuk, hogy a változó értéke helyett egy karakter jelenik meg. Az alábbi kód
U = 65 PRN U V = U + 1 PRN V W = U + 2 PRN W
lefuttatása után három karakter, az "ABC" jelenik meg a képernyőn. Ez azért van, mert az "R" után lévő változó-azonosítók értékeit a PRN utasítás ASCII karakterként értelmezi és azok ennek megfelelően is kerülnek kiírásra. A PRN utasításnak ez az érdekes tulajdonsága teszi lehetővé, hogy, ha nehézkesen is, de szöveget, vagy speciális szimbólumot is írathassunk a kimenetre. Tehát, az "R" után következő változók, bár az értékeiken aritmetikai műveletek is végrehajthatók, a PRN utasítás esetén ASCII kódok tárolóiként fognak viselkedni. A Bitsy interpreterében az "S" és a "T" értéke előre van programozva. Az "S" a SPACE karakter (0x20h) a "T" pedig a NewLine karakter (0x10h) ASCII kódját tárolja az interpreter indításának pillanatában.
A következő részben az aritmetika mellett a Bitsy trace (TRC) lehetőségeiről fogok írni. Mert, igen, a Bitsy interpreterének 135 sorában ez is helyet kapott.
Köszönöm a kérdést. Remek meglátás. Jogos felvetés.
Valóban nem lenne nehéz kibővíteni az interpretert annyira, hogy tetszés szerinti változónevekkel dolgozhasson a programozó, de, tekintve, hogy 1. arra esély sincs, hogy ezt a nyelvet bárki komolyan vegye, 2. valamint, a nyelv ezotérikus jellegét* is hangsúlyozandó, 3. továbbá, mivel szempont volt az interpreter kódjának rövidsége is, ezért a legegyszerűbb megoldás nyert.
* Az ezoterikus nyelvek bővelkednek a körülményes, agyat terhelő, szellemi úttorlasz jellegű megoldásokban. Az egy karakteres változó-azonosítókkal ez az elvárás a Bitsy esetében is teljesül, hiszen, a Bitsy, ettől eltekintve, szolgaian követi a konzervatív programfejlesztés ABC-jét. Így azonban a változók azonosítóihoz fejben kell hozzárendelni azt a szerepet, amit a készülő programban betöltenek. Ugyanez' okból, eredendően még komment lehetőség sem volt, de ez végül egy barátom javaslatára, hosszas töprengés után helyet kapott az interpreterben, mivel, ennek okán annak forrása csak egyetlen sorral bővült.
Ezek szerint van már egy asszociatív tároló (hash) a címkék (labels) számára, tehát nem lenne nehéz egy másik hash-t csinálni a változóknak, hogy ne csak egybetűs változóneveket lehessen használni.
Ahogy igértem, folytatom is a Bitsy mint ezoterikus, Turing teljes és Turing tarpit programozási nyelv bemutatását.
A Bitsy jelmondata: A Bitsy kicsi, de erős. És ez alább be is bizonyosodik, vagy ha nem, legalább körvonalazódni látszik majd, reményeim szerint.
- A Bitsy nyelvben ú.n. komment sorok is létrehozhatók. A ; karakter utáni rész a sor végéig komment. Valahogy így:
; ez egy komment sor.
- A Bitsy nyelvben az alfabetikus karakterek CASE inszenzitívek, azaz, a kis- és nagybetűk között nincs jelentésbeli eltérés, az .ALMA ugyanazt jelenti mint az .ALma vagy az .almA. Az interpreter minden sort nagybetűsít.
- A Bitsy nyelv csak beépített változókat ismer. Ezeket deklarálni nem kell, de inicializálni igen. A változók azonosítói az angol ABC betűi, "B"-től kezdődően a "Z"-ig bezárólag. Az "A" betű fejlesztésre van fenntartva.
A bitsy egyéb jellegzetességei:
- A Bitsy nyelv interpreterére jellemző, hogy - akár maga a nyelv - rövid. Mindössze 135 sornyi kód az egész. Ebből következik, hogy az interpreter parsere sem túl szofisztikált. Annyira nem, hogy a parser elkivánja, hogy a futtatni óhajtott scriptekben a nyelvi elemek, mint kulcsszó, változó-azonosító, szám-literál, operátor vagy cimke, egy-egy szóköz karakterrel legyenek egymástól elválasztva. Ha ez az előfeltétel a beolvasott script valamelyik sorában nem teljesül, akkor a futás ott megszakad és az interpreter hibaüzenettel kilép.
Vállalkozó kedvűek persze írhatnak olyan interpretert, amely nem ilyen rigorózus, hanem rugalmasabb, megengedőbb az inputokkal (ezek a scriptek) szemben.
A Bitsy másik komoly sajátossága, hogy natív módon nem támogat semmiféle ciklust. Ha ilyesmit szeretnénk, akkor azt magunknak kell létrehoznunk, abból, amit ez a szűkszavú nyelv kínál. Na, hát, ilyen a cimke is, ami egyébként ebben a mini nyelvben egy módfelett univerzális eszköz. A cimkék formátuma egyedi. A kötelező karakter bennük a pont. Ez a cimkék nevében legelöl kell, hogy szerepeljen. Ezt követi maga a név, ami alfabetikus és aláhúzás karakterek kombinációjából állhat. A cimkék maximális hossza egyébként nincs meghatározva. Példa egy cimkére:
.LABEL_ONE
Na de, mi célt szolgál egy cimke? A Bitsy nyelvben elég sokat. Alapvetően egy-egy cimkével egy-egy kitüntetett sor dedikálható. Talán mondani sem kell, hogy egy cimke csak a script egyetlen sorát nevesítheti. A cimkéket az interpreter felismeri, azok nevét regisztrálja és annak a sornak a számát is, amelyet a cimkék jelölnek, amelyben előfordulnak. De, hogy a cimkék jelentőségét kellően árnyalni tudjam, ki kell térjek az "IF" kulcsszóra. Az "IF" kulcsszó és a mögötte álló két tagú szerkezet:
Az IF kulcsszó mögött kötelezően kell, hogy álljon egy logikai feltétel - ez az első tag - (alább pirossal), és ezt kell kövesse valamilyen utasítás (alább kékkel). Utóbbi lehet PRN (print) vagy JMP (jump), esetleg egy értékadás. Íme, itt a példa mindháromra (Fontos! a Bitsy "IF" szerkezetében nincs sem "THEN" sem "ELSE"):
IF B + CPRN B ; ha A nagyobb mint B akkor printeld ki B értékét IF B ! CJMP .LABEL ; ha B nem egyenlő C-vel, akkor ugorj a .LABEL nevű cimkevel jelzett sorra. IF B + CC = C + 1; ha B nagyobb mint C akkor C legyen egyenlő C plusz eggyel
Egy cimke és egy "IF" szerkezet közé ékelve bármilyen tipusú ciklus létrehozható. Íme egy szimpla növekményes ciklus:
B = 0
.LOOP B = B + 1 PRN B IF 10 + B JMP .LOOP
De a RET (return) kulcsszó segítségével a ciklusok mellett még szubrutinok is írhatók. Így néz ki egy efféle szubrutin:
- A Bitsy egy végletesen minimalista programozási nyelv. A jellegét tekintve, kifejezett script-nyelv. A nyelv minimalizmusára jól rávilágít, hogy mindössze négy kulcsszava és három operátora van. Ennek ellenére, a Bitsy bizony-bizony Turing teljes.
- Hogy jött létre ez a kis szörnyszülött?
- Régebben valamikor, bizonyos feladatokat kellett volt elvégeznem, amelyben a repetitivitásnak (ismétlődés) is komoly szerep jutott, ezért elhatároztam, hogy megpróbálom a feladat unalmasságát megtörni azzal, hogy létrehozok egy programocskát, amely legalább részben tehermentesít engem azzal, hogy elvégzi a feladat oroszlánrészét, helyettem. Ez a programocska tulajdonképpen egy olyan script-nyelv, illetve annak interpretere lett, amely éppen csak azt tartalmazta, amire az elvégzendő feladathoz elengedhetetlenül szükség volt. Ez a kis interpreter (és vele párhuzamosan a nyelv) idővel bővülni kezdett és mára már eljutott egy olyan, általánosan használható készültségi szintre, ami az én igényeimet nagy részben lefedi. Ez az aprócska készülék lett a Nano, ennek egy szubszetje pedig egy másik nyelv, az Atto.
Mindezzel párhuzamosan, már régóta terveztem, hogy ha időm engedi, én is megkomponálok egy, a BrainFuck-hoz hasonló, kis mértékben extremitásba hajló nyelvet. Ezt a nyelvet úgy képzeltem el, hogy legyen kicsi, könnyen tanulható, emellett az extremitás ne tengjen túl benne, mert az csak elijesztené az esetleges használók/kipróbálók táborát. Arra voltam kiváncsi, hogy mi az a minimum, ami Turing teljes ugyan, de tökéletesen sallang-mentes. Hát, ez lett a Bitsy.
A Bitsy egyébként, nagyobb testvéreivel, a Nano-val és az Atto-val legalább nevében megegyezik abban, hogy önnön kicsinységét hirdeti. A Nano és az Atto szavakat mérnök embereknek nem kell ragoznom, a Bitsy meg, - angolul azt jelenti, hogy aprócska, picuri.
A nyelv négy kulcsszava az IF, a JMP, a RET és a PRN. A nyelv három operátora a =, a + és a!.
- A = az értékadó operátor. Semmi másra nem használható, csak értékadásra (B = 5).
- A + az összeadás operátora matematikai kifejezésekben és a "nagyobb mint" operátor logikai kifejezésekben.
- A ! negálja az előtte álló változó értékét, de logikai kifejezésekben a "nem egyenlő" operátor jelentésével bír.
Köszönöm az olvasónak, hogy megtisztelt, hogy figyelmével kitüntette soraimat. A Bitsy nyelv egyéb "finomságait" egy következő posztban ismertetem.