Zzzzip
A BASIC compiler

File-név: ZZZIP.COM
Program neve: Zzzip Integer BASIC compiler 1.1
Peter Hiner - 1986
BASIC compiler

1. Bevezetés
2. A ZZZIP futtatása
3. A lefordított program futtatása
4. Problémák kezelése
5. BASIC parancsok
6. Beépített függvények
7. A lefordított programok másolása
8. Verziótörténet

1. Bevezetés
A ZZZIP egy Egész értékű BASIC Fordító. A BASIC-ben írt programot átalakítja gépi kódúra a gyorsabb futtatás érdekében. A ZZZIP a nagyobb sebességnövekedést azáltal éri el és az "Egész értékű" elnevezés is arra utal, hogy a BASIC programban szereplő konstansok és változók értékeit egész értékeknek tekinti (azaz a tizedespont utáni számjegyeket nem veszi figyelembe). Ennek következtében van néhány megkötés a ZZZIP használatára vonatkozólag, de ha gondosan követjük a kézikönyv utasításait, a ZZZIP-et könnyen fogjuk kezelni és meglepően jó eredményeket érhetünk el.
Az első nyilvánvaló kérdés: "Hányszor lesz gyorsabb a lefordított programok futása?" A válasz attól függ, hogy milyen típusú BASIC program került lefordításra. Egy olyan program, amely véletlenszerűen megadott számokat rendez sorba, körülbelül 50-szer lenne gyorsabb, mint a BASIC, míg egy string-eket sorbarendező program esetleg csak(!) 12-szer. Másrészt egy olyan program, amely különösebb számolás nélkül ábrázol pontokat és vonalakat, valószínűleg csak kétszer lenne gyorsabb a BASIC-nél (ami még mindig bizonyos haladást jelent). Ha BASIC programunkat úgy módosítjuk, hogy a gépi kódú programoknál alkalmazott módszereket használja, sokkal gyorsabb képernyőkezelést kaphatunk (a szalagon található BENCH. BAS program a gyors képernyőkezelésre ad példát).
Szalagunkon a ZZZIP (mely három részből áll -ZIP, ZIPA, ZIPB) és a BENCH. BAS programok találhatók, ez utóbbi néhány egyszerű rutint tartalmaz, s ezekkel szemlélteti a ZZZIP által biztosított sebességnövekedést.
Javasoljuk, hogy először a BENCH.BAS-t fordítsa le, mert ezáltal jobban megismerheti a ZZZIP használatához szükséges eljárást.

Mi is az a compiler?
A compiler egy fordítóprogram, amely egy magasszintű nyelven (esetünkben BASIC-ben) megírt programot fordít gépi kódú programmá (pontosabban pszeudó-kóddá). Így lehetőségünk van gyorsabb programok készítésére, anélkül, hogy más programozási nyelvet kellene választanunk. A compiler-eknek két csoportja létezik: integer és real fordítók. Az integer fordítók csak egész számokkal tudnak dolgozni, cserébe viszont a lefordított program gyorsabban fut mint a real fordítókkal készített program. A real fordítók nem csak egész számokkal tudnak dolgozni, ezért azonban a lassabb programfutásssal fizetünk.

2. A ZZZIP futtatása
A ZZZIP egyformán jól működtethető szalagon és lemezen. A 2.1 fejezet a szalagon történő használatot írja le, de a lemezes használatra is alkalmazható a nyilvánvaló különbségek (és a 2. 2 fejezet pontjainak) figyelembevételével.

2.1 Szalagos rendszerek
Az indulás a BASIC képernyő-editorából történjék, miután törölt belőle minden más programot. A ZZZIP futtatásához nyomja le a START billentyűt, s az három részletben automatikusan betöltődik. Ha ez megtörtént, a ZZZIP egy szöveg kiírásával jelzi, hogy annak a kazettának a bekészítésére vár, amely a fordítani kívánt BASIC programot tartalmazza. A ZZZIP feltételezi a magnó távvezérlésének lehetőségét (ha nincs ilyen, a PAUSE billentyűt kell használnia). Gépelje be a BASIC program nevét (vagy egyszerűen nyomja meg az ENTER billentyűt, s ezáltal az első szóba jöhető program betöltődik). A ZZZIP a BASIC programot a memória egy lefoglalt területére tölti be. Megjegyezzük, hogy az ENTERPRISE 64 gépen ennek a nagysága 16K-ra korlátozódik, s ha a BASIC program túl nagy, a ZZZIP a "Memory Full" (a memória megtelt) üzenetet írja ki.
Ezután a ZZZIP egy szöveg kiírásával jelzi, hogy annak a kazettának a bekészítésére vár, amelyre programjának lefordított változatát ki akarja menteni, továbbá a magnó RECORD billentyűjének lenyomására. Gépelje be azt a nevet, amelyet a lefordított programnak kíván adni, ezután a ZZZIP működésbe lép. (A programnevekről a 2. 3 fejezet ír bővebben). A ZZZIP négy menetben dolgozza fel a BASIC programot, s kiírja a BASIC sorok sorszámait is, így teszi lehetővé a program fordításának nyomonkövetését.
Ha az első két menet alatt a ZZZIP szembekerül valamilyen problémával (például egy BASIC paranccsal amelyet nem tud kezelni), egy üzenetet hagy a kritikus sorszámnál, majd rátér a következő sorra egészen addig, míg ennek a menetnek a végére nem ér. Ily módon rendelkezésre áll azoknak a sorszámoknak a listája, amelyekhez az adott menetben problémás sorok tartoztak, s a mellettük feltüntetett hibaüzenetek jelentését a 4. fejezetben található útmutatások alapján értelmezhetjük.
Rendszerint ebben a részben a ZZZIP probléma nélkül fut, s a harmadik és negyedik menettel folytatódik, amikor is kiír a szalagra egy kis BASIC betöltő programot, majd magát a lefordított programot. Ez utóbbi két menet alatt is van egyfajta ellenőrzés, s ha előfordul valamilyen hiba, a ZZZIP kiír egy üzenetet és azonnal leáll.
Végezetül a ZZZIP megkérdezi, hogy akarja-e más egyéb programok fordítását. Ha igen, a ZZZIP visszatér ahhoz a ponthoz, amelynél a BASIC forrásprogram betöltődik.

2.2 Lemezes rendszerek
Mindenekelőtt át kell másolnia a ZIP, ZIPA, ZIPB és BENCH.BAS programokat szalagról lemezre.
A BASIC forrásprogram vagy a lefordított program nevének bevitele során beírhatók olyan többletinformációk, mint pl. a lemezegység azonosítója vagy a directory elérési út. A forrás és a lefordított program lehet különböző lemezen is, ha szükséges, s ha csak egy lemezegység áll rendelkezésre, a szokásos lemezcserélésre szólító üzenetek jelennek meg.

2.3 Programnevek
A különböző lemezrendszerek kompatibilitását néhány programnévre vonatkozó szabály biztosítja.
Ha a lefordított programot nem látja el névvel (csak megnyomja az ENTER billentyűt), a ZZZIP a default, azaz alapértelmezésű nevet fogja használni: "Z".
A megkívánt név formátuma a következő: egy legfeljebb 8 karakteres főrész, melyet egy esetleges kiterjesztés követ (a pont írásjel és még legfeljebb 3 karakter), mely a program típusát jelzi. A ZZZIP a lefordított program nevét mindig 12 karakterre korlátozza. Amennyiben talál kiterjesztést, akkor ezt a BASIC betöltőhöz csatolja, a lefordított programnak a ".Z" kiterjesztést adja. Ha nincs kiterjesztés, és a név főrésze nem hosszabb 8 karakternél, a ZZZIP egyszerűen hozzácsatolja a lefordított program nevéhez a ".Z" kiterjesztést.
A programok elnevezésére a következő konvenciót javasoljuk:

PROGRNEV.BAS (BASIC változat)
PROGRNEV.ZIP (Betöltő program)
PROGRNEV.Z (Lefordított változat)

3. A lefordított program futtatása
A lefordított programok majdnem ugyanúgy kezelhetők, mintha BASIC programok volnának. A legfontosabb különbség az, hogy egyszerre csak egy lefordított program tartható a memóriában és ez a 0. program kell, hogy legyen. A programon belül a RUN parancs más programok automatikus betöltésére és futtatására használható (szabadon keverve a BASIC és a lefordított programokat).
Minden lefordított programot egy kis BASIC betöltő program előz meg, ez automatikusan betölti a lefordított programot és ellenőrzi a program méretét, beleértve a változók által igényelt helyet, stb. Előfordulhat, hogy egy nagyon nagy program lefordítása után megjelenik az "Insufficient memory" (nem elegendő memória) üzenet. Ilyenkor meg lehet próbálni a gép teljes újraindítását és a program újratöltését, de ha ez nem segít, az eredeti program módosításával kell csökkenteni az igényelt memória mennyiségét.
Ezek után a lefordított programnak ugyanazokat az eredményeket kell szolgáltatnia futtatáskor, mint az eredeti BASIC programnak, csak gyorsabban. A STOP billentyűvel megszakítható a program futtatása, a START billentyűvel pedig újraindítható.
Megjegyezzük, hogy a CONTINUE nem működik, valamint a SAVE és a LIST sem használható lefordított programnál.
Ha valamilyen okból a lefordított program futása mégsem lenne tökéletes, nézzen utána a lehetséges okoknak a 4. fejezetben. Mindamellett javasoljuk, hogy futtassa le mégegyszer a lefordított programot és próbálja megkeresni azt a helyet ahol elszáll a program, ily módon leszűkítheti a BASIC programban történő hibakeresés területét.

4. Problémák kezelése
A felmerülő problémák kezelésének egyetlen járható útja az eredeti BASIC programba való visszatérés és annak módosítása. Jóllehet, a ZZZIP-et alapos vizsgálatoknak vetették alá, nem lehetetlen, hogy esetleg hibát talál benne (egy még ismeretlen tulajdonságát!), de ezekben az esetekben is a BASIC programot kell módosítania úgy, hogy a ZZZIP azt pontosan le tudja fordítani. Ne feledje el annak a lehetőségét sem, hogy hiba következhet be a BASIC program betöltése során is.
A ZZZIP a következő hibaüzeneteket adhatja:

5. BASIC parancsok
A ZZZIP megtart csaknem minden olyan parancsot, amely egy BASIC programon belül általában végrehajtható. A Későbbiekben látni fogja, hogy néhány parancs használatakor óvatosnak kell lennie vagy némelyeket egyáltalán nem használhat, a többi viszont korlátozás nélkül rendelkezésre áll.

A főprogramban lévő PRINT TEN utasítás hatására a 10-es szám kerül majd nyomtatásra. Az 1010-es sor egy egyszerű LET utasítást tartalmaz, s a ZZZIP az ott lévő TEN változót lokálisnak tekinti. Ellenben, ha a TEN nevet az 1010-es sorban valamilyen más típusú utasításban használnánk, ez a TEN függvény rekurzív CALL hívását okozná és a lefordított programban hibásan működne.
Hasonlóan, ha olyan függvényből akarunk értéket visszaadni, amely segédváltozókat tartalmaz paraméterátadás céljából, szintén használhatunk lokális változót. Például a LET DOUBLE=X*2 megengedett egy olyan blokkban, melynek a fejléce DEF DOUBLE(X), s a főprogramban lévő PRINT D0UBLE(3) hatására a 6 kerül majd nyomtatásra. Egyszerű függvénynevek is átadódhatnak egy másik függvényen belül felhasználandó paraméterként, így a főprogramban lévő PRINT DOUBLE(TEN) a 20 kinyomtatását eredményezi. Ezek a példák hibátlanul működnek egy lefordított programban.
Megjegyezzük, hogy a ZZZIP nem fogadja el a REF parancsot és hibaüzenetet ír ki. Valami más, a BASIC programéhoz hasonló eredményeket szolgáltató módszert kell találnia.

6. beépített függvények
A ZZZIP megtart minden beépített függvényt, habár néhány esetben korlátozza használatukat, ezekről külön említést teszünk. Talán meglepő lehet, hogy a ZZZIP megtartja a SIN és COS trigonometrikus függvényeket, hisz ezek valójában nem kompatibilisek az egész értékű matematikával. Ezeket használni is nehezebb, addig ne is foglalkozzunk velük, amíg nincs elegendő tapasztalatunk a ZZZIP működtetésében.

7. A lefordított programok másolása
A lefordított programok csupán a SAVE parancs használatával nem másolhatók szalagra. További másolatok készítésének egy módja az lenne, ha a BASIC programot ismételten lefordítanánk. Egy másik módszer, amely csak egy szalagos készülék használatát igényli, azt a lehetőséget használja ki, amelyet az egyes lefordított programokat megelőző BASIC betöltő program tartalmaz. A Basic képernyőeditorból indulva, a bent lévő programok törlése után, folytassa a következőkkel:

  1. Helyezze be a lefordított programot tartalmazó szalagot és készüljön fel a betöltésre.
  2. Gépelje be a LOAD "XXX"-et (ahol XXX a program neve).
  3. Helyezze be a célszalagot (azt, amelyikre a másolatot szeretné kapni) és készüljön fel a kimentésre.
  4. Gépelje be a SAVE "XXX"-et.
  5. Helyezze be a lefordított programot tartalmazó szalagot és készüljön fel a betöltésre.
  6. Gépelje be a RUN 100-at.
  7. A program jelezni fogja, hogy mikor kell betennie a célszalagot és előkészülnie a kimentésre.
  8. Ekkor nyomja le az ENTER billentyűt és a lefordított program kiíródik a célszalagra.

8. Verziótörténet
A programot Peter Hiner készítette, aki egy felhasználói csoport tagjaként kísérletezett az interpretertes BASIC nyelvekhez készíthető fordító programokkal. Később bemutatták az Enterprise Computers embereinek, fel is ajánlottak neki egy gépet, készítsen olyan terméket amit esetleg a géphez is lehetne adni. Mire azonban a program elkészült, az Enterprise csődöt jelentett. A programot így már a BoxSoft adta ki. Hazánkban, egy programkatalógusban 2.0-ás verzióról írnak, de ennek létezését a szerző cáfolja. Nálunk az 1.1-es verziót lehetett megvásárolni, azonban létezett a programból 1.2-es verzió is. Az egyetlen eltérés a gyökvonás függvény javítása.
A program nálunk néhány játékkazetta B oldalára került (Gratis Soft). Programozási versenyt is hirdettek, a legjobb (de játszhatatlanul lassú) program szerzője egy példányt kapott volna a ZZZIP-ből ingyen. Az egyetlen számot megélt EnterFace hirdette ki, hogy a verseny győztese Endi Miner című játéka. A program listáját le is közölték, de a nyereményt Endi azóta sem kapta meg...