Harjoitustyö: virtuaalikone



Samankaltaiset tiedostot
Ohjelmoinnin perusteet Y Python

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Ohjelmoinnin perusteet Y Python

LOAD R1, =2 Sijoitetaan rekisteriin R1 arvo 2. LOAD R1, 100

Ohjelmoinnin perusteet Y Python

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

Ohjelmointiharjoituksia Arduino-ympäristössä

Pythonin Kertaus. Cse-a1130. Tietotekniikka Sovelluksissa. Versio 0.01b

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

Ohjelmoinnin peruskurssi Y1

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

ITKP102 Ohjelmointi 1 (6 op)

List-luokan soveltamista. Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

Ohjelmoinnin perusteet Y Python

Java-kielen perusteet

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Tutoriaaliläsnäoloista

Muuttujatyypit ovat Boolean, Byte, Integer, Long, Double, Currency, Date, Object, String, Variant (oletus)

Ohjelmoinnin perusteet Y Python

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.

Ohjelmoinnin perusteet Y Python

Sisältö. 22. Taulukot. Yleistä. Yleistä

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

Ohjelmoinnin jatkokurssi, kurssikoe

Jakso 4 Aliohjelmien toteutus

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Jakso 4 Aliohjelmien toteutus

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Ohjelmoinnin perusteet Y Python

Muuttujien roolit Kiintoarvo cin >> r;

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

1 Tehtävän kuvaus ja analysointi

Tietojen syöttäminen ohjelmalle. Tietojen syöttäminen ohjelmalle Scanner-luokan avulla

Taulukoiden käsittely Javalla

Luento 4 Aliohjelmien toteutus

Listarakenne (ArrayList-luokka)

Java-kielen perusteet

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

Harjoitus 3 (viikko 39)

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli

Ohjelmoinnin perusteet Y Python

5.6. C-kielen perusteet, osa 6/8, Taulukko , pva, kuvat jma

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python

Harjoitus 2 (viikko 45)

Harjoitus 4 (viikko 47)

Ohjelmoinnin perusteet Y Python

Sisältö. 2. Taulukot. Yleistä. Yleistä

JavaScript alkeet Esimerkkikoodeja moniste 2 ( Metropolia)

Luento 5. Timo Savola. 28. huhtikuuta 2006

Rakenteiset tietotyypit Moniulotteiset taulukot

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Esimerkkiprojekti. Mallivastauksen löydät Wroxin www-sivuilta. Kenttä Tyyppi Max.pituus Rajoitukset/Kommentit

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

Tässä tehtävässä käsittelet metodeja, listoja sekä alkulukuja (englanniksi prime ).

ITKP102 Ohjelmointi 1 (6 op)

Ehto- ja toistolauseet

13 Operaattoreiden ylimäärittelyjä

Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python

1. Kun käyttäjä antaa nollan, niin ei tulosteta enää tuloa 2. Hyväksy käyttäjältä luku vain joltain tietyltä väliltä (esim tai )

Ohjelmoinnin peruskurssi Y1

Luento 4 (verkkoluento 4) Aliohjelmien toteutus

Loppukurssin järjestelyt

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

Luento 4 (verkkoluento 4) Aliohjelmien toteutus

Taulukot. Jukka Harju, Jukka Juslin

Ohjelmoinnin peruskurssi Y1

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

Harjoitus 3: Flash-komponenttiarkkitehtuuri ( )

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

Harjoitus 1 -- Ratkaisut

Ohjelmoinnin perusteet Y Python

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

Ohjelmoinnin perusteet Y Python

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille:

Ohjelmoinnin peruskurssi Y1

Sisällys. 11. Javan toistorakenteet. Laskurimuuttujat. Yleistä

Ohjelmoinnin peruskurssien laaja oppimäärä

815338A Ohjelmointikielten periaatteet

12. Näppäimistöltä lukeminen 12.1

Olio-ohjelmointi Javalla

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. Operaatioiden suoritusjärjestys

Monipuolinen esimerkki

Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19

Loppukurssin järjestelyt C:n edistyneet piirteet

Transkriptio:

Harjoitustyö: virtuaalikone Toteuta alla kuvattu virtuaalikone yksinkertaiselle olio-orientoituneelle skriptauskielelle. Paketissa on testaamista varten mukana kaksi lyhyttä ohjelmaa. Ohjeita Noudata ohjelman kokoamisessa hyvää ohjelmointityyliä. Älä käytä rakenteita, joiden toimintaa ei ole määritetty. Käytä olio-orientoitunutta ohjelmointitapaa. Jaa ohjelma loogisesti lähdekoodi- ja otsikkotiedostoihin luennoilla opetetulla tavalla. Varsinaista roskienkeruuta ei tarvitse toteuttaa, mutta virtuaalikoneesi tulee olla ohjelman suorituksen aikana suljettavissa niin, että kaikki sen varaamat resurssit tulevat vapautetuiksi. Virtuaalikoneesi tulee olla kapseloitu siten, että niitä voi olla käynnissä useampi rinnakkain. Älä siis käytä globaaleja muuttujia muille kuin vakioille. Käytä esikäsittelijää vain debuggaukseen ja koostevahtien tekemiseen. Palauttaminen Kun olet valmis, pakkaa työsi lähdekoodi (joko.zip tai.tar.gz), ja lähetä se luennoitsijalle sähköpostilla. Paketin nimessä tulee lukea kaikkien tekijöiden nimet. Erillistä dokumentaatiota ei tarvita. Virtuaalikoneen kuvaus Virtuaalikone lukee skriptitiedoston ja aloittaa suorituksen kutsumalla metodia main. Tämän jälkeen suoritetaan skriptitiedostosta luettuja käskyjä, kunnes tulee virhe tai pääohjelmasta palataan. Seuraavaksi kuvataan skriptitiedoston rakenne ja Skriptitiedoston rakenne Skriptitiedostossa on kaksi osaa. Ensimmäinen osa sisältää skriptitiedoston käyttämien metodien määritykset, ja toinen osa sisältää skriptissä käytetyt merkkijonoliteraalit. Näiden osien välissä on neljä kertaa tavu 255 (0xFF). Kaikki skriptitiedostoissa käytettävät 8-bittistä suuremmat luvut ovat big endian-formaatissa, eli merkittävin tavu edellä. Metodit Jokaisen metodin alussa on 32-bittinen etumerkitön kokonaisluku, joka on metodin nimen indeksi merkkijonotaulukossa. Jos indeksi on 0xFFFFFFFF, tiedetään, että tämän jälkeen tulee merkkijonotaulukko. Nimen jälkeen seuraa kaksi etumerkitöntä 8-bittistä kokonaislukua, joista ensimmäinen on metodin paikallismuuttujien lukumäärä ja jälkimmäinen on metodin parametrien lukumäärä. Metodia kutsuttaessa luodaan muuttujapino (joka alustetaan tyhjäksi) sekä paikallismuuttujataulukko, jonka alkuun sijoitetaan metodin parametrit. Parametrien lukumäärän jälkeen seuraa 32-bittinen etumerkitön kokonaisluku, joka kertoo metodin koon. Tätä seuraa näin monta tavua käskydataa. Jokainen metodi palauttaa muuttujan.

Merkkijonot Merkkijonot tallennetaan 0-alkuiseen taulukkoon. Merkkijonojen järjestys skriptitiedostossa on tärkeä, koska niiden indeksejä käytetään sekä metodin nimien määritykseen että myöhemmin käskyjen parametreina. Jokainen merkkijono alkaa 32-bittisellä etumerkittömällä kokonaisluvulla, joka kertoo merkkijonon koon. Tätä seuraa näin monta tavua, jotka ovat merkkijonon sisältö. Merkkijono saa sisältää mitä tahansa merkkejä 0-255. Muuttujat Virtuaalikone käsittelee kolmen tyyppistä muuttujaa. Nämä tyypit ovat luku, metodi ja olio. Kieli on dynaamisesti tyypitetty, eli muuttujan tyyppi määritetään silloin, kun muuttuja luodaan. Jokaisen muuttujan tyyppi on säilytettävä virtuaalikoneessa kunnes muuttuja poistuu käytöstä. Luku on 32- bittinen liukuluku. Metodi on osoitin metodiin, jota voidaan kutsua. Olio on osoitin NEW-käskyllä luotuun olioon tai NULL-arvoon. Oliot virtuaalikoneessa ovat assosiatiivisia taulukkoja (esim. std::map), joissa sekä avain- että datatyyppinä on muuttujatyyppi. Huomaa, että oliot itse assosioidaan vain osoitteen, ei sisällön, perusteella. Myös edellä mainitut merkkijonot ovat olioita. Merkkijonon merkit sijaitsevat oliossa indekseillä 0, 1, 2,... n, missä n on olion koko (eli avaindata-parien määrä). Merkkijonoja ei lopeteta nollaan. Merkkijonon tulostamiseksi täytyy näin ollen tehdä funktio, joka muuntaa olion C++-tyyppiseksi merkkijonoksi. Käskykanta Seuraavassa on virtuaalikoneen käskykanta. Käskyn perässä on sen numero. Huomaa, että nämä vakiot löytyvät tiedostostacommands.h. Aritmeettiset käskyt ADD (0): nosta kaksi lukua pinosta, lisää ne ja talleta tulos pinoon SUB (2): nosta kaksi lukua pinosta, vähennä ensin nostettu jälkimmäisestä ja talleta tulos pinoon MUL (1): nosta kaksi lukua pinosta, kerro ne ja talleta tulos pinoon DIV (3): nosta kaksi lukua pinosta, jaa toiseksi nostettu ensin nostetulla ja talleta tulos pinoon Hyppykäskyt Kaikkia hyppykäskyjä seuraa 32-bittinen etumerkillinen kokonaisluku, joka lisätään tavukoodiosoittimeen, jos hypyn ehto on voimassa. Lisäys lasketaan hyppykäskyä (johon sisältyy lisäys) seuraavaan käskyyn. CMPLT (4): hyppää, jos toiseksi nostettu luku on pienempi kuin ensin nostettu CMPLE (5): hyppää, jos toiseksi nostettu luku on pienempi tai yhtäsuuri kuin ensin nostettu CMPNE (6): hyppää, jos toiseksi nostettu luku on erisuuri kuin ensin nostettu CMPEQ (7): hyppää, jos toiseksi nostettu luku on yhtäsuuri kuin ensin nostettu CMPGE (8): hyppää, jos toiseksi nostettu luku on suurempi tai yhtäsuuri kuin ensin nostettu CMPGT (9): hyppää, jos toiseksi nostettu luku on suurempi kuin ensin nostettu

CMPNULL (10): hyppää, jos nostettu muuttuja on tyypiltään osoitin ja arvoltaan null CMPNONNULL (11): hyppää, jos nostettu muuttuja ei ole tyypiltään osoitin tai on erisuuri kuin null CMPPEQ (12): hyppää, jos nostetut kaksi muuttujaa ovat samat olio-osoittimet CMPPNE (13): hyppää, jos nostetut kaksi muuttujaa ovat eri olio-osoittimet GOTO (14): hyppää aina Pino- ja paikallismuuttujakäskyt POP (20): poista pinosta yksi muuttuja (mikä tahansa tyyppi) PUTLOCAL (18): Lue käskyjonosta yksi tavu. Tämä on paikallismuuttujan indeksi. Nosta pinosta muuttuja (mikä tahansa tyyppi), ja aseta se kyseisen paikallismuuttujan arvoksi. GETLOCAL (19): Lue käskyjonosta yksi tavu. Tämä on paikallismuuttujan indeksi. Lue kyseinen paikallismuuttuja (mikä tahansa tyyppi), ja talleta se pinoon. Oliokäskyt PUT (21): nosta pinosta tässä järjestyksessä kaksi muuttujaa (mitkä tahansa tyypit) ja osoitin. Aseta osoittimeen ensin nostettu muuttuja käyttäen toista muuttujaa avaimena. Jos ensin nostettu muuttuja on osoitin null, poista avain. GET (22): nosta pinosta tässä järjestyksessä muuttuja (minkä tahansa tyyppinen) ja olio. Hae osoittimesta käyttäen ensin nostettua muuttujaa avaimena, ja talleta se pinoon. Jos muuttujaa vastaavaa dataa ei löydy oliosta, talleta NULL. NEW (16): allokoi uusi olio ja talleta se pinoon. MAKENULL (23): Talleta NULL-osoitin pinoon. Metodikäskyt INVOKE (26): nosta pinosta metodi ja kutsu sitä. Metodin argumentit ovat kutsuttaessa pinossa siten, että pinon päällimmäinen muuttuja on metodin viimeinen argumentti. RETURN (17): nosta päällimmäinen muuttuja (mikä tahansa tyyppi) pinosta, palaa edelliseen funktioon ja työnnä muuttuja sen pinoon (huom. pino ei ole välttämättä tyhjä palattaessa) GETFUN (15): Lue merkkijono kuten CONSTSTR-käskyssä. Hae tätä merkkijonoa vastaava metodi, ja talleta se pinoon. Muut käskyt CONSTSTR (24): Lue 32-bittinen etumerkitön kokonaisluku pinosta. Tämä on indeksi merkkijonotaulukkoon. Hae tätä indeksiä vastaava merkkijono, ja talleta se pinoon. Jos merkkijonotaulukossa ei ole näin monta merkkijonoa, talleta osoitin NULL. CONST (25): Lue 32-bittinen liukuluku käskyjonosta ja talleta se pinoon. Näiden käskyjen lisäksi tarvitaan kolme erityismetodia: print, readline ja size. Print ottaa yhden parametrina yhden merkkijono-olion, joka tulostetaan std::cout-oliota käyttäen ruudulle. Print palauttaa NULL. Readline lukee std::cin-oliosta rivin tekstiä, luo siitä merkkijono-olion ja palauttaa sen. Size ottaa yhden olioparametrin ja palauttaa sen koon. Virhetilanteet Kaikkia virhetilanteita ei tarvitse tunnistaa. Esim. lähdekoodi voidaan olettaa sikäli oikein muodostetuksi, että siinä ei ole virheellisiä käskyjä, virheellisiä hyppyosoittimia tai muita

rakenteellisia virheitä. Myös merkkijonoliteraalien muokkaamista ei tarvitse huomioida. Seuraavat virheet pitää kuitenkin tunnistaa: NULL-osoittimeen tallettaminen tai siitä hakeminen Väärän tyypin nostaminen tai asettaminen pinosta. Jos esim. käskyn kuvauksessa on mainittu nosta osoitin", ja pinon päällimmäisenä on luku, tämä tuottaa virheen. Puuttuva metodi GETFUN-käskyssä (eli annettua merkkijonoa ei vastaa mikään ladattu metodi) Näissä tapauksissa tulee poistua siististi poikkeusta käyttäen ilman resurssivuotoja paikkaan, josta virtuaalikonetta on kutsuttu. Poikkeuksen tulee sisältää sen metodin nimi, jossa virhe tapahtui. Virtuaalikoneen testaaminen Voit testata ohjelmaa skriptitiedostoillahello.scr jadraw.scr.hello.scr yksinkertaisesti tulostaa tekstin "hello, world". draw.scr on yksinkertainen "piirto-ohjelma" (kirjoita "help"). Huomaa, että testien ajaminen ei automaattisesti takaa, että virtuaalikone toimii määrityksen mukaisesti. Ohjelmien mukana tulee lähdekoodit ja käskylistaukset. Näiden ohjelmien lisäksi voit imuroida yksinkertaisen (bisonilla ja flexillä luodun) kääntäjän, jolla voit kokeilla ohjelmiesi toimintaa. Tämän kääntäjän lähdekoodista ei kannata ottaa mallia. Kääntäjä on käännettävissä g++:lla tiedostoista comp.cpp, comp.tab.c ja lex.yy.c. Oheismateriaalina löytyy lisäksi ohjelma nimeltä reader, joka lukee skriptitiedoston läpi ja kirjoittaa sen sisällön (metodit, niiden sisältämät käskyt ja merkkijonot) tekstinä standardiulostuloon. Tähän kannattaa tutustua jos skriptitiedoston lukemisessa on ongelmia. Esimerkkejä Tiedoston hello.scr sisältö: Osoite Sisältö Selitys 0 4 5 6 00 00 00 02 00 00 00 00 00 0E 10 15 20 21 22 23 24 28 32 37 41 47 51 18 00 00 00 01 0F 00 00 00 00 1A 14 17 11 FF FF FF FF 00 00 00 05 70 72 69 6E 74 00 00 00 06 68 65 6C 6C 6F 0A 00 00 00 04 6D 61 69 6E Metodin nimen indeksi merkkijonotaulukossa on 2 Ei paikallismuuttujia Ei parametreja Metodi on 14 tavun kokoinen Käsky 24 (STR), parametri 1 Käsky 15 (GETFUN), parametri 0 Käsky 26 (INVOKE) Käsky 20 (POP) Käsky 23 (NULL) Käsky 17 (RETURN) Tästä alkaa merkkijonotaulukko Merkkijonon 0 koko on 5 Merkkijono print Merkkijonon 1 koko on 6 Merkkijono hello (viimeisenä rivinvaihto) Merkkijonon 2 koko on 4 Merkkijono main 55 End of file Ei enää merkkijonoja

Skriptin hello kuvaus: Funktiot Name 2 -- Tämän funktion nimi on toinen merkkijono -- taulukossa Locals 0, params 0 -- Funktiolla ei ole paikallismuuttujia -- eikä parametreja Size 14 -- Funktion koko on 14 tavua 0: STR 1 -- Lataa merkkijonotaulukosta merkkijono 1 -- (hello) pinon päälle 5: GETFUN 0 -- Lataa funktio, jonka nimi on merkkijono 0 -- (print) edellisen päälle 10: INVOKE -- Kutsu päällimmäisenä pinossa olevaa funktiota. -- Print-funktiolla on yksi parametri, joksi -- sijoitetaan pinossa alempana oleva arvo. 11: POP -- Hylkää print-funktion palautusarvo. Pino on -- tämän jälkeen tyhjä. 12: NULL -- Lataa null-osoitin pinon päälle. 13: RETURN -- Palauta pinossa päällimmäisenä oleva null. Merkkijonot 0: print 1: hello 2: main Kuvaus skriptindraw pätkästä (kommenteissa punaisella alkuperäinen koodi) -- circle_draw( circle, canvas ) -- { -- local x, y, xc, yc, x1, x2, y2, c, p, rs; Name 10 -- Nimi circle_draw Locals 12, params 2 -- 12 paikallismuuttujaa, joista 2 parametreja Size 181 -- rs = circle[ "r" ]; 0: GETLOCAL 0 -- Hae paikallismuuttuja 0 (circle) pinon päälle 2: STR 7 -- Hae merkkijono 7 ("r") pinon päälle 7: GET -- Hae paikallismuuttujasta 0 alkio "r" -- (pino on tämän jälkeen yhden kokoinen) 8: PUTLOCAL 11 -- Sijoita paikallismuuttujaan 11, eli rs -- (pino on tämän jälkeen tyhjä) -- xc = circle[ "x" ]; 10: GETLOCAL 0 -- circle 12: STR 8 -- "x" 17: GET -- Pino: circle[ "x" ] 18: PUTLOCAL 4 -- xc -- x1 = xc - rs; 20: GETLOCAL 4 -- xc 22: GETLOCAL 11 -- rs 24: SUB -- Vähennä paikallismuuttujasta neljä -- paikallismuuttuja 11 (pino on tämän jälkeen -- yhden kokoinen) 25: PUTLOCAL 6 -- x1 -- x2 = xc + rs;

27: GETLOCAL 4 -- xc 29: GETLOCAL 11 -- rs 31: ADD -- Lisää paikallismuuttujaan neljä -- paikallismuuttuja 11 32: PUTLOCAL 7 -- x2 -- yc = circle[ "y" ]; 34: GETLOCAL 0 -- circle 36: STR 9 -- "y" 41: GET 42: PUTLOCAL 5 -- x2 -- y = yc - rs; 44: GETLOCAL 5 -- yc 46: GETLOCAL 11 -- rs 48: SUB 49: PUTLOCAL 3 -- y -- y2 = yc + rs; 51: GETLOCAL 5 -- yc 53: GETLOCAL 11 -- rs 55: ADD 56: PUTLOCAL 8 -- y2 -- c = circle[ "c" ]; 58: GETLOCAL 0 -- circle 60: STR 4 -- "c" 65: GET 66: PUTLOCAL 9 -- c -- rs = rs * rs; 68: GETLOCAL 11 -- rs 70: GETLOCAL 11 72: MUL 73: PUTLOCAL 11 -- p = canvas[ "put" ]; 75: GETLOCAL 1 -- canvas 77: STR 5 -- "put" 82: GET 83: PUTLOCAL 10 -- p -- while ( y <= y2 ) -- { 85: GETLOCAL 3 -- y 87: GETLOCAL 8 -- y2 89: CMPGT 179 -- Jos paikallismuuttuja 3 (y) on suurempi tai -- yhtä suuri kuin paikallismuuttuja 8 (y2), -- hyppää osoitteeseen 179 (eli silmukan loppuun) -- x = x1; 94: GETLOCAL 6 -- x 96: PUTLOCAL 2 -- x1 -- while ( x <= x2 ) -- { 98: GETLOCAL 2 -- x 100: GETLOCAL 7 -- x2 102: CMPGT 164 -- if ( ( ( x - xc ) * ( x - xc ) + ( y - yc ) * ( y - yc ) ) <= rs ) { 107: GETLOCAL 2 -- x 109: GETLOCAL 4 -- xc 111: SUB 112: GETLOCAL 2 -- x 114: GETLOCAL 4 -- xc 116: SUB 117: MUL 118: GETLOCAL 3 -- y 120: GETLOCAL 5 -- yc 122: SUB

123: GETLOCAL 3 -- y 125: GETLOCAL 5 -- yc 127: SUB 128: MUL 129: ADD -- pinossa on nyt vain ( x - xc ) * ( x - xc ) + ( y - yc ) * ( y - yc ) 130: GETLOCAL 11 -- rs 132: CMPGT 149 -- Jos ensimmäinen suurempi kuin toinen, -- hyppää osoitteeseen 149 -- p( canvas, x, y, c ); 137: GETLOCAL 1 -- canvas 139: GETLOCAL 2 -- x 141: GETLOCAL 3 -- y 143: GETLOCAL 9 -- c 145: GETLOCAL 10 -- p 147: INVOKE -- Kutsu funktiota p parametreilla canvas, x, y, c 148: POP -- Hylkää palautusarvo -- } -- x = x + 1; 149: GETLOCAL 2 -- x 151: CONST 1 -- Sijoita lukuvakio 1 pinoon 156: ADD 157: PUTLOCAL 2 159: GOTO 98 -- } //while ( x <= x2 ) -- y = y + 1; 164: GETLOCAL 3 -- y 166: CONST 1 171: ADD 172: PUTLOCAL 3 174: GOTO 85 -- } //while ( y <= y2 ) 179: NULL 180: RETURN -- Palauta null