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

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

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

Luento 1 Tietokonejärjestelmän rakenne

Luento 1 Tietokonejärjestelmän rakenne. Järjestelmän eri tasot Laitteiston nopeus

Virtualisointiympäristössä on kolme pääosaa: isäntä (host), virtualisointikerros ja vieras (guest).

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

Luento 1 Tietokonejärjestelmän rakenne

Luento 1 Tietokonejärjestelmän rakenne. Järjestelmän eri tasot Laitteiston nopeus

4. Lausekielinen ohjelmointi 4.1

Käännös, linkitys ja lataus

Ohjelmointi 1 / syksy /20: IDE

Dynaaminen kääntäminen ja Java HotSpot

5. HelloWorld-ohjelma 5.1

Älysopimusten kehittäminen. Sopimus suuntautunut ohjelmointi

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

Algoritmit 1. Luento 3 Ti Timo Männikkö

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

Jakso 12 Yhteenveto. Keskeiset asiat Teemu Kerola, K2000

Tietokoneen toiminta, K Tavoitteet (4)

5. HelloWorld-ohjelma 5.1

Jakso 4 Aliohjelmien toteutus

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli

Luento 3 (verkkoluento 3) Ttk-91 konekielinen ohjelmointi. Ohjelman esitysmuoto Konekielinen ohjelmointi ttk-91:llä (Titokone, TitoTrainer)

Tieto ja sen osoite (3) Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI) Osoitinmuuttujat. Tieto ja sen osoite (5)

C++ Kuva 1-1. C- ja C++ kielien perustana olevat kielet.

Ohjelmointi 1. Kumppanit

Tulkinta ja emulointi

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

Luento 1 (verkkoluento 1) Ohjelman sijainti Ohjelman esitysmuoto Laitteiston nopeus

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

HELIA 1 (17) Outi Virkki Käyttöliittymät ja ohjelmiston suunnittelu

ITKA203 Käyttöjärjestelmät, kesä Kesäkurssi Opettaja: Paavo Nieminen

1. Keskusyksikön rakenne

Luento 1 (verkkoluento 1) Tietokonejärjestelmä

Ohjelmoinnin perusteet Y Python

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

Kertausluento luennoista 1-3 1

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

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

ASM-kaavio: reset. b c d e f g. 00 abcdef. naytto1. clk. 01 bc. reset. 10 a2. abdeg. 11 a3. abcdg

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

Ohjelmoinnin peruskurssien laaja oppimäärä

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

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

Luento 4 Aliohjelmien toteutus

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

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

Kertausluento 1 (lu01, lu02, lu03) Tietokonejärjestelmän rakenne ttk-91 ja sillä ohjelmointi

Tietokoneen toiminta, Kevät Copyright Teemu Kerola Järjestelmän eri tasot Laitteiston nopeus

Monipuolinen esimerkki

Jakso 10 Ohjelman suoritus järjestelmässä

ELM GROUP 04. Teemu Laakso Henrik Talarmo

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

15. Ohjelmoinnin tekniikkaa 15.1

Oppimistavoitteet kurssilla Tietokoneen toiminta

Muunnelmia Turingin koneista sekä muita vaihtoehtoisia malleja

Luento 10 Käännös, linkitys ja lataus

15. Ohjelmoinnin tekniikkaa 15.1

811312A Tietorakenteet ja algoritmit, , Harjoitus 3, Ratkaisu

Luento 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

Solidity älysopimus ohjelmointi. Sopimus suuntautunut ohjelmointi

PRINCIPLES OF PROGRAMMING LANGUAGES - DEBUGGER

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

Teemun juustokakku Rekisterien, välimuistin, muistin, levymuistin ja magneettinauhan nopeudet suhteutettuna juuston hakuaikaan juustokakkua tehdessä?

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

Luento 10 Käännös, linkitys ja lataus. Käännös Linkitys Dynaaminen linkitys Lataus

Johdanto kurssin sisältöön

Jakso 10 Ohjelman suoritus järjestelmässä. Käännös Linkitys Dynaaminen linkitys Lataus

Lausekielestä suoritukseen (3) Luento 10 Käännös, linkitys ja lataus. Assembler-kielinen käännösyksikkö (2) Käännösyksikkö (4) Objektimoduuli (8)

Luento 10 Käännös, linkitys ja lataus

GIS-automatisointi ja ohjelmointi/skriptaus. Harri Antikainen

Jakso 10 Ohjelman suoritus järjestelmässä

2 Konekieli, aliohjelmat, keskeytykset

7/20: Paketti kasassa ensimmäistä kertaa

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

Jakso 4 Aliohjelmien toteutus

TIES325 Tietokonejärjestelmä. Jani Kurhinen Jyväskylän yliopisto Tietotekniikan laitos

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

13/20: Kierrätys kannattaa koodaamisessakin

.NET ja C# Virtuaalikone. Common Language Infrastructure (CLI) Periaate. Etuja. Haittoja. Mikä on CLI. CLI standardin merkitys (CLS, Ecma)

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

Harjoitustehtävät ja ratkaisut viikolle 48

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI) Muuttujat Tietorakenteet Kontrolli Optimointi Tarkistukset

Aktivaatiotietue. Yleiskäsite funktio (aliohjelma) -mekanismin tarvitsemille tiedoille. Kehysosoitin (%fp) missä tiedot ovat

Tiedon sijainti suoritusaikana (3) Luento 3 Konekielinen ohjelmointi (TTK-91, KOKSI) Miten tietoon viitataan? (4)

3. Muuttujat ja operaatiot 3.1

Jakso 4 Aliohjelmien toteutus. Tyypit Parametrit Aktivointitietue (AT) AT-pino Rekursio

Kemian tekniikan kandidaattiohjelman ohjelmointikurssi (5 op)

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

T harjoitustyö, kevät 2012

Luento 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

Luento 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

Sisällys. 16. Ohjelmoinnin tekniikkaa. Aritmetiikkaa toisin merkiten. Aritmetiikkaa toisin merkiten

Tietokoneen toiminta (Computer Organization I)

Luento 3 Konekielinen ohjelmointi (TTK-91, KOKSI) Muuttujat Tietorakenteet Kontrolli Optimointi Tarkistukset

Transkriptio:

Virtuaalikoneiden generointi Vmgen-kääntäjällä Risto Saarelma Helsinki 18.4.2005 Ohjelmointikielten kääntäjät -kurssi HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

1 Johdanto 1 Virtuaalikoneet ovat tekniikka, jota käytetään usein tulkattavien ohjelmointikielten tai useammilla laitealustoilla ajettavien käännettyjen ohjelmien toteuttamiseen. Virtuaalikone muuttaa ohjelmakoodia laskentaoperaatioiksi aivan kuten fyysinenkin suoritin, mutta se on toteutettu ohjelmallisesti eikä fyysisellä elektroniikalla. Tämä artikkeli käsittelee virtuaalikoneita ja niiden toteuttamista Vmgen-kääntäjällä. Vmgen:in kuvaus perustuu lähteeseen [EGKP02]. 2 Virtuaalikoneet Virtuaalikone on fyysisessä tietokoneessa ajettava ohjelma, joka suorittaa virtuaalikoneelle käännettyä tavukoodia. Virtuaalikone voi olla emulaattori, joka suorittaa jonkin olemassaolevan fyysisen suorittimen konekieltä mielivaltaisella alustalla, tai se voi perustua suoritusarkkitehtuuriin, jota ei ole toteutettu missään fyysisessä suorittimessa. Tässä artikkelissa keskitytään jälkimmäiseen tyyppiin, eli puhtaasti virtuaalisiin arkkitehtuureihin. Virtuaalikoneen toteutustavassa yksi perustavanlaatuinen valinta on, tehdäänkö sen arkkitehtuurista rekisteripohjainen ja pinopohjainen. Ero koskee sitä, miten kone säilyttää käsittelemiään tietoalkioita. Rekisteripohjaisessa arkkitehtuurissa tietoalkiot säilötään joukkoon nimettyjä muistipaikkoja (eli rekistereitä), kun taas pinopohjaisessa arkkitehtuurissa alkioita säilytetään pinotietorakenteessa. Fyysiset suorittimet ovat pääsääntöisesti rekisteripohjaisia. Vaikka se muistuttaakin vähemmän fyysisiä suorittimia, pinopohjainen arkkitehtuuri on kuitenkin yksinkertaisempi ja sille on helpompi generoida koodia. Virtuaalikonearkkitehtuurit, esimerkiksi Javan JVM, ovatkin usein pinopohjaisia. Myös Vmgenkääntäjä on suunniteltu erityisesti pinopohjaisten virtuaalikoneiden tuottamiseen. 2.1 Virtuaalikoneiden käyttö Virtuaalikone on usein hyvä ratkaisu ohjelmissa, joissa halutaan suorittaa vasta ohjelman ajon aikana tulkattavaa ohjelmakoodia. Toinen käyttötarkoitus on saman käännetyn tavukoodin alustariippumaton suorittaminen. Koska virtuaalikone on toteutettu ohjelmallisesti, se toimii täysin samalla tavalla millä tahansa fyysisellä suoritinarkkitehtuurilla. Ohjelmallinen toteutus tuottaa myös vakiosuuruisen hidastuksen virtuaalikoneella ajettavan ohjelman suoritukseen. Vmgen:in tuottamat virtuaalikoneet suorittavat ohjelmia noin kymmenen kertaa hitaammin kuin fyysinen suoritin.

2 Tulkattavan ohjelmointikielen suoritus on hyvin luonteva sovellus virtuaalikoneelle. Yksinkertaisia komentosarjoja voidaan suorittaa jäsentämällä ne ja käynnistämällä toimintoja suoraan jäsentäjästä. Vuorovaikutteinen komentorivitulkki voi aivan hyvin toimiakin näin. Jos ohjelmointikielessä on kuitenkin silmukkarakenteita, päädytään tilanteeseen jossa samat lauseet on jäsennettävä yhä uudelleen. Käytännössä tämä on hyvin tehotonta. Selväkielinen ohjelma on muunnettava johonkin tehokkaammin suoritettavaan muotoon. Paras suorituskyky olisi saavutettavissa jos tulkattava kieli voitaisiin muuntaa suoritusalustan konekieleksi 1. Tehokkaan konekielen tuottaminen on kuitenkin usein varsin monimutkaista. Tämä ratkaisu olisi myöskin sidoksissa yhteen tiettyyn suoritusalustaan, ja ohjelmien halutaan hyvin usein toimivan useammilla alustoilla. Useimmissa tapauksissa siis tulkkiohjelmaan kannattaa rakentaa virtuaalikone, jonka ymmärtämäksi tavukoodiksi tulkattavan kielen ohjelmat käännetään. Tavukoodin suoritus on suoraviivaista, ja ohjelmakoodin jäsentämiseen verrattuna varsin tehokasta. 3 Vmgen-kääntäjä Virtuaalikoneen ohjelmointi käsin on työlästä. Jokaista virtuaalikonekäskyä kohden on kirjoitettava paljon samanlaisena toistuvaa boilerplate-koodia. Kaikkien operaatioiden on käsiteltävä virtuaalikoneen pinoa, ja niiden olisi myös hyvä tarjota tukea profiloinnille, virtuaalikoodin disassembloinnille ja debuggaukselle. Virtuaalikoneen tehottoman ja virhealttiin käsin C-kielellä ohjelmoinnin sijasta voidaan käyttää Vmgen-kääntäjää, joka tuottaa korkean tason pinokonekuvauksesta C-kielisen lähdekoodin. 3.1 Vmgen:in kuvauskielestä Vmgen-kuvauksessa esitetään käskyn nimi, tätä vastaava pino-operaatio ja käskyyn liittyvä C-koodi. Vähennyslaskuoperaatiota kuvaa seuraava katkelma: sub ( i1 i2 -- i ) i = i1 - i2; 1 Tässä vaiheessa ei oikeastaan enää ole järkevää puhua tulkatusta kielestä. Nykyiaikaiset JITkääntämistekniikat tosin saattavat tehdä tulkatun ja käännetyn ohjelmakoodin eron käytännössäkin jonkin verran sumeaksi.

3 Käsky sub nostaa pinosta kaksi päällimmäistä arvoa nimillä i1 ja i2 ja painaa näiden tilalle arvon i. Tätä vastaava C-kielinen lause taas kertoo, että i:hin sijoitetaan i1:n ja i2:n erotus. Vmgen siis tuottaa virtuaalikoneen takaosan. Käskyt joita koneelle syötetään on tuotettava itse, korkean tason ohjelmakoodia jäsentämällä tai muilla keinoin. Vmgen-ohjelman tulkkiesimerkissä tämä osuus on toteutettu lexillä ja yaccilla rakennetulla yksinkertaisella parserilla. Vmgen tukee useampaa pinoa ja mahdollistaa myös käskyvuon käsittelemisen eräänlaisena pinona. Esimerkiksi käskyvuosta luetun vakioarvon työntäminen pinoon tapahtuu seuraavalla syntaksilla: push ( #i -- i) 3.2 Ylikäskyt Käskyjä jotka toistuvat virtuaalikoneen suorituksessa usein perättäin voidaan yhdistää ylikäskyiksi engl. superinstructions. Tämä vähentää virtuaalikoneen suoritusaskelten määrää ja nopeuttaa siten suoritusta. Vmgen:in profiloijaa käyttämällä voidaan tarkastella mitkä perättäisten käskyjen sarjat toistuvat erityisen usein. Ylikäskyt määritellään yksinkertaisesti luettelemalla ylikäskyä vastaava käskyjono: push_add = push add 3.3 Rekisteripohjaisten virtuaalikoneiden toteuttamisesta Jos halutaan virtuaalikoneen käyttävän pinon sijasta rekistereitä, yksi ratkaisumalli on jättää pino kokonaan käyttämättä ja antaa käskyvuossa rekisteritunnuksia. Esimerkiksi vähennyslaskuoperaatio esitettäisiin tällöin seuraavasti: sub ( #isrc1 #isrc2 #idest -- ) reg[idest] = reg[isrc1] - reg[isrc2]; Toinen mahdollisuus on toteuttaa hybridiratkaisu, jossa käytössä ovat sekä pino että rekisterit, ja rekistereihin on alkeiskäskyjen tasolla pääsy vain rekisteristä pinoon lukevalla load-käskyllä ja rekisteriin pinosta kirjoittavalla store-käskyllä. Muut rekisterejä käyttävät käskyt toteutetaan ylikäskyinä:

4 rsub = load load sub store 4 Vmgen:in toteutuksesta Virtuaalikoneella ei koskaan päästä samaan suorituskykyyn kuin fyysisen suoritinarkkitehtuurin konekielellä, koska virtuaalikoodia suoritettaessa fyysinen suoritin joutuu virtuaalikoodin operaation lisäksi suorittamaan virtuaalikoneen vaatimia operaatioita. Virtuaalikoneen toteutustapa voi kuitenkin vaikuttaa hidastuskertoimeen hyvin merkittävästi. Vmgen:in kehittäjät väittävät että ero naiivin ja tehokkaan toteutuksen välillä voi olla 1000-kertaisen hidastumisen kaventuminen 10-kertaiseksi [EGKP02]. Vmgen:issä onkin pyritty mahdollisimman tehokkaaseen toteutukseen. Vmgen käyttää esimerkiksi seuraavia optimointitekniikoita [EGKP02]: säikeistetty koodi pinon päällimmäisen arvon säilyttäminen rekisterissä virtuaalikäskyjen yhdistäminen ylikäskyiksi muuttumattomien pinoarvojen tallettamisen sivuuttaminen ja seuraavan virtuaalikäskyn aikataulutus haaranennakointitarkkuuden parantaminen. 4.1 Säikeistetty koodi Säikeistetyllä koodilla engl. threaded code ei tässä yhteydessä tarkoiteta rinnakkaisohjelmoinnin säikeistystä, vaan James R. Bellin [Bel73] kehittämää ohjelmointitekniikkaa, jossa virtuaalikäskyjen esitys muistissa on käskyä vastaavan aliohjelman muistiosoite. Tällä tekniikalla vältytään operaatiolta, jossa etsitään käskykoodia vastaava aliohjelma, koska aliohjelman osoite on jo suoraan käskykoodissa. Tekniikkaa ei voida toteuttaa ANSI C:llä, mutta GNU C:n labels-as-values -laajennuksella kylläkin [EGKP02]. 4.2 Pinon päällimmäisen arvon säilyttäminen Vmgen voi haluttaessa säilyttää virtuaalikoneen pinon päällimmäistä arvoa fyysisen suorittimen rekisterissä virtuaalikoodin suorituksen aikana. Tämä nopeuttaa suoritusta, kos-

5 ka pinohakuja tarvitaan vähemmän. Jos vain Vmgen:in generoima koodi käsittelee pinoa, tämä optimointi ei näy virtuaalikonekoodin käyttäjälle. Jos pinoa kuitenkin halutaan käsitellä eksplisiittisesti, esimerkiksi siirtämällä pino-osoitinta, on samalla huolehdittava siitä että säilötty päällimmäinen arvo pysyy oikeana tai vaihtoehtoisesti kytkettävä tämä optimointi pois päältä. 4.3 Muuttumattomien pinoarvojen talletus Jos käskykuvauksen pinomuunnoksessa sekä vanhassa että uudessa pinossa on sama arvo, naiivi toteutus kirjoittaisi uuden pinon arvon itsensä päälle. Esimerkiksi käskyssä dup ( i -- i i ) kirjoitettaisiin i pinoon kahteen kertaan, vaikka vain yksi kirjoitus olisi tarpeen. Vmgen osaa tarkastella pinokuvauksia, ja jos sama symboli esiintyy sekä lähtö- että tulospinossa, se jättää sen kirjoittamatta. Vmgen:in on huomioitava onko pinon päällimmäisen arvon säilyttäminen rekisterissä käytössä. Tässä tapauksessa arvo on talletettava rekisteristä muistiin, eikä tätä optimointia voida käyttää. Muuttumattomien arvojen talletuksen poistaminen ei myöskään toimi ylikäskyjen sisällä. 4.4 Muut parannukset Virtuaalikäskyjen aikataulutus ja haaraennakointi ovat parannuksia, jotka liittyvät C-kääntäjän tapaan optimoida koodia ja konekielikoodin tehokkaaseen suoritukseen. Tarkemmat toimintaperiaatteet eivät täysin minulle auenneet. 5 Lopuksi Julkaisu [EGKP02] käy läpi vaihtoehtoisia virtuaalikonegeneraattoreita, mutta pitää Vmgen:iä näitä ilmaisukykyisempinä. Useat muut virtuaalikoneprojektit on tehty yhden virtuaalikonearkkitehtuurin tarpeisiin, kun taas Vmgen on suunniteltu yleispätevämmäksi ja sille on olemassa toteutukset ainakin Java- ja Forth-virtuaalikoneille. Vmgen:in ratkaisu, jossa virtuaalikäskyjä vastaavat mielivaltaiset C-lauseet, tekee siitä ilmeisesti useita muita virtuaalikonejärjestelmiä ilmaisuvoimaisemman. On olemassa myös erilaisia matalan tason koodingenerointikirjastoja, mutta nämä eivät automatisoi erityisesti virtuaalikoneen tarvitsemia toimintoja samalla tapaa kuin Vmgen.

Lähteet 6 Bel73 Bell, J. R., Threaded code. Communications of the ACM, 16,6(1973), 370 372. EG02 Ertl, M. A. Gregg, D., Building an interpreter with vmgen. Computational Complexity, 2002, 5 8, URL http://citeseer.ist.psu.edu/ertl02building.html. EGKP02 Ertl, M. A., Gregg, D., Krall, A. Paysan, B., Vmgen a generator of efficient virtual machine interpreters. Software Practice and Experience, 32,3(2002), 265 294. URL http://citeseer.ist.psu.edu/470069.html.