Luento 11 Tulkinta ja emulointi



Samankaltaiset tiedostot
Luento 11 Tulkinta ja emulointi

Jakso 11 Tulkinta ja emulointi

Java ohjelmien suoritus (3) Luento 11 Tulkinta ja emulointi. Java virtuaalikone (JVM) (5) JVM:n tietorakenteet (8) JVM:n tietorakenteet (jatkuu) (6)

Javaohjelmien suoritus (3) Jakso 11 Tulkinta ja emulointi. Java-virtuaalikone (JVM) (5) JVM:n tietorakenteet (8) JVM:n tietorakenteet (jatkuu) (6)

Luento 11 Tulkinta ja emulointi

Java ohjelmien suoritus (3) Luento 11 Tulkinta ja emulointi. Java virtuaalikone (JVM) (5) JVM:n tietorakenteet (9) JVM:n tietorakenteet (jatkuu)

Luento 11 Tulkinta ja emulointi

Java ohjelmien suoritus (3) Luento 11 Tulkinta ja emulointi

Tulkinta ja emulointi

Copyright 2018 Teemu Kerola

Tietokoneen toiminta, K Tavoitteet (4)

Jakso 12 Yhteenveto. Keskeiset asiat Teemu Kerola, K2000

Luento 1 Tietokonejärjestelmän rakenne

Java-ohjelman suoritus Java tavukoodi, Java-virtuaalikone. Java-ohjelmien emulointi ja käännös Java-suorittimet. C# ttk-91, Crusoe

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

Luento 1 Tietokonejärjestelmän rakenne

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

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

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

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

Transmeta Architecture

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

Luento 2 (verkkoluento 2) Ttk-91 järjestelmä

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

Transmeta Architecture

Luento 4 Aliohjelmien toteutus

Kertausluento luennoista 1-3 1

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

Jakso 4 Aliohjelmien toteutus

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

Luento 1 (verkkoluento 1) Tietokonejärjestelmä

Transmeta Architecture

Luento 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

Transmeta Architecture

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

Jakso 4 Aliohjelmien toteutus

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

Luento 5 (verkkoluento 5) Suoritin ja väylä

Luento 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

Luento 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

Luento 2 (verkkoluento 2) Ttk-91 järjestelmä

Luento 4 Aliohjelmien toteutus

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

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

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

Tiedon sijainti suoritusaikana. Luento 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

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

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

Luento 4 Aliohjelmien toteutus

Jakso 4 Aliohjelmien toteutus

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

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

Tietokoneen toiminta, K Tavoitteet (4)

Muistihierarkia Kiintolevyt I/O:n toteutus

Luento 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

Tietokoneen toiminta Keskeiset asiat Mitä hyötyä tästä on? Mitä seuraavaksi? Kurssit? Asiat? Teemu Kerola, Copyright 2010

Luento 4 (verkkoluento 4) Aliohjelmien toteutus

Aihepiiri Tietokoneen toiminta (Computer Organization I)

Tietokoneen toiminta (Computer Organization I)

Tietokoneen toiminta (Computer Organization I)

Tietokoneen toiminta (Computer Organization I)

Aihepiiri Tietokoneen toiminta (Computer Organization I)

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

Tietokoneen toiminta (Computer Organization I)

Luento 4 (verkkoluento 4) Aliohjelmien toteutus

Jakso 10 Ohjelman suoritus järjestelmässä

Luento 12 Yhteenveto. Keskeiset asiat Mitä hyötyä tästä on? Mitä seuraavaksi? Kurssit? Asiat? Teemu Kerola, K2000

Luento 12 Yhteenveto

Luento 12 Yhteenveto. Keskeiset asiat Mitä hyötyä tästä on? Mitä seuraavaksi? Kurssit? Asiat?

Keskeiset asiat Mitä hyötyä tästä on? Mitä seuraavaksi? Kurssit? Asiat? Teemu Kerola, Copyright Tavoitteet (4)

Luento 12 Yhteenveto. Keskeiset asiat Mitä hyötyä tästä on? Mitä seuraavaksi? Kurssit? Asiat? Teemu Kerola, Copyright 2010

Luento 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

Tietokoneen toiminta (Computer Organization I)

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

Luento 12 Yhteenveto. Keskeiset asiat Mitä hyötyä tästä on? Mitä seuraavaksi? Kurssit? Asiat? 29/01/2001 Teemu Kerola, Copyright 2001

Tavoitteet (4) Luento 12 Yhteenveto. Keskeisiä asioita. Mitä hyötyä tästä on? (2) Esimerkkikone: TTK-91 laitteisto suoritin - CPU

11/20: Konepelti auki

Luento 12 Yhteenveto

Luento 12 Yhteenveto

Tietokoneen toiminta (Computer Organization I)

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

Tietokoneen toiminta (Computer Organization I)

Jakso 5 Suoritin ja väylä

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

Tietokoneen toiminta (Computer Organization I)

Tietokoneen toiminta (Computer Organization I) Aihepiiri. Mitä hyötyä tästä on? (3) Tavoitteet. Kurssien välisiä riippuvuuksia

Tietokoneen toiminta (Computer Organization I)

Jakso 5 Suoritin ja väylä

Tietokoneen toiminta (Computer Organization I)

Luento 2 TTK-91 tietokone ja sen KOKSI simulaattori

Luento 2 TTK-91 tietokone ja sen KOKSI simulaattori

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

Jakso 5 Suoritin ja väylä. Suorittimen rakenne Väylän rakenne Käskyjen suoritussykli Poikkeukset ja keskeytykset TTK-91:n ja KOKSI:n rakenne

Tietokoneen toiminta (Computer Organization I)

Aihepiiri Tietokoneen toiminta (Computer Organization I) Tavoitteet (4) Mitä hyötyä tästä on? (4) Kurssien välisiä riippuvuuksia

Tietokoneen toiminta (Computer Organization I)

Tiedon esitysmuodot. Luento 6 (verkkoluento 6) Lukujärjestelmät Kokonaisluvut, liukuluvut Merkit, merkkijonot Äänet, kuvat, muu tieto

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

Transkriptio:

Luento 11 Tulkinta ja emulointi Tulkinta ja emulointi Java ohjelman suoritus, tulkinta ja kääntäminen Suorittimen emulointi C#, ttk-91, Crusoe 1 Java ohjelmien suoritus (3) Java virtuaalikone SW HW Java tulkki Pentium II suoritin ( esimerkiksi) SW HW instr iload i iload j iadd istore k Java suoritin k = i+j; Java ohjelma Java käännös iload i iload j iadd istore k natiiviympäristö Java byte-koodi (JIT) käännös instr latausmoduuli Pentium II suoritin SW HW 2 Luento 11, Tulkinta ja emulointi 1

Java virtuaalikone (JVM) (5) Hypoteettinen suoritin, toteutus eri tavoilla Geneerinen, sitä on helppo simuloida kaikilla todellisilla suorittimilla käännökseen tai tulkitsemiseen perustuva suoritus Useita säikeitä (thread) voi olla samanaikaisesti suorituksessa suorittimen mikroaikaskaalassa vain yksi kerrallaan Tietorakenteet mm. virtuaalikoneen suorittimen rekisterit luodaan JVM:n käynnistämisen yhteydessä Käskyt virtuaalikoneen suorittimen konekäskyt 226 käskyä á 32 bittiä 3 JVM pino JVM:n tietorakenteet ks. Fig. 4-10 [Tane99] kuten tavallinen AT-pino koostuu useista kehyksistä (frames) (vrt. aktivointitietue) ja operandipinosta käyttö: kehyksille ainoastaan push/pop operaatiot, operandipinon alkioille myös push/pop ei tarvita yhtenäistä muistialuetta allokoidaan keosta (heap) toteutuksesta riippuen rajallinen tai dynaamisesti laajennettavissa tila loppu StackOverflowError, OutOfMemoryError http://java.sun.com/docs/books/vmspec/2nd-edition/html/vmspectoc.doc.html 4 Luento 11, Tulkinta ja emulointi 2

JVM:n tietorakenteet (jatkuu) JVM keko (JVM heap) yhteinen kaikille saman virtuaalikoneen säikeille automaattinen roskienkeruu (garbage collector) ei-käytössä (implisiittisesti vapautettu ) oleva muistialue palautetaan uusiokäyttöön (vapaaksi) ei tarvita erikseen free operaatiota Java ohjelmassa voi hidastaa suoritusta milloin vain (ongelma?) toteutuksesta riippuen kiinteän kokoinen tai dynaamisesti laajennettavissa ei tarvitse muodostaa yhtenäistä muistialuetta natiivijärjestelmän keossa tila loppu OutOfMemoryError 5 JVM:n tietorakenteet (jatkuu) JVM metodialue (JVM Method Area) yhteinen kaikille JVM säikeille vastaa tavallista kääntäjän tuottamaa koodisegmenttiä loogisesti osa JVM kekoa toteutuksesta riippuen kiinteän kokoinen tai dynaamisesti laajennettavissa tila loppu OutOfMemoryError ks. Fig. 4-10 [Tane99] 6 Luento 11, Tulkinta ja emulointi 3

JVM:n tietorakenteet (jatkuu) Javan suoritusaikainen vakioallas (runtime constant pool) joka luokalle (class) ja liittymälle (interface) suoritusaikainen esitystapa tiedoston class constant_pool -taulukolle vastaa vähän tavallista symbolitaulua useita erilaisia vakioita (käännösaikaiset literaalit, suor. aikana ratkottavat attribuutit, ) talletetaan JVM metodialueelle tila loppu OutOfMemoryError ks. Fig. 4-10 [Tane99] 7 JVM:n tietorakenteet (jatkuu) Natiivimetodien pinot (Native Method Stacks) toteutus voi käyttää tavallisia pinoja ( C stacks ) sellaisten natiivimetodien tukena, jota ei ole kirjoitettu Javalla käytetään myös Java tulkin toteutuksessa ei JVM toteutuksissa, joissa ei natiivimetodeja toteutuksesta riippuen kiinteän kokoinen tai dynaamisesti laajennettavissa tila loppu StackOverflowError, OutOfMemoryError 8 Luento 11, Tulkinta ja emulointi 4

JVM:n tietorakenteet (jatkuu) JVM rekisterit PC osoittaa johonkin JVM metodialueelle CPP osoittaa vakioaltaaseen ks. Fig. 4-10 [Tane99] LV on paikallisten muuttujien kantaosoite (vähän kuten FP ttk-91:ssä) SP osoittaa JVM operandipinon huipulle kaikki rekisterit implisiittisiä, niitä ei erikseen nimetä JVM konekäskyissä 9 JVM:n tietorakenteet (jatkuu) JVM kehys (frame, raami) talletetaan JVM pinoon, luodaan metodin kutsun yhteydessä, vapautetaan metodista poistuttaessa paikalliset muuttujat parametrit, paluuarvo ja välitulokset dynaamisen linkityksen toteutusväline keskeytysten toteutusväline ks. Figs 4-12, 4-13 [Tane99] 10 Luento 11, Tulkinta ja emulointi 5

JVM kehyksen data (1) Paikalliset muuttujat sisältävä taulukko ks. Fig. 4-13 [Tane99] viittaukset indeksoituna (0, 1, 2, ) rekisterin LV suhteen indeksit sanoina kaksi sanaa vaativa muuttuja (long, double) sijoitetaan kahteen peräkkäiseen (32 bittiseen) sanaan big-endian talletus Parametrit, paluuarvon ja välitulokset sisältävä operandipino SP osoittaa pinon huipulle pinoarkkitehtuuri (vs. rekisteriarkkitehtuuri) 11 JVM:n tiedon osoitusmoodit (4) Välitön operandi Indeksoitu iinc 2 34 Java: xloc += 34; iinc 2 34 tehollinen muistiosoite (LV) + 2 Pino-osoitus iadd ks. Fig. 4-9 [Tane99] Java: a1 = a2+a3; korvaa pinon kaksi päällä olevaa kokonaislukua niiden summalla Taulukkoosoitus pinon kautta aload 1 iload 2 iaload istore 3 Korvaa pinon pinnalla olevat taulukon alkuosoite ja indeksi k.o. taulukon alkiolla Java: a = T[i]; 12 Luento 11, Tulkinta ja emulointi 6

JVM käskyt Peruslaskutoimitukset ks. Fig. 5-36 [Tane99] add, sub, mul, div, rem, neg Boolean and, or, xor, shl, shr, ushr Pinon hallinta dup, pop, swap, tauluk. luonti, esitystavan muutokset Load/Store load, aload, store, astore, push-käskyt Vertailut Kontrollinsiirrot Muut 13 14 Luento 11, Tulkinta ja emulointi 7

Java tulkki Emuloi JVM konekielen käskyjä (byte-koodia) Yksi (byte-koodi) käsky kerrallaan JVM rekisterit ja muistialueet emuloitu tulkin tietorakenteina muistissa vrt. KOKSI ja TTK-91 Hidasta, mutta joustavaa iload 1 iload 2 iadd istore 3 Java tulkki data JMV: pino, keko metodialue, vakioallas, rekist, etc etc Pentium II suoritin 15 Käännös natiivikoneelle (a) Käännetään tavukoodi suoraan natiivikoneen konekielelle ja suoritetaan se normaalin ohjelman tapaan (b) Käännetään tavukoodi ensin korkean tason kielelle (esim C), joka sitten käännetään natiivikoneen konekielelle alkuosa riittää tehdä kerran loppuosa on jo valmiina yleensä Ongelma: dynaaminen linkitys iload 1 iload 2 iadd istore 3 dl latausmoduuli käännös data Pentium II suoritin 16 Luento 11, Tulkinta ja emulointi 8

JIT = Just-in-Time Emulointi ja/tai käännös tilanteesta riippuen Käännä luokka natiivikonekielelle dynaamisesti linkitettäväksi moduuliksi, mutta vasta juuri ennen luokan metodin kutsua Tarvitsee paljon muistia Voi hidastaa suoritusta, jos käännökseen menee enemmän aikaa kuin tulkitsemiseen käännös vasta 2. kutsukerralla? JVM rekisterit ja muistialueet emuloitu tulkin tietorakenteina, joita natiivikoodi myös käyttää Java JIT käännös JIT käännös dl latausmoduuli iload i iload j iadd istore k data Java tulkki Pentium II suoritin 17 Java suoritin: Sun PicoJAVA II Suorittimen määrittely, jonka mukaisessa koneessa byte-koodi -muodossa olevia ohjelmia voidaan sellaisenaan suorittaa Valinnainen välimuisti ja liukulukusuoritin Kaikki 226 JVM konekäskyä jotkut käskyt toteutettu aliohjelmilla, jotka aktivoidaan keskeytyskäsittelymekanismin avulla Myös 115 muuta konekäskyä käyttöjärjestelmän ja muiden ohjelmointikielten toteuttamiseksi 18 Luento 11, Tulkinta ja emulointi 9

PicoJAVA II pino 64 (välimuisti-) laiterekisteriä JVM pinon huipun talletukseen loput JVM pinosta muistissa rekisterit (cache) 64 muisti Shawn Lauzon, Survey of the JavaChip 19 PicoJAVA II rekisterit 25 rekisteriä á 32 bittiä PC, LV, CPP, SP (pino kasvaa alaspäin) OPLIM alaraja SP:lle; alitus aiheuttaa keskeytyksen FRAME osoittaa paikallisten muuttujataulukon jälkeen talletettuun metodin paluuosoitteeseen PSW (tilarekisteri) rekisteri, joka kertoo pinon välimuistirekistereiden tämänhetkisen käytön 4 rekisteriä keskeytysten ja break-point ien käsittelyyn 4 rekisteriä säikeiden hallintaan 4 rekisteriä C ja C++ ohjelmien toteutukseen 2 rajarekisteriä sallitun muistialueen rajoittamiseen suorittimen version numero ja konfiguraatiorekisterit 20 Luento 11, Tulkinta ja emulointi 10

PicoJAVA ylim. käskyt Read/write ylimääräisille rekistereille Osoittimien manipulointikäskyt mitä tahansa muistialuetta voidaan suoraan lukea/kirjoittaa tarvitaan C/C++ varten C/C++ aliohjelmien kutsu ja paluukäskyt Natiivi HW manipulointi tyhjennä välimuisti (osittain? kokonaan?),... Muut käskyt power on/off,... 21 PicoJAVA toteutuksia (2) Sun microjava 701 valinnainen välimuisti oma muistiväylä PCI väylä muille laitteille 16 ohjelmoitavaa I/O johdinta näppäimet, LEDit, 3 ohjelmoitavaa ajastinta ( kellolaitekeskeytykset) suunnattu halpoihin kannettaviin laitteisiin (kämmenmikro, PDA - Personal Digital Assistant) Sun ultrajava nopeampi, parempi, kalliimpi, suunnattu grafiikka- ja multimediasovelluksiin 22 Luento 11, Tulkinta ja emulointi 11

Muita Java-suorittimia JEM (Rockwell Collins) PSC1000 (Patriot Scientific) dsys (Saksa), lääketieteellisiä laitteita MJ501 (LG Semicon) TV, älykortit JSR-001, Real-Time Specification for Java (Java Community Process, Sun Microsystems ) ajile: aj-80, aj-100, älykkäät liikkuvat laitteet ks. aj100-wrp kuva 23 Sun MAJC MAJC -Microprocessor Architecture for Java Computing suoritinarkkitehtuurin määrittely tavoitteena suuri nopeus Java, C ja C++ sovelluksille suunnattu multimediasovelluksiin verkossa tukee hyvin JIT-käännöstä 24 Luento 11, Tulkinta ja emulointi 12

MAJC toteutus: MAJC 5200 1-4 suoritinta (2 suorittimen lastu, v. 1999) Useiden (peräkkäin kutsuttavien) metodien samanaikainen suoritus eri suorittimilla ennakoivalle (speculative) suoritukselle oma kasa peruutus (rollback), jos ennakoitu suoritus meni pieleen 4 säiettä suorituksessa per suoritin säikeen vaihto nopeampaa kuin muistista luku! laiterekisterit 4:lle säikeelle! (hyper-threaded processor) välimuistin hudin aikana suoritetaan muita säikeitä VLIW arkkitehtuuri 4 konekäskyä samanaikaisesti Suunnattu interaktiiviseen TV:hen, virtuaalitodellisuussovelluksiin,... 25 26 Luento 11, Tulkinta ja emulointi 13

C# eli C sharp (1) C# Javan kaltainen kieli kehittäjä: Anders Hejlsberg (Turbo Pascal, Delphi, J++) osa Microsoftin.Net -ympäristöä Mono open source.net for Linux www.go-mono.com nivoutuu hyvin Windows XP:n kanssa ECMA (European Computer Manufacturers Association) standardi (MS, HP ja Intel) MSIL virtuaalikoneen konekieli Microsoft Intermediate Language sopiva välikieli kaikille korkean tason kielille: C, C++, Pascal, Java, C#, Visual Basic suoritus ainoastaan (JIT) käännösten avulla CLR virtuaalikone (Common Language Runtime) 27 28 Luento 11, Tulkinta ja emulointi 14

TTK-91 Emulointi TTK-91 konekielen emulointi KOKSI simulaattorin osa Yksi käsky kerrallaan TTK-91 koneen rekisterit ja muisti emuloitu tulkin tietorakenteina ks. simulaattorin koodi, luento 5 (kurssikansio) load R1, 234 add R1, =5 mul R1, R2 data TTK-91 emulaattori Pentium II suoritin 29 30 Luento 11, Tulkinta ja emulointi 15

Transmetan Crusoe suoritin (8) x86 konekielen emulointi, JIT käännös Natiivi käskykantaa ei ole tärkeä nopeampi, sama teknologia? yhtä nopea, vähemmän virtaa Monta x86 käskyä yhtä aikaa paloiteltuna emuloinnissa, sekajärjestyksessä x86 rekisterit emuloitu natiivijärjestelmän laiterekistereillä x86 muisti emuloitu rekistereiden avulla suojattuna tietorakenteina Tarkat keskeytykset: suorituksen peruutus uusi käännös hitaalle koodille uusi hidas tarkka emulointi movl %esp, %ebp subl $4, %esp pushl %eax data pääohjelma dl latausmoduuli Crusoe suoritin 31 Crusoe emulaattorin suoritus muisti emulaattori ohjelma LDA R1, =543 ADD R2, R4, R5 data x86-ohjelma mov %exc1, >%ebp+0xc! add %eax!, #4 välimuisti konekäskyjen suorituspiirit JIT käännös laiterekisterit x86 koneen laiterekisterit Crusoe suoritin 32 Luento 11, Tulkinta ja emulointi 16

Crusoe suorittimen looginen rakenne emuloitava käyttöjärjestelmä Morph-host emulaattori Koodin generaattori data Natiivi käyttöjärjestelmä emuloitava sovellus Käännöspuskuri Tapahtumaperustainen pääohjelma data HW - laitteisto konekäskyt keskeytykset 33 suoritin vahvistetut x86 laiterekisterit konekäskyjen suorituspiirit omat laiterekisterit TLB Crusoe suorittimen fyysinen rakenne emuloidut x86 laiterekisterit välimuisti muisti emuloitava käyttöjärjestelmä natiivi käyttöjärjestelmä? emuloitava sovellus ALIASrekisterit muistipuskuri käännöspuskuri? koodin generaattori emulaattori muistiväylä 34 Luento 11, Tulkinta ja emulointi 17

-- Luennon 11 loppu -- 35 Luento 11, Tulkinta ja emulointi 18