Seppo Mustonen: Sukrojen ohjelmointi Survossa

12. Sukrojen laatiminen käytännössä

Kuten jo aikaisemmin todettiin, sukrokieli on siinä suhteessa poikkeuksellinen, että se edellyttää ohjelmoijalta Survon käyttötapojen hyvää hallintaa. Sukrojen tulee luottaa valmiisiin Survon operaatioihin ja yhdistellä niitä tehokkaasti. Näin ei kaikkea tarvitse rakentaa alusta; sukro syntyy panemalla vain kokoon erilaatuisia elementtejä.
     Myös itse ohjelmointityössä on hyötyä Survon läsnäolosta. On selvää, että monet sukrojen osat kannattaa toteuttaa ensin opetustilassa, siis käyttämällä Survoa ja antamalla systeemin tallentaa kaikki toimenpiteet. Yhtä selvää on, että varsinkin loogisesti mutkikkaammat työvaiheet on paras kirjoittaa suoraan sukrokielellä. Esim. ehdollisia rakenteita ei edes voi kuvata pelkällä opetustilassa tapahtuvalla mallityöskentelyllä.

Survon oma toimitin on keskeisessä asemassa sekä ohjelmia kirjoitettaessa että niitä testattaessa. Yleensä sukrot kehittyvät useista irrallisista palasista, joita liimataan yhteen toimituskentässä. Sukron laatimiseen ja muokkaamiseen on hyvä varata riittävän iso toimitustila, jossa ylläpidetään sekä tekeillä olevan sukron listausta että testaukseen tarvittavia komentoja ja esimerkkitilanteita. Kun tehdään jokin muutos, talletetaan ohjelma listauksen edessä olevalla TUTSAVE-komennolla ja sen jälkeen sitä kokeillaan jollakin valmiilla, samassa kentässä olevalla esimerkkikaaviolla. Jos testattava sukro muuttaa kentän sisältöä, talletetaan koko myös koko kenttä ennen kutakin testausyritystä. Näin sukrosta pidetään kirjaa sekä toimituskentässä että varsinaisessa sukrotiedostossa.

Sukroja ohjelmoiva keventää omaa työtään rakentamalla työkalusukroja, jotka auttavat uusien sukrojen kirjoittamisessa. Tässä suhteessa on varmasti niin monenlaisia tyylejä ja makuja, ettei mikään valmis apusukro kelpaa jokaiselle ohjelmoijalle. Yhtenä mallina sellaisesta on kuitenkin olemassa näppäimistösukro SUCRO, jonka tuella mutkikkaampien sukrokäskyjen ja -rakenteiden kirjoittaminen sujuu helposti.

Esimerkkinä apusukron SUCRO käyttötavasta olkoon seuraava. Tekeillä on sukro KYSELY1, jota ollaan kirjoittamassa kentän ensiriveille:
   9  1 SURVO 84C EDITOR Sun May 19 10:40:47 1991         C:\SUOPAS\ 120  85 0
   1 *
   2 *TUTSAVE KYSELY1
   3 *{tempo -1}{init}{line start}{R}
   4 *{erase}{erase}SCRATCH {act}
   5 / Kysymys 1:
   6 */SUCRO
   7 - prompt  <Question ?> {}
   8 -   default <default answer> 
   9 -   answer  <tutstack member for the answer (this line is optional)> 
  10 -   length  <max. length of the answer> 
  11 -   wait    <max. waiting time> 
  12 *
  13 *
  14 */SUCRO ?
  15 *This sucro simplifies typing of sucro programs.
  16 *Patterns for typical statements are obtained by - and <letter>.
  17 *Examples: -H is {home}, -P is {print Wx}, -W is {write Wx},
  18 *  -G is {goto <label>}, -D is {del stack x}, -I is 'if',
  19 *  -Q is 'prompt', -S is 'switch', -O is 'on key', -L gives a label,
  20 *  -C enters the control column.
  21 *
  22 *
  23 *
        Typing sucro codes by -<letter> Stop: #

Sukroon KYSELY1 pitäisi saada käyttäjälle osoitettu kysymys. Rivillä 6 on tämän vuoksi aktivoitu näppäimistösukro SUCRO, joka muuntaa napin - toimintaa siten, että sen jälkeen eräät muut merkit kirjoittavat sukrokielen käskyjen valmiita malleja. Tästä on tiedotus kuvaruudun alimmalla rivillä. Vaihtoehdot on listattu aiemmin kenttään rivin 14 komennolla, jossa parametrina oleva ? antaa riveillä 15-20 olevan selostuksen eri nappien toiminnoista. Esim. yhdistelmä -Q tuottaa valmiin prompt-käskyn mallin, joka tässä saatu riveillä 7-11. Kun apusukro SUCRO on käytössä, se ei tuhoa kentässä olevaa tekstiä vaan lisää kohdistimen osoittamaan kohtaan tyhjiä rivejä, ennenkuin kirjoittaa omat mallirivinsä.

Yhtä sukroa ei saisi tehdä liian suureksi. Mittavat ratkaisut on paras koota pienistä sukroista, jotka load-käskyin ketjuuntuvat toisiinsa. Samaan sovellukseen kuuluvat osat on edullista tallentaa yhdeksi sukroperheeksi samaan tiedostoon, kuten kohdassa 10 kuvattiin. Pari - kolme kilotavua on yleensä sopiva yläraja yhdelle osasukrolle. Silloin sukroa on kätevä muokkailla toimituskentässä. Osista kootut sukrot saattavat olla käytännössä nopeampia, sillä esim. goto-käskyissä mainitut viitepaikat etsitään ajon aikana sukrokoodin alusta päin. Hyvin pitkillä yksittäisillä sukroilla jonkin koodin lopussa olevan viitteen etsiminen on tällöin hidasta, ellei koneessa ole tehokasta välimuistia levytiedostojen käsittelyyn tai muuta vastaavaa keinoa.

Itse sukrojen arkkitehtuurissa tulee edulliseksi yhdistellä sukroilla tehtyjä asioita valmiisiin tekstiä ja toimintakaavioita sisältäviin toimituskenttiin. Myös valikkopohjat kannattaa tehdä toimituskenttiin. Sukro ottaa tällöin käyttöön valmiin toimituskentän, näyttää siitä käyttäjälle sopivia osia ja hyödyntää valmiita kaavioita, taulukkoja ja valikkoja.

Yhtenäisyystavoitteista

Survon operaatiot noudattavat samankaltaisia sääntöjä, mitä tulee niiden käynnistykseen, alkutietojen antamiseen (parametrit, täsmennykset), käsittelyn kohteena olevien tietojen esittämiseen ja rajoittamiseen (havaintotaulukot, -tiedostot) sekä tulosten esittämiseen (toimituskentässä, matriisija tulostiedostoissa).
     Koska vaativia tehtäviä suorittavat sukrot soveltavat peräkkäin eri operaatioita, ne perivät luonnollisella tavalla näiden ulkoiset, yhtenäiset ominaisuudet. Tästä huolimatta sukrojen vastuulle jää monia asioita, jotka voi järjestää vaihtoehtoisilla tavoilla ja joissa jokin vakiintunut käytäntö saattaisi olla eduksi. Yhdenmukaisuus helpottaa käyttäjän totuttelua uusiin toimintoihin. Tiukkoja vaatimuksia ei ole syytä esittää, koska sukrot ovat luonteeltaan vaihtelevia.
     Sukron aloittaessa toimintansa sen tulee ottaa huomioon, että toimituskenttä saattaa olla epänormaalissa tilassa. Melkein poikkeuksetta sukron alussa on tämän vuoksi paras antaa käsky {init}. Se ei muuta kohdistimen paikkaa eikä vaikuta kentän sisältöön, mutta varmistaa mm. etteivät jotkin kesken jääneet toimenpiteet (lisäystila, avoinna oleva varjorivi, vasemman reunan asetus jne.) koidu haitaksi.
     Kun kysymys on työkalusta tai asiantuntijasovelluksesta, jonka pitäisi edetä mahdollisimman nopeasti, on alkuun hyvä asettaa {tempo -1}, mikä ennen sukron loppua kuitataan käskyllä {tempo +1}.
     Sukro ei koskaan saisi tuhota ympäristöään esim. toimituskentässä tarpeettomasti. Varsinkin työkalusukrojen olisi yritettävä tehdä työnsä aktivoidulla rivillä. Jos ne tarvitsevat lisätilaa, hyvä käytäntö on lisätä komentorivin alle tyhjä rivi tai useampia, joita käytetään väliaikaisesti. Sukron tulee itse siivota jälkensä ja poistaa tällaiset työrivit lopuksi.
     Survon varsinaisten operaatioiden kaltaiset sukrot tietenkin tuottavat tuloksensa toimituskenttään. Yleensä sukroissa ei käyttäjän edellytetä nimeävän mitään alkuriviä tuloksille. Normaali menettely sukroilla on se, että toimituskenttä tyhjennetään komentorivin alapuolelta ja tulokset kirjoitetaan tähän tyhjään tilaan. Sen sijaan sukro ei saisi koskaan poistaa eikä muuttaa komentorivin yläpuolella olevia tietoja. Tällaisen sukron käyttäjältä edellytetään, että hän sijoittaa mahdolliset täsmennykset ja muut sukron tarvitsemat tiedot ennen riviä, jolla sukrokomento annetaan.
     Laajoissa asiantuntijasovelluksissa ja opetusohjelmissa on kuitenkin täysin oikeutettua unohtaa nykyinen toimituskenttä ja siirtyä omiin maisemiin. Jos halutaan, niissä on mahdollista tallettaa nykyinen kenttä ja kohdistimen paikka, jolloin sovelluksen päätyttyä päästään automaattisesti takaisin lähtökohtana olleeseen työhön. Näin on menetelty mm. suomenkielisen opetussarjan (sukro OPETUS) kohdalla.
     Jokaisen yleiseen käyttöön tarkoitetun sukron olisi osattava kertoa jotain omasta toiminnastaan silloin, kun se käynnistetään puutteellisin parametrein tai mikäli sukroon ei kuulu parametreja, parametrilla ? . Käyttöohje annetaan esim. {message}-käskyllä, jolloin se ei kuluta toimituskenttää. Jos tarvitaan enemmän rivejä, ohjeet kirjoitetaan lisäämällä nykyisen rivin alapuolelle riittävästi tyhjää. Tuntematonta sukroa aktivoidessaan käyttäjien olisi kuitenkin aina varauduttava siihen, että se saattaa tuhota toimituskentän sisältöä.

Sukrojen ohjelmointi Survossa - Seppo Mustonen 1991
  1. Johdanto
  2. Esimerkki
  3. Sukrokielen koodisanoja
  4. Sukromuisti
  5. Hapuilukoodit, tulostus ja kohdistimen liikuttelu
  6. Sukrojen aloittaminen ja kytkeminen toisiinsa
  7. Ehdolliset toiminnat
  8. Käyttäjän vuorovaikutus
  9. Aritmetiikka ja muistin välitön hallinta
  10. Sukrotiedostot
  11. Sukrojen lajit
  12. Sukrojen laatiminen käytännössä
  13. Virhetilanteet
  14. Näytesovelluksia
Liite: Sukrokielen koodisanat