Java Henrik Lieng Høgskolen i Oslo og Akershus
Hvorfor Java? Objekt-orientert (primære stilen i moderne programutvikling) Sikkert (lar ikke programmerer tukle med minne etc.) Enkelt å lære (så lenge du kjenner til objekt-orientert programmering) God støtte (både fra IDEer og på Internett) Støttes av de fleste operativsystemer
Javateknologier Oracle tilbyr, i tillegg til språket Java, teknologier som: Appets Servlets Dynamiske HTML sider med JSP GUI med JavaFX (før Swing) Solid støttebibliotek (Java Class Library) Google: Android SDK
Java og webutvikling: applets Java applets er Java programmer som er innebygd i andre applikasjoner, som i en webside vist i en nettleser.
Java og webutvikling: servlets Backend web-utvikling med Java. Genererer HTML sider og håndterer HTTP requests fra klienter. Java servlets er Java programmer som kjører på servere (tjenere).
Java og webutvikling: JavaServer Pages Generering av dynamiske websider (HTML) og dokumenter (XML). Utvikles sammen med Java servlets, der JSP tar for seg synsdelen av websiden.
Java og systemutvikling: JavaFX GUI programmering i Java. Erstatning av Java Swing biblioteket. Støtte for: 2D og 3D grafikk (inkludert GPU programmering) 3D scenegrafer (for objekter i spill etc.) GUI elementer (knapper, slidere, layouts) Effekter, animasjoner, 2D/3D transformasjoner
Java og systemutvikling: Java Class Library Generelt bibliotek som dekker vanlig funksjonalitet som forventes av et programmeringsspråk. Eksempler: Dynamiske data containere Kalender, Dato, Tid Tekstformatering (mtp. språk/lokalisering) Unntakshåndtering Prosess- og trådhåndtering Nettverk- og databasehåndtering https://docs.oracle.com/javase/8/docs/api/java/util/package-summary.html
Java utgivelser Java er publisert for ulike plattformer: Java Standard Edition (Java SE): for vanlige datamaskiner Java Micro Edition (Java ME): for miljøer med begrensede ressurser Java Enterprise Edition (Jave EE): for store distribuerte miljøer og/eller Internett miljøer Java Card: for smartkort (SIM kort etc.).
Hva kjennetegner Java? Automatisk minnehåndtering Som de fleste moderne, populære, programmeringsspråk, utfører Java (heap) minnehåndtering automatisk
Hva kjennetegner Java? Prosedyrer er alltid innkapslet i klasser Java støtter ikke prosedyrer utenfor klasser. Dette er faktisk ganske 'unormalt' for moderne språk. Alt i Java er klasser pga. hvordan JVM er bygd opp
Klassifisering av Java Java tilbyr forskjellige programmeringsstiler: Imperativt (tilstander kan endres på via instruksjoner) Objekt-orientert programmering (programmet inndeles i objekter) Klasse-basert programmering (objekter defineres fra klasser) Klasser brukes også for å organisere prosedyrer (statiske metoder) Prosedyre-basert programmering (programmet inndeles i prosedyrer) Funksjonell programmering Skal se på Javas støtte av dette i programutvikling Bedre altenativ: Scala
Negative sider ved Java Dårlig ytelse sammenliknet med noen andre språk Garbage collection fører til stopp i programutførelsen Mindre kontroll Ingen manuell minnehåndtering Ingen pekere Ingen prosedyrer utenfor klasser Ikke støtte for operatoroverlasting Ikke direkte tilgang til maskinvare Kan ikke brukes i utvikling av OS, nettverkssystemer, og andre systemer som ikke støtter Java.
Hva er Java?
Vanlige programmer Kode Kompilator Maskinkode Datamaskin (maskinvare)
Java programmer Java kode Javac Java bytecode Java Virtual Machine Maskinkode Datamaskin (maskinvare)
Java Virtual Machine En virtuell maskin som kjører Java programmer. Må støttes på operativsystemet ditt for å kunne kjøre et Java program. Utallige implementasjoner Write code, run anywhere, i motsetning til C/C++ write code, compile anywhere. Ytelse til Java program avhengig av JVM implementasjon. Definert via en spesifikasjon (slik at hvem som helst kan implementere JVM) Håndteres av Oracle: http://docs.oracle.com/javase/specs/jvms/se8/html/ Implementeringsdetaljer utelukket (som algoritme for Garbage Collector)
JVM arkitektur
JVM input:.class filer Definisjon av en Java klasse (en Java klasse -> en.class fil). Format: Java byte code Inneholder, blant annet: Konstante data (final variabler) Aksesseringsflagg (abstract, static etc.) Navn til klassen og til superklassen (default: Object) Interface (hvis noen) Medlemsvariabler Metoder
Eksempel, konvertering til C struct
Java byte code Instruksjonsformatet til JVM. Inndelt i bytes. Den første byten angir opcode (operation code) Hva skal gjøres? Siden lengden er 8 bits, har Java 256 mulige instruksjoner (198 er i bruk) En instruksjon kan inneholde flere bytes for parametere (hvis noen) parametere er kalt operands når vi snakker om instruksjonsformat
Java byte code: noen instruksjoner aload_0 ; last inn referanse 0 på stabelen istore_1 ; lagre verdien på stabelen til variabel 1 dadd ; legg til double verdiene to stabel, og lagre fcmpl ; sammenlikn to float verdier på stabelen i2b ; konverter int til byte new 41 45 ; alloker nytt objekt, av typen i 41->45 swap ; manipuler stack (swap de to øverste verdiene) goto 18 45 ; GOTO instruksjonssekvens 18->45 invokevirtual 85 ; kall Java funksjon (println)
JVM arkitektur
Class loader Load (bytecode) Link (verify, allocate memory, transform) Initialise sett startverdier
JVM og sikkerhet JVM prøver å garantere sikkerhet. Ingen Java program skal få JVM til å krasje! Språket Java tilbyr sikkerhet (som automatisk minnehåndtering, ikke bruk av pekere etc.), men Java bytecode må ikke kompileres fra Java! (kan kompileres fra C for eksempel) Verifiseringssteget påser at: Instruksjonshopp gjøres til gyldige plasseringer Data er alltid initialisert og referanser refererer til korrekt type data Aksessering til private og package private, samt metoder, ikke blir krenket
JVM og bytecode kompilering Problem: når skal vi kompilere til maskinkode? 1. Kompiler all kode i starten (for eksempel, class loader) Kjent som ahead-of-time compilation 2. Kompiler ingenting (eller veldig lite) i starten og kompiler bare når du trenger det (dvs. underveis i kjøringen til programmet) Kjent som just-in-time compilation
Kompilering av bytecode, fordeler/ulemper Ahead-of-time compilation Kjapp utførelse Lang kompileringstid Lang oppstartstid første gang programmet kjøres Bra hvis man kan akseptere lang kompileringstid (oppstart) kan være flere minutter for store programmer Eksempel: Server-side programmer og kompilering ved installasjon Mindre akseptabelt for små programmer (f.eks. Applets) Just-in-time compilation Mye bedre overall time (kompilering+kjøretid) Treg oppstart for hver kjøring (siden startkoden må kompileres) Kan gjøre optimaliseringer, som AOT for noen komponenter Generelt et bra valg for Java Noe tregere utførelse (avhengig av implementasjon/situasjon)
Kompilering av bytecode Kompilering av bytecode er ikke spesifisert i JVM. Designeren av en gitt JVM kan derfor velge metode. Oracle Hotspot JVM: Just-in-time, med optimaliseringer Dalvik (Google Android): Trace-based just-in-time Android Runtime (alternativ til Dalvik): Ahead-of-time compilation
Presis spesifikasjon. Lite rom for optimalisering. Upresis spesifikasjon. Mye rom for optimalisering.
Andre JVM språk (lite utdrag) Scala (funksjonelt språk) Clonjure (funksjonelt språk) Groovy (script språk, liknende Python) JRuby (Ruby, et populært språk, for JVM) Jython (Python for JVM)
JVM escape hatch: JNI Java Native Interface tilbyr kall, fra Java/JVM, til applikasjoner og biblioteker skrevet i andre språk. Selve interfacet tilbys via C. Muliggjør manuell minnebehandling, direkte kommunikasjon med maskinvare (via C), etc. Dvs. muliggjør det som Java ikke direkte tilbyr Kommunikasjon gjøres via delte biblioteker (dvs. at C programmet kompileres som et delt bibliotek, som kan brukes i Java)
Sammendrag Java er populært innen web-utvikling og (Android) app utvikling Java er objekt- og klasse-orientert, sikkert, enkelt å lære, og portabelt For webutvikling, tilbyr Java applets, servlets, og JSP Java passer også til GUI utvikling, og masse mer, via biblioteker Javaprogrammer kjører via JVM JVM er klasse-basert, der klasser er definert ut ifra Java bytecode JVM er implementert i ulike systemer, og kan bruke ulike typer kompilering (AOT eller JIT) JNI tilbyr kall fra applikasjoner og biblioteker skrevet i andre språk