TAMPEREEN TEKNILLINEN YLIOPISTO Tietotekniikan osasto. ANTTI VIRTANEN Visuaalinen tulkki ohjelmoinnin opetukseen Diplomityö



Samankaltaiset tiedostot
4. Lausekielinen ohjelmointi 4.1

Ongelma(t): Miten jollakin korkeamman tason ohjelmointikielellä esitetty algoritmi saadaan suoritettua mikro-ohjelmoitavalla tietokoneella ja siinä

11/20: Konepelti auki

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo

4. Lausekielinen ohjelmointi 4.1

Algoritmit 1. Luento 3 Ti Timo Männikkö

TIE Tietorakenteet ja algoritmit 1. TIE Tietorakenteet ja algoritmit

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Yleisiä ohjeita visualisointien käyttöönotosta ohjelmointikurssilla

Ohjelmointi 1 / syksy /20: IDE

11.4. Context-free kielet 1 / 17

AS C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

ELM GROUP 04. Teemu Laakso Henrik Talarmo

DIPLOMITYÖ ARI KORHONEN

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 30. marraskuuta 2015

Virtuaalikoneiden generointi Vmgen-kääntäjällä

.NET ajoympäristö. Juha Järvensivu 2007

Yhteydettömän kieliopin jäsennysongelma

Ohjelmoinnin perusteet Y Python

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

Ohjelmistojen mallintaminen, mallintaminen ja UML

5. HelloWorld-ohjelma 5.1

Ruby. Tampere University of Technology Department of Pervasive Computing TIE Principles of Programming Languages

Dynaaminen kääntäminen ja Java HotSpot

L models. Tekninen määrittely. Ryhmä Rajoitteiset

Dart. Ryhmä 38. Ville Tahvanainen. Juha Häkli

5. HelloWorld-ohjelma 5.1

M =(K, Σ, Γ,, s, F ) Σ ={a, b} Γ ={c, d} = {( (s, a, e), (s, cd) ), ( (s, e, e), (f, e) ), (f, e, d), (f, e)

TIEA241 Automaatit ja kieliopit, kesä Antti-Juhani Kaijanaho. 10. kesäkuuta 2013

4. Luokan testaus ja käyttö olion kautta 4.1

Ongelma(t): Miten mikro-ohjelmoitavaa tietokonetta voisi ohjelmoida kirjoittamatta binääristä (mikro)koodia? Voisiko samalla algoritmin esitystavalla

811312A Tietorakenteet ja algoritmit I Johdanto

1. Olio-ohjelmointi 1.1

Uudelleenkäytön jako kahteen

Jäsennysalgoritmeja. TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 29. syyskuuta 2009 TIETOTEKNIIKAN LAITOS. Jäsennysalgoritmeja

Osoitin ja viittaus C++:ssa

A TIETORAKENTEET JA ALGORITMIT

Interaktiivisten järjestelmien arkkitehtuuriratkaisu, jolla käyttöliittymä erotetaan sovelluslogiikasta.

TT00AA Ohjelmoinnin jatko (TT10S1ECD)

Tietotekniikan valintakoe

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli

Tietorakenteet ja algoritmit - syksy

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

Lisää pysähtymisaiheisia ongelmia

Interaktiivisten järjestelmien arkkitehtuuriratkaisu, jolla käyttöliittymä erotetaan sovelluslogiikasta.

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

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

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

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

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. FT Ari Viinikainen

Ohjelmointi 1. Kumppanit

Ohjelmistojen mallintaminen

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A.

SEPA REFAKTOROINTI Antti Ahvenlampi, 57408L Erik Hakala, 57509T

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

Tietorakenteet ja algoritmit

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 3. lokakuuta 2016

jäsennyksestä TIEA241 Automaatit ja kieliopit, syksy 2016 Antti-Juhani Kaijanaho 29. syyskuuta 2016 TIETOTEKNIIKAN LAITOS Kontekstittomien kielioppien

811120P Diskreetit rakenteet

Ongelma(t): Miten tietokoneen komponentteja voi ohjata siten, että ne tekevät yhdessä jotakin järkevää? Voiko tietokonetta ohjata (ohjelmoida) siten,

811120P Diskreetit rakenteet

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Älysopimusten kehittäminen. Sopimus suuntautunut ohjelmointi

Hahmon etsiminen syotteesta (johdatteleva esimerkki)

Ohjelmistotekniikan menetelmät, Ohjelmistotuotannon työkaluista

15. Ohjelmoinnin tekniikkaa 15.1

TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho. 31. maaliskuuta 2011

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla

Vasen johto S AB ab ab esittää jäsennyspuun kasvattamista vasemmalta alkaen:

Ohjelmoinnin peruskurssien laaja oppimäärä

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

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

Yhteydettömät kieliopit [Sipser luku 2.1]

Soveltuvuustutkimus Lifebelt-ohjelman ideologian käytettävyydestä olioorientoituneeseen

TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 27. lokakuuta 2009

TIEA341 Funktio-ohjelmointi 1, kevät 2008

P e d a c o d e ohjelmointikoulutus verkossa

TIEA241 Automaatit ja kieliopit, kesä Antti-Juhani Kaijanaho. 29. toukokuuta 2013

TIEA255 Tietotekniikan teemaseminaari ohjelmointikielet ja kehitysalustat. Antti-Juhani Kaijanaho. 16. helmikuuta 2011

Ohjelmoinnin perusteet Y Python

UML-kielen formalisointi Object-Z:lla

1.3 Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

Johnson, A Theoretician's Guide to the Experimental Analysis of Algorithms.

uv n, v 1, ja uv i w A kaikilla

PERL. TIE Principles of Programming Languages. Ryhmä 4: Joonas Lång & Jasmin Laitamäki

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

Sulautettujen järjestelmien skaala on niin laaja, että on erittäin vaikea antaa yleispätevää kuvausta siitä millainen on sulautettu järjestelmä.

Pedacode Pikaopas. Java-kehitysympäristön pystyttäminen

Tietorakenteet ja algoritmit

Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 1

OHJELMOINTIA MONIPUOLISESTI MATEMATIIKAN OPETUKSESSA LUMA-PÄIVÄT, TAMPERE

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Kieliversiointityökalu Java-ohjelmistoon. Ohje

Attribuuttikieliopit

Tietueet. Tietueiden määrittely

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

Algoritmit 1. Luento 1 Ti Timo Männikkö

TIEA241 Automaatit ja kieliopit, kevät Antti-Juhani Kaijanaho. 12. kesäkuuta 2013

815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset

Transkriptio:

TAMPEREEN TEKNILLINEN YLIOPISTO Tietotekniikan osasto ANTTI VIRTANEN Visuaalinen tulkki ohjelmoinnin opetukseen Diplomityö Aihe hyväksytty osastoneuvoston kokouksessa 13.11.2004 Tarkastajat: Prof. Hannu-Matti Järvinen (TTY) DI Essi Lahtinen (TTY) 1

Alkulause Haluan kiittää työn ohjaajia professori Hannu-Matti Järvistä ja tutkija Essi Lahtista, jotka pysyivät kärsivällisinä tekemisen kangerrellassa. Molemmat jaksoivat korjata kirjoitusvirheitäni ja antoivat hedelmällistä palautetta sisällöstä ahkerasti. Lämpimät kiitokset kaikille työn tekemisessä kannustaneille ja auttaneille ystäville ja kollegoille. Erityiskiitokset Mira Tammiselle, Mika Valtolalle sekä #titeplanets IRCkeskustelukanavan väelle, jotka saivat suurimman osan työhön liittyvästä tilityksestä. Tampereella 26.4.2005 Antti Virtanen Insinöörinkatu 68 B 39 050-4004278 2

Sisällysluettelo 1 Johdanto......10 2 Ohjelmien visualisointi...12 2.1 TTY:n perusohjelmoinnin opetus...12 2.2 Tietokonepohjaisen visualisoinnin tarve...13 2.3 Visualisoinnin hyödyt...13 2.3.1 Visualisoinnin käyttöönoton ongelmat...13 2.3.2 Hyvän visualisointityökalun ominaisuudet...14 2.3.3 Visualisoinnin hyötyjen arviointi...16 2.4 Olemassaolevat järjestelmät...16 2.4.1 Tango, X-Tango, Polka...16 2.4.2 Trakla, Trakla2...17 2.4.3 Blue, BlueJ...17 2.4.4 Jeliot-perhe...18 2.4.5 SDE (SIMPLESEM)...18 2.4.6 Yhteenveto......19 3 Lausekielten jäsentäminen...20 3.1 Formaalit kielet ja kielioppi...20 3.1.1 Vasemmalle rekursiivisuus...21 3.1.2 Säännöllisten kielten luokittelu (LALR, LR, LL)...21 3.1.3 Kurkistus...22 3.1.4 Lausekielten määrittely...22 3.1.5 Jäsennyspuu...22 3.1.6 Yksikäsitteisyys...23 3.1.7 Presedenssi ja sitovuus...23 3.2 Jäsennystekniikat...24 3.3 Lausekielten jäsentäminen käytännössä...25 3.3.1 Selaaja...26 3.3.2 Jäsentäjä......26 3.4 Välikieli......27 3.4.1 Postfix......27 3.4.2 Yleisassembler...28 3.4.3 Tavukoodi...28 3

3.4.4 Puurakenne (AST)...29 4 Tulkit ja virtuaalikoneet...30 4.1 Kääntämisen ja tulkkaamisen ero...30 4.1.1 Virtuaalikone...30 4.1.2 Tulkkaamisen edut...31 4.2 Tulkkien toteuttaminen...32 4.2.1 Symbolitulkin perusrakenne...32 4.2.2 Käskykanta...33 4.2.3 Puurakenne (AST) tulkin välikielenä...33 4.2.4 Tulkkaamisen nopeus...34 4.2.5 Konekielelle kääntäminen tulkissa...34 4.2.6 Muistimalli...35 4.2.7 Automaattinen roskienkeruu...36 4.2.8 Symbolitaulu...36 4.2.9 Aktivaatiopino...37 4.2.10 Ajonaikaiset semanttiset tarkistukset...37 5 VIP visualisaattorin toteutus...38 5.1 Perusrakenne...38 5.2 Käytetyt apukirjastot...39 5.2.1 Ongelmat CUP:n kanssa...39 5.3 Välikieli...40 5.3.1 Suoritusaskel...40 5.4 Kääntäjä...40 5.4.1 Staattiset semanttiset tarkistukset...41 5.5 Profiloija......41 5.6 Testaus...42 5.6.1 Loki......42 5.6.2 Regressiotestaus...43 5.7 Käyttöliittymä...43 5.7.1 Muuttujien ja funktiokutsujen esittäminen...45 5.7.2 Hallintapainikkeet...47 5.8 Visualisointien tekeminen...47 5.9 Ohjekommentit...47 4

5.10 Koodieditori...48 5.11 Lausekkeiden evaluoinnin esittäminen...48 5.12 Tulkki...49 5.12.1 Tulkkialgoritmi...49 5.12.2 Dynaamiset semanttiset tarkistukset...50 5.13 Symbolitaulu...51 5.14 Aktivaatiopino......51 5.15 Muisti...51 5.16 Muuttujien toteutus...52 6 VIP:n ohjelmointikieli C--...54 6.1 Tyypitys ja tietotyypit...54 6.2 Ominaisuuksia, joita ei ole toteutettu...55 6.3 Tiedon luku ja kirjoitus...55 6.4 Funktiot...55 6.5 Lauseet...55 7 Jatkokehitysajatuksia...56 7.1 Räätälöinti...56 7.2 Kielen muokkaaminen...56 7.3 Välikielen esittäminen...56 7.4 Muisti-ikkuna...57 7.5 Uudet C-- ominaisuudet...57 7.6 Askelten rajoittaminen...58 7.7 Undo-toiminto...58 7.8 Käyttöliittymä...58 7.9 C++:n STL-standardikirjaston toteuttaminen...58 8 Yhteenveto......59 Lähdeluettelo...63 Liite 1 Selaajan JFlex-tiedosto Liite 2 Jäsentäjän CUP-tiedosto 5

TAMPEREEN TEKNILLINEN YLIOPISTO Tietotekniikan osasto Ohjelmistotekniikka VIRTANEN, ANTTI: Visuaalinen tulkki ohjelmoinnin opetukseen Diplomityö, 51 s., 21 liites. Tarkastajat: prof. Hannu-Matti Järvinen, tutkija Essi Lahtinen Rahoittajat: TTY, Codewitz/Minerva, Virtuaali-yliopisto. Toukokuu 2005 Avainsanat: tulkki, C++, visualisointi, opetus Ohjelmien visualisointia on tutkittu paljon ja visualisointiin on kehitetty erilaisia työkaluja. Opetuskäyttössä erityisesti tietorakenteiden ja algoritmien visualisointi on osoittautunut hyödylliseksi. Oppikirjoissa esitetään usein ohjelmien toimintaa kuvien ja symbolien avulla esimerkiksi piirtämällä nuolia kuvaamaan osoittimia. Tässä työssä toteutettiin visuaalinen tulkki C++-kielen osajoukolle ohjelmoinnin peruskurssin tarpeisiin. Toteutettu tulkki visualisoi ohjelman tilan ja esittää suorituksen etenemisen askel kerrallaan. Tulkki on suunniteltu ohjelmoinnin perusopetukseen, joten tehokkuuteen ei ole kiinnitetty erityistä huomiota. C++-kielen perusrakenteet toteutettiin työn puitteissa, mutta mallit, oliot ja poikkeukset jätettiin toteuttamatta. Vastaavia järjestelmiä on toteutettu muissa yliopistoissa, mutta mikään tutkituista vaihtehdoista ei soveltunut TTY:n käyttöön, joten tässä työssä toteutettiin kokonaan itse tehty visualisaattori. Erityistä huomiota kiinnitettiin helppokäyttöisyyteen sekä opiskelijan että opettajan näkökulmasta. Järjestelmän lähdekoodi on kokonaisuudessaan saatavilla ilmaiseksi ei-kaupalliseen käyttöön. Tulkki on toteutettu Java-applettina, joten sitä voi käyttää millä tahansa käyttöjärjestelmällä. WWW-palvelinta sijaan visualisointeja voidaan ajaa paikalliselta kovalevyltä selaimella. Tulkkia on käytetty TTY:llä perusohjelmoinnin opetuksessa ja uusien visualisointien luominen on osoittautunut helpoksi. Työkalun käytöstä on kerätty opiskelijapalautetta, joka on ollut melko neutraalia. Tulkin käyttö on ollut täysin vapaaehtoista, joten aineiston pohjalta on vaikea arvioida sen hyödyllisyyttä. 6

TAMPERE UNIVERSITY OF TECHNOLOGY Department of Computer Science, Institute of Software Systems VIRTANEN, ANTTI: Visual interpreter for learning programming Master of Science Thesis, 51 pages, 21 enclosure pages Examiner: Dr. Hannu-Matti Järvinen and Res. Essi Lahtinen May 2005 Keywords: interpreter, C++, visualization, learning Programming books often present the structure and behavior of programs using pictures and symbols. For example, arrows commonly present pointers. Consequently, there has been significant amount of research on visualizing programs and a variety of tools have been developed. A visual interpreter for a subset of C++ programming language was developed in this project. The interpreter visualizes the state of a given program and it's execution step by step. The interpreter has not been optimized for speed as the system was desigend for teaching introductory programming. The basic constructs of C++ were implemented but advanced features like templates, object oriented programming and exceptions were left out. Similar systems have been developed in other universities but all examined systems lacked some important features from our point of view. Thus, a completely new system was developed instead of tailoring an existing one. Ease of use, from both student's and teacher's point of view, was considered especially important. The full source code of the system is available on request for non-commercial use. Being a Java-applet, the interpreter is available on virtually all platforms. The system is still a stand-alone program and can be used without a WWW server. The interpreter has been used on Tampere University of Technology for introductory programming course and creating new visualizations has proven to be easy. Survey was made among the students and generally the feedback was neutral. As using the system has been voluntary it is difficult to estimate whether the visualization had any impact on the students. 7

Termit ja lyhenteet Työssä käytettyjen termien ja lyhenteiden selityksiä. Mikäli työssä on haluttu viitata tiettyyn versioon esimerkiksi JDK:sta, versio on mainittu erikseen. lyhenne selitys viite Java Java-ohjelmointikieli yleensä http://www.java.sun.com AWT Abstract Window Toolkit, Javan alkuperäinen käyttöliittymäkirjasto JDK Java Developer's Kit, Sun http://www.java.sun.com Microsystemsin julkaisema Javan kehitysympäristö Swing Javan nykyinen käyttöliittymäkirjasto JIT Just-In-Time, (virtuaalikoneissa) konekielelle kääntäminen juuri ennen operaation suorittamista WWW World Wide Web HTTP HyperText Transfer Protocol http://www.w3.org. CGI Common Gateway Interface MVC Model-View-Controller, arkkitehtuurimalli TTY Tampereen Teknillinen http://www.tut.fi/ Yliopisto VIP Visual InterPreter http://www.cs.tut.fi/~vip/ Perl Perl-ohjelmointikieli http://www.perl.org LR Left-to-right, Right-most derivation LALR Left-to-right, Right-most derivation AST Abstract Syntax Tree, ohjelmaa esittävä puurakenne BNF Backus-Naur Form 8

lyhenne selitys viite CFG Context-Free Grammar UML Unified Modeling Language ITiCSE Information Technology in http://www.iticse.org Computer Science Education STL Standard Template Library HTML HyperText Mark-up Language http://www.w3c.org ACM Association for Computing http://www.acm.org Machinery SIGCSE The ACM Special Interest Group on Computer Science VM Virtual Machine, virtuaalikone SDE Simplesem Development Environment, visualisointiympäristö ja virtuaalikone Simplesemarkkitehtuurille TRAKLA Teknillisessä Korkeakoulussa kehitetty järjestelmä tietorakententeiden ja algoritmien visualisointiin http://trakla.cs.hut.fi 9

1 Johdanto Ohjelmien, tietorakenteiden ja algoritmien koneellista visualisointia ja opettamista on tutkittu kauan. Tutkimus ja kehitystyö on eriytynyt käsittelemään ohjelmien eri piirteiden visualisointia ohjelmistokehityksessä ja ohjelmoinnin opetuksessa. Ohjelmoinnin eri osa-alueille on havaittu hedelmälliseksi käyttää erilaisia visualisointeja: erityisesti tietorakenteet ja algoritmit esitetään usein abstraktilla tasolla nuolien, laatikoiden yms. avulla. Laajasta tutkimuksesta huolimatta visualisoinnin hyödyllisyydestä oppimisen kannalta ei ole selvyyttä. Yleisesti kuitenkin oletetaan visualisoinnista olevan hyötyä oppimisen kannalta. Interaktiivisuus on nähty olennaiseksi itseopiskeluun ja opetuksen tueksi tarkoitetuissa visualisoinneissa. Mikäli opiskelija voi kokeilla eri lähestymistapoja ja ratkaisuja, ongelman eri aspektien ymmärtäminen on syvällisempää. Vapaan interaktiivisuuden saavuttaminen ohjelmien visualisoinnissa edellyttää mahdollisuutta muokata visualisoitavaa ohjelmakoodia ja siten jonkinlaisen tulkin toteuttamista. Ohjelmointikielten tulkin toteuttaminen mielivaltaiselle ohjelmointikielelle on kääntäjän toteuttamiselle läheinen ongelma. Kuten kääntäjän, tulkin täytyy jäsentää lähdekoodi, suorittaa sille syntaksin ja semantiikan tarkistuksia ja muodostaa ohjelmasta välikielinen versio. Konekielikoodin generoinnin sijaan tulkki voi toteuttaa kielen operaatiot korkean tason kielellä, jolla tulkki itse on kirjoitettu. Koska tulkkaaminen hidastaa ohjelman suoritusta, erityistä huomiota tulkkien tutkimuksessa on kiinnitetty tehokkuuteen. Tehokkaiden tulkkien toteuttaminen on kuitenkin erittäin monimutkaista. Tämän diplomityön tavoitteena oli rakentaa erityisesti ohjelmoinnin perusopetukseen soveltuva visuaalinen tulkki, jossa yksinkertaisten ohjelmien ajonaikaista toimintaa voi tarkastella yksityiskohtaisella tasolla. Tavoitteena oli, että työssä kehitetty visuaalinen tulkki (Visual InterPreter, VIP) tukisi mahdollisimman hyvin ohjelmoinnin perusopetusta TTY:n kurssilla Laaja 10

ohjelmointi. Koska tulkkia oli tarkoitus käyttää perusohjelmoinnin opetuksessa, tulkilla suoritettavat koodiesimerkit olivat yksinkertaisia. Näin ollen tulkin tehokkuus oli toissijaista ylläpidettävyyden ja selkeyden rinnalla. Jotta tulkin käyttö olisi mahdollisimman helppoa uusien esimerkkien tuottamisen piti vaatia mahdollisimman vähän vaivaa opettajalta, eikä työkalun asentaminen ja käyttöönotto saanut olla työlästä. VIP:n simuloima ohjelmointikieli on C++:n aito osajoukko, jolle on annettu nimi C--. C-- sisältää C++:n perusrakenteet, mutta olio-ohjelmointi, vuot ja poikkeukset on jätetty toteuttamatta. Luvussa 2 luodaan katsaus muihin ohjelmoinnin opetukseen tarkoitettuihin visualisointiympäristöihin ja määritellään perusohjelmoinnin opetuksen kannalta olennaisia ominaisuuksia sekä käsitellään työkalujen arviointikriteereitä. Lausekielten jäsentämisen teoriaa, tulkkien ja kääntäjien eroja sekä tulkkien toteutustekniikoita käsitellään luvuissa 3-5. Tulkkien ja virtuaalikoneiden tehokkuusoptimointia ja lausekielten erityiskysymyksiä ei käsitellä. Luvussa 6 esitetään varsinainen toteutettu visualisointiympäristö. Luvut 7 ja 8 käsittelevät työn onnistumista ja jatkokehitysajatuksia. 11

2 Ohjelmien visualisointi Ohjelmointikielten visualisointia opetustarkoituksiin on tutkittu ja kehitetty ainakin 1960-luvulta alkaen [Knowlton 1966]. Graafinen visualisointi on luonnollinen tapa opettaa algoritmeja ja ohjelmointikielten semantiikkaa. Ohjelmoinnin opetuksessa eri kursseilla on erilaiset lähtötasot, tavoitteet ja siten erilaiset tarpeet visualisoinnille. Algoritmien ja tietorakenteiden visualisoinnissa käytetään erilaista asioiden esitystapaa kuin perusohjelmoinnissa. Myös samalla kurssilla voidaan joitakin asioita esittää hyvin abstraktilla tasolla ja toisia hyvin yksityiskohtaisella. Tässä luvussa arvioidaan ja esitellään olemassa olevia visualisointijärjestelmiä, käsitellään TTY:n perusohjelmoinnin opetuksen ongelmia ja määritellään perusteet visualisointityökalujen arviointiin. 2.1 TTY:n perusohjelmoinnin opetus TTY:n perusohjelmointikursseilla on vuosittain noin tuhat opiskelijaa. Näin suuri opiskelijamäärä on itsessään merkittävä haaste kurssien järjestelyille. Opiskelijoiden tarve ohjaukselle on hyvin yksilöllistä, koska osalla opiskelijoista on jo alan työkokemusta opiskelut aloittaessaan. Osa taas ei tiedä ohjelmoinnista ja tietokoneiden toiminnasta mitään. Peruskoulu ja lukio eivät automaattisesti luo riittäviä valmiuksia ohjelmoinnissa tarvittavien abstraktien käsitteiden hahmottamiseen. Matemaattisten formalismien sijaan ohjelmoinnin peruskäsitteiden konkretisointi visualisoimalla ja esimerkeillä onkin oleellinen osa opetusta. TTY:llä on käytetty menestyksellisesti ohjelmoinnin opetuksessa harjoitustöiden automaattiseen tarkistamiseen ja arviointiin Ceilidh- ja Style++-järjestelmiä, jotka arvioivat ohjelmien toteutuksen oikeellisuutta ja ohjelmointityyliä. Automaattitarkistus antaa opiskelijalle välittömästi palautetta, minkä jälkeen kurssihenkilökunta tarkastaa manuaalisesti hyväksytysti palautetut, toimivat ohjelmat. Automaattitarkistimet eivät kuitenkaan yksin auta oppimaan ohjelmointia, eivätkä ne voi täysin korvata opettajia. 12

Täysin hyödyttömiä automaattiset tarkistimet eivät oppimisen kannalta kuitenkaan ole. Automaattisen tyylianalysaattorin käyttö kursseilla pakottaa opiskelijat lukemaan ja noudattamaan Ohjelmistotekniikan laitoksen C++tyyliohjetta [Rintala & Jokinen 2004], mikä on selvästi parantanut harjoitustöiden rakennetta ja luettavuutta. 2.2 Tietokonepohjaisen visualisoinnin tarve Algoritmien ja ohjelmien toimintaa voidaan simuloida paperin ja kynän avulla, mutta tämä on usein työlästä ja siinä on helppo tehdä virheitä. Hyvin tehdyssä tietokonepohjaisessa simuloinnissa ohjelman toiminnan seuraaminen on huomattavasti helpompaa. Ensisijaisesti visualisoinnit tukevat itsenäistä opiskelua ja opitun asian kertaamista. Automaattisilla visualisoinneilla on myös mahdollista esittää asioita, joiden simuloiminen manuaalisesti olisi käytännössä mahdotonta. Esimerkiksi lajittelualgoritmien toimintaa isoilla aineistoilla on hyvin näppärää esittää graafisesti simulaattorilla. 2.3 Visualisoinnin hyödyt Visualisointia on tutkittu kauan ja sitä pidetään hyödyllisenä, mutta hyödyn arviointi ja toimivan visualisoinnin suunnittelu ovat kiistanalaisia kysymyksiä, joista on monia eri näkemyksiä. ITiCSE:n vuonna 2002 teettämä tutkimus [Almstrum et al. 2002] esittää pääteesinään, että edistääkseen oppimista visualisoinnin pitää mahdollistaa kokeilu ja aktiivinen oppiminen (käännetty englannista). 2.3.1 Visualisoinnin käyttöönoton ongelmat Opettajien mielestä viisi tärkeintä ongelmatekijää visualisoinnin käytössä ohjelmistotekniikan opetukseen olivat SIGCSE:n vuonna 2003 tehdyn kyselyn mukaan [Naps et al. 2003]: 13

hyvien esimerkkien etsimiseen kuluva aika uuden työkalun käytön opetteluun kuluva aika uusien visualisointien tekemiseen kuluva aika hyvien kehitystyökalujen puute visualisoinnin integroimiseen kurssin käytäntöihin kuluva aika. Opetushenkilökunnan näkökulmasta työkalun asentamiseen ja visualisointien rakentamiseen kuluva aika on selvästi kriittinen tekijä, joten hyvän työkalun tulee olla mahdollisimman helppokäyttöinen ja helposti asennettava. 2.3.2 Hyvän visualisointityökalun ominaisuudet Visualisointityökaluilla on aina kaksi käyttäjäryhmää, opettajat ja oppilaat, joilla on hieman erilaiset arviointikriteerit työkalun hyödyllisyydelle. Kuten jo aiemmin todettiin, opettajien näkökulmasta aika ja helppokäyttöisyys ovat kriittisiä tekijöitä. Oppilaan näkökulmasta visualisointien kehittämiseen ja etsimiseen kuluva työmäärä on irrelevanttia. ITiCSE:n tutkimuksessa [Almstrum et al. 2002] määritellään seuraavia ominaisuuksia hyvälle visualsointityökalulle: 1) Visualisoinnin tulkintaohjeet. Opiskelijalle on tarjottava selkeä kuvaus siitä, miten eri asiat visualisoinnissa esitetään. 2) Asioiden oikea esitystaso ja esitystapa. Opiskelijalle pitää esittää asiat riittävällä tarkkuudella ja sopivalla abstraktiotasolla, jotta olennainen ei huku yksityiskohtien sekaan. 3) Useiden eri näkymien tarjoaminen. Ohjelman suoritusta ja toimintaa on hyvä pystyä tarkkailemaan mahdollisimman monesta eri näkökulmasta. Näkökulmaa on voitava vaihtaa kesken ohjelman suorituksen. 14

4) Tehokkuusanalyysin esittäminen. Algoritmien tehokkuuden analysointi on usein hyödyllinen ja olennainen osa niiden ymmärtämistä. 5) Ohjelman suoritushistorian esittäminen. Algoritmien toiminnan ymmärtämistä helpottaa, jos aiemmin suoritettujen operaatioiden suoritusjärjestys voidaan nähdä. 6) Joustavien suoritusmahdollisuuksien tarjoaminen. Ohjelman tai algoritmin toimintaa pitäisi pystyä kontrolloimaan ja suoritusaskelia peruuttamaan. 7) Mahdollisuus kokeilla ja tutkia eri vaihtoehtoja interaktiivisesti. Staattisen visualisoinnin sijaan opiskelijalla tulisi olla mahdollisuus muokata algoritmia ja kokeilla eri vaihtoehtoja mahdollisimman vapaasti. 8) Mahdollisuus kokeilla eri syötteitä. Ohjelman syötettä ei tulisi kiinnittää, vaan opiskelijalle pitää antaa mahdollisuus omien mielivaltaisten syötteiden käyttämiseen. 9) Dynaamisten kysymysten esittäminen. Visualisoinnin lisäksi opiskelijalle olisi hyvä esittää kysymyksiä ohjelmasta. Erityisesti kysymykset, jotka pyytävät opiskelijaa ennustamaan ohjelman tulevaa käyttäytymistä, ovat oppimisen kannalta hyödyllisiä. 10)Automaattisen palautteen antaminen. Hyvä visualisointi antaa ajonaikaisesti automaattista palautetta opiskelijan osaamisesta. 11)Selitysten integroiminen visualisointiin. Hyvä visualisointi ei pohjaudu pelkästään asioiden esittämiseen graafisesti, vaan opettajan tulee voida liittää visualisointiin erillisiä selittäviä tekstejä. Käytännössä kaikki menestyneet visualisointityökalut ohjelmoinnin opetuksessa noudattavat näitä perusperiaatteita. Näiden periaatteiden noudattaminen käytännössä edellyttää visualisoinnin toteuttamista jonkinlaisen tulkin avulla, mikä tekee hyvän visualisointityökalun toteuttamisesta haastavaa. 15

2.3.3 Visualisoinnin hyötyjen arviointi Aiemmin todettiin visualisoinnin hyötyjen arvioinnin olevan hankalaa ja saatujen tulosten ristiriitaisia. Hyötyjen arviointia varten olisi hyvä kerätä ainakin seuraavia tietoja visualisointityökalun käytöstä [Naps et al. 2003]: opiskelijoiden tarkkailu työkalun käytön yhteydessä työkalun käyttöön kulunut aika opiskelijoille tehdyt kyselyt kollegoiden arviot työkalusta opiskelijoiden haastattelu. Näin kerätyn informaation analysointi ja kyselyjen suunnittelu on oma ongelmakenttänsä, eikä sen käsittely kuulu tämän diplomityön piiriin. Haastattelujen ja opiskelijoiden suoranaisen tarkkailun toteuttaminen on rahallisesti ja ajallisesti kallista ja hankalaa, joten sitä ei yleensä tehdä. Sen sijaan työkalun käyttöön kulunutta aikaa ja työkalun käyttöä voidaan tilastoida epäsuorasti minimaalisin kustannuksin, mikäli työkalu mahdollistaa käyttöä koskevien tietojen keräämisen näkymättömästi. 2.4 Olemassaolevat järjestelmät Tässä kohdassa luodaan lyhyt katsaus olemassaoleviin visualisointijärjestelmiin. Katsaus ei ole kattava, vaan esittää poikkileikkauksen erilaisista lähestymistavoista visualisointiin ohjelmoinnin opetuksessa. Järjestelmien yksityiskohtiin ei mennä. 2.4.1 Tango, X-Tango, Polka Tango on 1993-kehitetty visualisointiympäristö algoritmien visualisointiin. X- Tango on X-Window toteutus Tangosta ja Polka on myöhemmin tehty Javatoteutus. 16

Tango on tarkoitettu 2-ulotteisten algoritmianimaatioiden tekoon. Animaatiot rakennetaan Tangon omalla ohjelmointikielellä, jonka jälkeen niitä voidaan askeltaa ja ajaa Tangolla. Tangon ohjelmointikieli tarjoaa yksinkertaiset grafiikkaprimitiivit, kuten laatikon ja ympyrän, sekä rakenteita näiden liikuttamiseen ja manipulointiin [Hartley 1994]. 2.4.2 Trakla, Trakla2 Trakla on Teknillisessä korkeakoulussa kehitetty järjestelmä tietorakenteiden ja algoritmien opettamiseen. Jatkokehitysversiot Matrix ja Trakla2 osaavat esittää graafisesti algoritmeja ja perustietorakenteita sekä sisältävät tarvittavat työkalut erilaisten visualisointien ja testien rakentamiseen. Trakla mahdollistaa interaktiivisten visualisointien tekemisen sekä erilaisten tehtävien tarjoamisen opiskelijalle. Trakla esittää algoritmien ja tietorakenteiden toiminnan abstraktilla tasolla, eikä visualisointia sidota minkään tietyn ohjelmointikielten rakenteisiin. Trakla2 kerää taustalla hyvin yksityiskohtaista tietoa opiskelijoiden toimenpiteistä työkalua käyttäessä. Kyseisistä tiedoista on jo nyt ollut selvää etua opiskelijoiden oppimisen analysoinnissa. [Korhonen et al. 2002]. 2.4.3 Blue, BlueJ Blue on erityisesti opetuskäyttöön suunniteltu oliokieli ja sen päälle rakennettu visuaalinen kehitysympäristö. Bluen kehittäminen ja tukeminen loppui vuonna 1999. BlueJ on Bluesta saatujen kokemusten pohjalta rakennettu Javaohjelmointikielen opetukseen tarkoitettu visuaalinen kehitysympäristö. BlueJ antaa opiskelijoille mahdollisuuden editoida ohjelman lähdekoodia, katsella oliohierarkiaa graafisesti ja tarjoaa debuggausmahdollisuudet jne. BlueJ:n käyttö käytännössä vaatii perinteisestä poikkeavaa lähestymistapaa ohjelmoinnin opetukseen siten, että ohjelmoinnin perusrakenteita lähdetään opettamaan rinnan olio-ohjelmoinnin kanssa [Kolling et al. 2003]. BlueJ on osoittautunut käytännössä erittäin hyväksi [Kolling et al. 2003], mutta kaikki opettajat eivät ole yhtä mieltä opetettavien asioiden jaksottamisesta eri kurssien kesken. TTY:llä käytetään perinteistä jakoa olio-ohjelmointia käsittelevään ja ohjelmoinnin 17

perusrakenteita käsittelevään kurssiin. 2.4.4 Jeliot-perhe Jeliot on joukko hieman toisistaan poikkeavia visualisointiympäristöjä. Jeliotin uusin versio, Jeliot 3 on Java-pohjainen ympäristö, jossa Java-ohjelmien toimintaa voidaan visualisoida dynaamisesti ja editoida niitä. Jeliot voidaan integroida osaksi BlueJ ympäristöä ja siinä on sama lähestymistapa ohjelmoinnin opetukseen: Kielenä on Java ja olio-ohjelmoinnista aletaan puhua heti alkeita opetettaessa. Jeliotin toimivuutta on tutkittu runsaasti. Helsingin yliopistolla havaittiin 1998, että Jeliotin käyttö ja hyöty jäi vähäiseksi [Lattu, Meisalo, Tarhio 1998]. Jeliotin uudemmat versiot ovat kuitenkin osoittautuneet hyödyllisemmiksi. Tulokset ovat kuitenkin edelleen ristiriitaisia Uusimman Joensuun yliopistolla tehdyn tutkimuksen mukaan noin 15% opiskelijoista koki hyötyvänsä Jeliotista, mutta noin 30% koki Jeliotin hidastavan opiskelua [Kannusmäki et al. 2002]. 2.4.5 SDE (SIMPLESEM) Simplesem on kuvitteellinen tietokonearkkitehtuuri, joka on esitelty kirjassa Programming Language Concepts [Ghezzi & Mehdi 1997]. SDE on Javapohjainen toteutus tästä arkkitehtuurista [Hauswirth et al. 1998]. Simplesemmäärittely kuvaa yksinkertaisen suorittimen ja sen käskykannan. SDE mahdollistaa Simplesem-ohjelman suorituksen seuraamisen konekielitasolla ja esittää ohjelman käytössä olevien rekisterien ja muistin visuaalisesti. SDE:n käyttö perusohjelmoinnin opetuksessa on hankalaa, koska opiskelijan on ymmärrettävä suorittimien yleiset toimintaperiaatteet, eikä korkean tason ohjelman toiminnan hahmottaminen suoritettavasta konekielisestä koodista ole helppoa. SDE ja Simplesem soveltuvat parhaiten konekielen, suorittimien ja matalan tason ohjelmoinnin opetukseen. 18

2.4.6 Yhteenveto Vaikka kaikissa järjestelmissä on omat vahvuutensa, yksikään niistä ei sellaisenaan soveltunut TTY:n tarpeisiin. Jeliotin ja BlueJ:n käyttö vaatii opetuskieleksi Javan, minkä lisäksi BlueJ vaatii erilaista lähestymistapaa kuin TTY:llä on valittu. Jeliotia ei myöskään ole tarkoitus laajentaa ymmärtämään muita ohjelmointikieliä [Levy, Ben-Ari, Uronen 2003]. Sekä Jeliot että BlueJ noudattavat aiemmin esitettyjä hyvien visualisointien suunnitteluperiaatteita esimerkillisesti. Tango:n ja SDE:n abstraktiotaso sopii huonosti perusohjelmointiin. SDE:n käyttö vaatisi prosessorin ja konekielen selittämistä opiskelijoille aivan alussa. Tango taas soveltuu parhaiten algoritmien ja abstraktien asioiden visualisointiin. Trakla on on hyvä järjestelmä tietorakenteiden ja algoritmien visualisointiin abstraktilla tasolla, mutta siitä on vain vähän hyötyä ohjelmoinnin perusopetuksessa. 19

3 Lausekielten jäsentäminen Tässä luvussa esitetään aluksi formaalien kielten teoriaa ja joukko määritelmiä, joita tarvitaan käytännön sovellusten ymmärtämiseksi. Myöhemmin esitetään lausekielten jäsentämisen yleisiä tekniikoita. Virheenkorjausta jäsentämisessä ei käsitellä. 3.1 Formaalit kielet ja kielioppi Formaali kieli koostuu joukosta aakkosia ja määrittelee mitkä kaikista aakkosista muodostettavissa olevista aakkosten jonoista (merkkijonoista) kuuluvat kieleen. Formaalin kielen aakkoset ovat abstrakteja symboleita, eikä niillä välttämättä ole suoraa kytkentää reaalimaailman aakkosiin ja merkkeihin. Mikäli kieli on äärellinen, se voidaan määritellä luettelemalla kaikki kieleen kuuluvat merkkijonot. Kieleen kuuluvia leksikaalialkioita, jakamattomia äärellisiä merkkijonoja, kutsutaan terminaaleiksi. Terminaaleista käytetään myös termejä terminaalisymboli ja päätemerkki. Äärettömiä merkkijonoja sisältäville kielille voidaan rakentaa määritelmä neljästä elementistä: Ei-terminaalien äärellinen joukko N. Terminaalien äärellinen joukko T, T N =. Aloitussymboli S, S N. Reduktiosääntöjen joukko P. Jokainen P:n alkio on muotoa u v, missä u ( N T )+ j a v ( N T)*. Mielivaltainen merkkijono kuuluu kieleen, jos ja vain jos se voidaan sääntöjen avulla redusoida aloitussymboliksi. 20

3.1.1 Vasemmalle rekursiivisuus Kieliopin sääntö on vasemmalle rekursiivinen, mikäli kaikki sen säännöt ovat muotoa: A t tai A tb, missä t on terminaalisymboli ja B ja A ovat ei-terminaaleja. Oikealle rekursiiviset kieliopit ovat myös mahdollisia, mutta usein lausekielet esitetään käytännön syistä vasemmalle rekursiivisina tai muunnetaan vasemmalle rekursiivisiksi. Vasemmalle rekursiivisuudesta käytetään myös ilmausta vasemmalle lineaarinen. Mikäli kielioppi on vasemmalle rekursiivinen tai oikealle rekursiivinen, kielioppi on säännöllinen. Säännöllinen kielioppi määrittelee säännöllisen kielen. 3.1.2 Säännöllisten kielten luokittelu (LALR, LR, LL) Säännölliset kielet voidaan jakaa eri luokkiin, joista LL, LR ja LALR ovat tärkeimmät. LR-kieliopilla määritelty kieli voidaan jäsentää lukemalla symbolijonoa vasemmalta oikealle (left-to-right), käyttämällä pelkistyssäännöistä valintatilanteissa aina oikeanpuolimmaisen osan luetusta redusoivaa sääntöä (rightmost reduction). LALR on LR:n osajoukko, joka on hyödyllinen kahdesta syystä: Käytännössä kaikki mielenkiintoiset LR-kieliopit ovat LALR-kielioppeja LALR-kieliopin jäsentäminen on huomattavasti helpompaa kuin LR-kielen. LL-kieliopit ovat tärkeä luokka, koska ne voidaan jäsentää tekniikalla, josta käytetään nimeä rekursiivinen laskeutuminen (recursive descent) tai kokoava jäsentäminen. Rekursiivinen laskeutuminen on erittäin yksinkertainen toteuttaa, mikäli jäsentäjä joudutaan tekemään ilman automaattityökaluja. 21

3.1.3 Kurkistus Sääntöjen jäsentäminen yksikäsitteisesti vaatii useimmiten vähintään yhden symbolin mittaisen ikkunan käsittelemättömään osaan symbolijonoa. Seuraavaksi tulevaa symbolia tutkimalla voidaan ratkaista joitakin muuten hankalia ristiriitatilanteita. Jäsennettävän symbolijonon esikatselusta käytetään nimitystä kurkistus (look-ahead englanninkielisessä materiaalissa). LR(k) tarkoittaa LR-kielioppia, jossa esikatselupuskurin koko on k symbolia. Vastaavasti käytetään merkintöjä LALR(k) ja LL(k). Erityisesti LALR(1) ja LR (1) ovat tärkeitä luokkia, koska näille tunnetaan tehokkaita jäsennystekniikoita, joita ei voida kuitenkaan soveltaa yleisesti LALR(k)-kielen jäsentämiseen. 3.1.4 Lausekielten määrittely Useimmat ohjelmointikielet voidaan esittää LR(1)-kielioppina [Backhouse 1979, sivu 172]. Matemaattisen määrittelyn sijaan lausekielen kielioppi esitetään yleensä BNF-notaatiolla, joka sallii muunmuassa loogisen TAI-operaation käytön. Usein terminaalit erotetaan ei-terminaaleista kirjoittamalla terminaalit isoilla kirjaimilla ja ei-terminaalit pienillä. Kuvassa 3.1 on esimerkki yksinkertaisesta lausekkeita kuvaavasta kieliopista. lauseke ::= tekijä tekijä + lauseke tekijä ::= termi termi * tekijä termi ::= MUUTTUJA VAKIO Kuva 3.1 Yksinkertainen kielioppi 3.1.5 Jäsennyspuu Aiemmin esitetty riittää määrittelemään yksikäsitteisesti, mitkä merkkijonot kuuluvat kieleen ja mitkä eivät. Merkkijonoa tutkittaessa voidaan rakentaa jäsennyspuu, joka esittää kuinka kieliopin sääntöjä on käytetty. Jokaista käytettyä sääntöä kuvaa solmu, ja kunkin solmun lapsina ovat rekursiivisesti jäsennyksessä käytetyt säännöt. 22

3.1.6 Yksikäsitteisyys Kielioppi on yksikäsitteinen, mikäli jokaista laillista (kieleen kuuluvaa) merkkijonoa kohti on vain yksi jäsennyspuu. Kuvan 3.1 kielioppi on esitetty yksinkertaisemmassa muodossa kuvassa 3.2. Kuvan 3.2 kielioppi ei kuitenkaan ole yksikäsitteinen. termi ::= MUUTTUJA VAKIO lauseke ::= termi termi + lauseke termi * lauseke Kuva 3.2 Monikäsitteinen kielioppi Lause i = 2 * 3 + 4 kuuluu molempiin kieliin, mutta kuvan 3.2 kieliopissa se voidaan tulkita joko muodossa i = (2 * 3) + 4 tai i = 2 * (3 + 4). 3.1.7 Presedenssi ja sitovuus Presedenssi tarkoittaa operaattoreiden (sääntöjen) keskinäistä merkitsevyysjärjestystä. Mikäli kertolaskulle määritellään yhteenlaskua korkeampi presedenssi, se suoritetaan ensin, jolloin edellisen kappaleen kieliopista saadaan yksikäsitteinen. Sitovuus määrittelee suoritusjärjestyksen vasemmalta tai oikealta aloitettavaksi. Useimmiten lausekkeet sidotaan vasemmalle, mutta muun muassa potenssilasku sidotaan oikealle. Joissakin operaatiossa sitomissuunnalla ei ole merkitystä lopputuloksen kannalta (esimerkiksi yhteenlasku). Esimerkkikielioppiin voidaan lisätä vähennyslasku esimerkiksi muuttamalla lausekkeen määrittelevää sääntöä. lauseke ::= tekijä tekijä + termi tekijä - termi 23