Java Virtuaalmasin. JVM tutvustus Java baitkood CMa ja JVM sarnasused ja erinevused

Seotud dokumendid
loeng2

Andmed arvuti mälus Bitid ja baidid

PowerPointi esitlus

SQL

(loeng3-ohtlikud_koodiloigud)

loeng7.key

Infix Operaatorid I Infix operaatorid (näiteks +) ja tüübid (näiteks ->) kirjutatakse argumentide vahele, mitte argumentide ette. Näiteks: 5 + 2, 2*pi

I Generaatori mõiste (Java) 1. Variantide läbivaatamine Generaator (ehk generaator-klass) on klass, milles leidub (vähemalt) isendimeetod next(). Kons

Microsoft Word - essee_CVE ___KASVANDIK_MARKKO.docx

Operatsioonisüsteemide ehitus

TARTU ÜLIKOOL Arvutiteaduse instituut Informaatika õppekava Mirjam Iher Nõrgima eeltingimuse staatiline analüüs pinukeeltele Bakalaureusetöö (9 EAP) J

Tartu Ülikool

PHP

Scala ülevaade 1 Meetodid, muutujad ja väärtused. Süntaks 2 Lihtsad tüübid ja väärtused. 3 OOP, case-klassid ja mustrisobitus. 4 Puhta Scala väärtusta

Pealkiri

PowerPointi esitlus

Funktsionaalne Programmeerimine

Microsoft Word - ref - Romet Piho - Tutorial D.doc

SQL

Algoritmid ja andmestruktuurid

Mida räägivad logid programmeerimisülesande lahendamise kohta? Heidi Meier

TARTU ÜLIKOOL MATEMAATIKA-INFORMAATIKATEADUSKOND Arvutiteaduse instituut Infotehnoloogia eriala Roman Jagomägis Programmeerimiskeel privaatsust säilit

Andmeturve

Operatsioonisüsteemi ülesanded

HAJUSSÜSTEEMID HAJUSSÜSTEEMID Kaugprotseduurid IDL kompileerimine ONCIDLnäide CORBAIDLnäide MIDLnäide DCERPCmuidomadusi XML-RPC JSON-RPC REST document

Sügis 2018 Kõrgema matemaatika 2. kontrolltöö tagasiside Üle 20 punkti kogus tervelt viis üliõpilast: Robert Johannes Sarap, Enely Ernits, August Luur

Tartu Ülikool Loodus- ja täppisteaduste valdkond Arvutiteaduse instituut Sandra Puusepp CVE Referaat Tartu 2018

ITI Loogika arvutiteaduses

MTAT Operatsioonisüsteemid - Turvalisus

Programmeerimiskeel APL Raivo Laanemets 17. mai a.

1 / loeng Tekstitöötlus Sisend/väljund Teksti lugemine Sõnad

tallinn arvudes 2003.indd

SAF 7 demo paigaldus. 1.Eeldused SAF 7 demo vajab 32- või 64-bitist Windows 7, Window 8, Windows 10, Windows Server 2008 R2, Windows Server 2012, Wind

DIGITAALTEHNIKA DIGITAALTEHNIKA Arvusüsteemid Kümnendsüsteem Kahendsüsteem Kaheksandsüsteem Kuueteistkü

Loeng03

Microsoft Word - Referaat.docx

Pealkiri

Juhend nutiterminali seadistamiseks ja kaardimaksete vastuvõtmiseks Ingenico Link/2500 ja icmp

Word Pro - diskmatTUND.lwp

Neurovõrgud. Praktikum aprill a. 1 Stohhastilised võrgud Selles praktikumis vaatleme põhilisi stohhastilisi võrke ning nende rakendust k

PowerPointi esitlus

MTAT Operatsioonisüsteemid - Turvalisus

Süsteemide modelleerimine: praktikum Klassiskeemid Oleg Mürk

Control no:

E-õppe ajalugu

MS Word Sisukord Uue dokumendi loomine... 2 Dokumendi salvestamine... 3 Faili nimi... 4 Teksti sisestamine... 6 Klaviatuuril mitteleiduvat sümbolite l

vv05lah.dvi

D1003_EXTERIOR_DOOR_UK_SE_NO_DK_FI_EE_LV_LT_RU_02_NEUTRAL_WEB

Peafail3_2.dvi

untitled

StandardBooks_versiooni_uuendusWin

Microsoft Word - EVS_ISO_IEC_27001;2014_et_esilehed.doc

Image segmentation

Polünoomi juured Juure definitsioon ja Bézout teoreem Vaadelgem polünoomi kus K on mingi korpus. f = a 0 x n + a 1 x n a n 1 x

1. AKE Ajalise keerukuse empiiriline hindamine

EE-macbook-retina-12-early2015-qs.indd

Matemaatiline analüüs IV 1 3. Mitme muutuja funktsioonide diferentseerimine 1. Mitme muutuja funktsiooni osatuletised Üleminekul ühe muutuja funktsioo

Loeng05

Microsoft PowerPoint - IRZ0020_praktikum4.pptx

Valmis_aknad_78-2

MTAT Operatsioonisüsteemid - protsessid

DJI GOGGLES Kiirjuhend V1.0

Excel Valemite koostamine (HARJUTUS 3) Selles peatükis vaatame millistest osadest koosnevad valemid ning kuidas panna need Excelis kirja nii, et

Skriptimiskeeli, mida ei käsitletud Perl Python Visual Basic Script Edition (VBScript) MS DOS/cmd skriptid Windows PowerShell midagi eksootilisemat: G

IVXV võtmerakendus Spetsifikatsioon Versioon jaan lk Dok IVXV-SVR-1.4.0

Word Pro - digiTUNDkaug.lwp

Microsoft Word - Vx610 EMV KASUTUSJUHEND.doc

Skriptid ja käsud

Õppevideote rakendamine programmeerimise kursustel

Õppematerjalide esitamine Moodle is (alustajatele) seminar sarjas Lõunatund e-õppega 12. septembril 2017 õppedisainerid Ly Sõõrd (LT valdkond) ja Dian

Elisa Ring Elisa Ringi mobiilirakendus Versioon

raamat5_2013.pdf

Operatsioonisüsteemid Intelligentne arvutikasutus IFI6070 Tanel Toova

Outlookist dokumendi registreerimine Plugina seadistamine Dokumendi registreerimine Outlookist Vastusdokumendi registreerimine Outlookist Outlooki plu

Ülaveeris

Automaatne programmeerimisülesannete kontrollija Tartu Ülikooli kursuse “Algoritmid ja andmestruktuurid” jaoks

Norrison Ametikudumid, Professional knitwear.cdr

Microsoft Word - requirements.doc

AWK Aho Weinberger Kernighan struktuurse teksti töötlemise keel rikkalikult tekstitöötlusvahendeid omal alal suhteliselt lihtne ja kiiresti realiseeri

Advanced AspectJ ja AspectJ 5.0 Aleksei Bogdanov 05. aprill 2006

IMO 2000 Eesti võistkonna valikvõistlus Tartus, aprillil a. Ülesannete lahendused Esimene päev 1. Olgu vaadeldavad arvud a 1, a 2, a 3,

D1003_EXTERIOR_DOOR_UK_SE_NO_DK_FI_EE_LV_LT_RU_02_WEB

Microsoft Word - Vorm_TSD_Lisa_1_juhend_2015

Microsoft PowerPoint - Lisa 5 koolituse materjalid

IFI6083_Algoritmid_ja_andmestruktuurid_IF_3

KMahjonggi käsiraamat

Funktsionaalne Programmeerimine

G OSA A VARIANT RESPONDENDILE ISE TÄITMISEKS

SIDE (IRT 3930) Loeng 10/2011 Võrguteenused Teema - teenused Avo Ots telekommunikatsiooni õppetool, TTÜ raadio- ja sidetehnika inst. T

2015 aasta veebruari tulumaksu laekumise lühianalüüs aasta veebruari lühianalüüs pole eriti objektiivne, sest veebruari lõpuks polnud tuludeklar

Failiotsing: find paljude võimalustega otsingukäsk find kataloog tingimused kataloog - otsitakse sellest kataloogist ja tema alamkataloogidest tingimu

Projekti sõltuvuste andmebaas

Kommunikatsiooniteenuste arendus (IRT0080) loeng 8/2014 Võrkude haldus Avo 1

Ankrunaelapystol.indd

KsirKi käsiraamat

Microsoft Word - EasyFit Touch_ET

Väljavõte:

Java Virtuaalmasin JVM tutvustus Java baitkood CMa ja JVM sarnasused ja erinevused

JVM on abstraktne masin JVM on samuti magasinipõhine abstraktne masin. Tal on sarnased andmestruktuurid ja käsud. Detailides on suured erinevused, aga üldpilt on ikkagi sama:

Andmestruktuurid Thread-main tostring() Locals[] = { this } Stack[] = { } cp = 0 bar(string str) Locals[] = { this, str } Stack[] = { StringBuilder } cp = 23 main(string[] args) Locals[] = { args } Stack[] = {} Frame 2 Frame 1 cp = 9 Frame 0 Koodi jaoks on olemas method area. Igal lõimel on programmiloendur (PC) ja raamidega kutsemagasin. Raamis on meetodikutse lokaalsed muutujad, arvutamise magasin ja viit klassi konstantkogumile (constant pool). Objektid elavad kuhjas (heap).

JVM käsustik (Java baitkood) on tüübitud! Näiteks erienvate tüüpide liitmisel peab kasutama erinevaid käske: iadd: lühikesed täisarvud (int, short, byte) ladd: pikad täisarvud (long) fadd ja dadd: ujukomaarvud (float ja double) Pikemad tüübid (long ja double) vajavad kahte pesa! Objektide korral kasutatakse prefiksit a. Massiivi jaoks on käsud kujul iaload ja daload. Opcode categories I 8-32 bit integer (1 stack slot) L 64 bit integer (2 stack slots) F 32 bit float (1 stack slot) D 64 bit float (2 stack slots) A Objects (1 stack slot)?a Arrays (1 stack slot)

Konstantide käsud CMa lihtsa loadc asemel on JVM il üsna rikkalik valik käske. Näiteks konstandi 5 magasini laadimiseks on võimalik kasutada käske: iconst_5, bipush, sipush ja ldc. Selleks peab nüüd põhjalikumalt vaatama, mis asi on baitkood!?

public class Demo { public static void main(string[] args) { } System.out.println(42); } Java lähtekood Kompileerime käsuga javac Demo.java.

Index Baidid Teksti kujul 00000000: cafe babe 0000 003c 001b 0a00 0200 0307 0004 0c00 0500 0601...<... 00000018: 0010 6a61 7661 2f6c 616e 672f 4f62 6a65 6374 0100 063c 696e..java/lang/Object...<in 00000030: 6974 3e01 0003 2829 5609 0008 0009 0700 0a0c 000b 000c 0100 it>...()v... Versioon 60 = 00000048: 106a 6176 612f 6c61 6e67 2f53 7973 7465 6d01 0003 6f75 7401.java/lang/System...out. Java 16. 00000060: 0015 4c6a 6176 612f 696f 2f50 7269 6e74 5374 7265 616d 3b0a..Ljava/io/PrintStream;. 00000078: 000e 000f 0700 100c 0011 0012 0100 136a 6176 612f 696f 2f50...java/io/P 00000090: 7269 6e74 5374 7265 616d 0100 0770 Konstantide 7269 6e74 6c6e 0100 0428 rintstream...println...( 000000a8: 4929 5607 0014 0100 0444 656d 6f01 0004 kogum 436f 6465 0100 0f4c I)V...Demo...Code...L 000000c0: 696e 654e 756d 6265 7254 6162 6c65 0100 046d 6169 6e01 0016 inenumbertable...main... 000000d8: 285b 4c6a 6176 612f 6c61 6e67 2f53 7472 696e 673b 2956 0100 ([Ljava/lang/String;)V.. 000000f0: 0a53 6f75 7263 6546 696c 6501 0009 4465 6d6f 2e6a 6176 6100.SourceFile...Demo.java. 00000108: 2100 1300 0200 bipush 0000 0000 0200 0100 0500 0600 0100 1500 0000!... 00000120: 1d00 0100 0100420000 052a b700 01b1 0000 0001 0016 0000 0006...*... 00000138: 0001 0000 0001 0009 0017 0018 0001 0015 0000 0025 0002 0001...%... 00000150: 0000 0009 b200 0710 2ab6 000d b100 0000 0100 1600 0000 0a00...*... 00000168: 0200 0000 0300 0800 0400 0100 1900 0000 0200 1a... Java baitkood Vaatame baitkoodi sisse käsuga xxd Demo.class. (See näitab binaarfaili kuueteistkümnendsüüsteemis: iga bait on kaks sümbolit)

Compiled from "Demo.java" public class Demo { public Demo(); Code: 0: aload_0 } Konstruktori kood 1: invokespecial #1 // Method java/lang/object."<init>":()v 4: return public static void main(java.lang.string[]); Konstandi sisu Code: 0: getstatic #7 Viide 3: bipush 42 kogumisse // Field java/lang/system.out:ljava/io/printstream; 5: invokevirtual #13 // Method java/io/printstream.println:(i)v 8: return Java assemblerkod Koodi saab loetavamal kujul disassembleri abil: javap -c Demo.class.

Samad käsud, aga Kirjapilt Baitkood baitide arv iconst_5 08 1 bipush 5 10 05 2 sipush 5 11 00 05 3 ldc 5 08 00 00 00 05 12 idx 7 Märgend (int) + 4 baiti 1 bait (viit)

CMa versus JVM loadc 1 loadc 7 add iconst_1 bipush 7 iadd

Muutujad! Lokaalsete muutujate jaoks on nüüd eraldi massiiv. Aga samamoodi loome deklaratsioonide põhjal aadresskeskkonna. ρ CMa s oli üldine käsk load ja defineerisime loada n = loadc n; load. JVM il on käsud iload ja istore, mis käituvad nagu loada ja storea.

Siiamaani kõik hästi loadc 7 load loadc 1 sub loadc 4 store loada 7 loadc 1 sub storea 4 iload 7 iconst_1 isub istore 4 (x = y - 1)

Pergel peitub peensustes Mõned sarnased käsud käituvad ka erinevalt (Soome hallitus). JVM load ja store käsud eemaldavad väärtused ära. (Kui väärtused vaja alles jätta, genereerib kompilaator dup käske.) Oluline erinevus meie jaoks on hüppekäsud!

Hüppamine! CMa l on käsk jump A ja JVM il on käsk goto A. Aga jumpz A asemel on JVM il kõik võrdlused ja hüped koos, näiteks ifeq A, ifne A, ifle A, iflt A, Ja lisaks sellistele, mis nulliga võrdlevad, on tal ka kahe elemendi võrdlemise käsud: if_icmpeq A, if_icmpne A, if (arg!= null && arg.equals( ))...

Me ei pea nii keeruliselt tegema Java baitkood on võrdlemisi rikas keel, aga Võime seda ignoreerida, näiteks võib kõikide konstantide korral täiesti muretult kasutada käsku ldc. Näiteks kõikide arvukonstantide jaoks koodi genereerimine: protected void visitvoid(integerliteral integerliteral) { mv.visitldcinsn(integerliteral.getvalue()); }

Edasi Siin videos oli lühiülevaade JVM ist, millest kõik võiksid teada. Kui tahad rohkem teada, saad vaadata Michael Rasmusseni täispikki loenguid. Kui tahad vähema vaevaga siiski kodutööga alustada, siis asendusõpetaja Vesal lindistas ka video selle kohta. (ja tema suureks üllatuseks oli punkti saamine päris lihtne!)

Kokkuvõte Tutvusime Java virtuaalmasina (JVM) andmestruktuuridega ja tema käsustikuga, mille nimeks on Java baitkood. Baitkood on Java klassfailides salvestatud. Nägime, kuidas seda saab vaadata. JVM töötab põhimõtteliselt nagu CMa, aga mõned käsud töötavad teistmoodi koodi geneerimisel ei pea kõiki võimalusi kasutama.