funkcionalno programiranje interoperabilnost jezika...

15
Funkcionalno programiranje Interoperabilnost jezika Scala i Java -- Funkcionalno programiranje -- ETF Beograd, 2019.

Upload: others

Post on 09-Mar-2020

10 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Funkcionalno programiranje Interoperabilnost jezika …rti.etf.bg.ac.rs/rti/ms1fp/materijali/1819/FP_P_09_Inter...Prevođenje u Java bajt kod • Svi Java tipovi imaju ekvivalentan

Funkcionalno programiranje

Interoperabilnost

jezika Scala i Java

-- Funkcionalno programiranje --

ETF Beograd, 2019.

Page 2: Funkcionalno programiranje Interoperabilnost jezika …rti.etf.bg.ac.rs/rti/ms1fp/materijali/1819/FP_P_09_Inter...Prevođenje u Java bajt kod • Svi Java tipovi imaju ekvivalentan

Prevođenje u Java bajt kod

• Svi Java tipovi imaju ekvivalentan tip u jeziku Scala

• Većina Scala koda se direktno preslikava

u odgovarajući Java konstrukt

– klase

– definicija i pozivanje metoda

– izuzeci

• Neki Scala konstrukti ne mogu da se direktno preslikaju,

jer ne postoji (direktan) ekvivalent

– crte

– generički tipovi

• Kada ne postoji preslikavanje, kodiranje se vrši

kombinovanjem struktura koje Java ima

-- Funkcionalno programiranje --

ETF Beograd

2

Page 3: Funkcionalno programiranje Interoperabilnost jezika …rti.etf.bg.ac.rs/rti/ms1fp/materijali/1819/FP_P_09_Inter...Prevođenje u Java bajt kod • Svi Java tipovi imaju ekvivalentan

Vrednosni tipovi

• Vrednosni tip poput Int se iz jezika Scala prevodi

u jezik Java na dva načina

– kad je moguće, pretvara se u primitivan tip int (performanse)

– u suprotnom, koristi omotačku klasu java.lang.Integer

• Primer: List[Any]– može da sadrži samo objekte tipa Int, ali to nije garantovano

– zato kompajler usvaja restriktivnu pretpostavku i koristi Integer

• Slično i za ostale vrednosne tipove

-- Funkcionalno programiranje --

ETF Beograd

3

Page 4: Funkcionalno programiranje Interoperabilnost jezika …rti.etf.bg.ac.rs/rti/ms1fp/materijali/1819/FP_P_09_Inter...Prevođenje u Java bajt kod • Svi Java tipovi imaju ekvivalentan

Unikatni objekti

• Prevodi se u kombinaciju

statičkih i nestatičkih polja i metoda

• Za svaki unikatni objekat pravi se Java klasačijem imenu se dodaje znak $

• Ova klasa ima sve metode i atribute unikatnog objekta

• Ima statički atribut MODULE$koje čuva instancu te klase koja predstavlja

unikatni objekat

-- Funkcionalno programiranje --

ETF Beograd

4

Page 5: Funkcionalno programiranje Interoperabilnost jezika …rti.etf.bg.ac.rs/rti/ms1fp/materijali/1819/FP_P_09_Inter...Prevođenje u Java bajt kod • Svi Java tipovi imaju ekvivalentan

Unikatni objekti

object App {def main(args: Array[String]) = {println("Hello, world!")

}}

public final class App$ extends java.lang.Objectimplements scala.ScalaObject {

public static final App$ MODULE$;public static {};public App$();public void main(java.lang.String[]);public int $tag();

}

-- Funkcionalno programiranje --

ETF Beograd

5

Page 6: Funkcionalno programiranje Interoperabilnost jezika …rti.etf.bg.ac.rs/rti/ms1fp/materijali/1819/FP_P_09_Inter...Prevođenje u Java bajt kod • Svi Java tipovi imaju ekvivalentan

Unikatni objekti

• U slučaju da ne postoji prateća klasa (već samo unikatni

objekat), kompajler će napraviti Java klasu sa statičkim

metodama za pozivanje odgovarajućih metoda

unikatnog objekta.

public final class App$ extends java.lang.Objectimplements scala.ScalaObject {

public static final App$ MODULE$;public static {};public App$();public void main(java.lang.String[]);public int $tag();

}

public final class App extends java.lang.Object{public static final int $tag();public static final void main(java.lang.String[]);

}-- Funkcionalno programiranje --

ETF Beograd

6

Page 7: Funkcionalno programiranje Interoperabilnost jezika …rti.etf.bg.ac.rs/rti/ms1fp/materijali/1819/FP_P_09_Inter...Prevođenje u Java bajt kod • Svi Java tipovi imaju ekvivalentan

Crte

• Java ne podržava crte

• Kompajliranje crte stvara Java interfejs istog imena

• Ako crta ima samo apstraktne metode

onda se direktno preslikava u Java intefejs

• U suprotnom, kompajler generiše kod

potreban za simuliranje crta

-- Funkcionalno programiranje --

ETF Beograd

7

Page 8: Funkcionalno programiranje Interoperabilnost jezika …rti.etf.bg.ac.rs/rti/ms1fp/materijali/1819/FP_P_09_Inter...Prevođenje u Java bajt kod • Svi Java tipovi imaju ekvivalentan

Primer

package w08trait Callback {def print = println("Test!")

}

Callback.scala

-- Funkcionalno programiranje --

ETF Beograd

8

Page 9: Funkcionalno programiranje Interoperabilnost jezika …rti.etf.bg.ac.rs/rti/ms1fp/materijali/1819/FP_P_09_Inter...Prevođenje u Java bajt kod • Svi Java tipovi imaju ekvivalentan

package w08;import java.awt.*;import java.awt.event.*;public class AWTTest extends Frame {private boolean unisti = false;private Callback callback;

private class TestAkcija implements ActionListener {public void actionPerformed (ActionEvent d) {if( callback != null ) callback.print();

}}private Panel panelTest() {

Panel p = new Panel();Button b = new Button("Test");b.addActionListener( new TestAkcija() );p.add( b );return p;

}

Primer

AWTTest.java

-- Funkcionalno programiranje --

ETF Beograd

9

Page 10: Funkcionalno programiranje Interoperabilnost jezika …rti.etf.bg.ac.rs/rti/ms1fp/materijali/1819/FP_P_09_Inter...Prevođenje u Java bajt kod • Svi Java tipovi imaju ekvivalentan

public void setCallback(Callback c) { callback = c; }

public AWTTest (int x, int y) { super ("Test");setBounds (x, y, 305, 242);setResizable (false);add( panelTest(), BorderLayout.CENTER);addWindowListener (new WindowAdapter () {public void windowClosing (WindowEvent d) { if (unisti) dispose (); else setVisible (false); }

});}

public AWTTest (boolean unisti) {this (250, 50);this.unisti = unisti;

}}

Primer

AWTTest.java

-- Funkcionalno programiranje --

ETF Beograd

10

Page 11: Funkcionalno programiranje Interoperabilnost jezika …rti.etf.bg.ac.rs/rti/ms1fp/materijali/1819/FP_P_09_Inter...Prevođenje u Java bajt kod • Svi Java tipovi imaju ekvivalentan

Primer

JavaScalaTest.scalapackage w08

object JavaScalaTest {

class SimpleCallback extends Callback

def main(args: Array[String]){

var test = new AWTTest(true)test.setVisible (true)test.setCallback( new SimpleCallback )

}}

-- Funkcionalno programiranje --

ETF Beograd

11

Page 12: Funkcionalno programiranje Interoperabilnost jezika …rti.etf.bg.ac.rs/rti/ms1fp/materijali/1819/FP_P_09_Inter...Prevođenje u Java bajt kod • Svi Java tipovi imaju ekvivalentan

Anotacije

• @deprecated– dodaje se na klase ili metode

generišu se odgovarajuće Java anotiacije

• @volatile – dodaje Java modifikator volatilena generisan kod

• @serializable – klasi sa ovom anotacijom se dodaje

interfejs Serializable

• @transient – atributu se dodaje modifikator transient

• @throws – metoda se proglašava da baca izuzetke

– Primer:

@throws(classOf[IOException])

def read() = in.read()

-- Funkcionalno programiranje --

ETF Beograd

12

Page 13: Funkcionalno programiranje Interoperabilnost jezika …rti.etf.bg.ac.rs/rti/ms1fp/materijali/1819/FP_P_09_Inter...Prevođenje u Java bajt kod • Svi Java tipovi imaju ekvivalentan

Nespecificiran tip

(džoker znak)• Kako podržati sledeći Java kod?

– Iterator<?>

– Iterator<? extends Component>

• Koristi se simbol _

(slično kao kod anonimnih ili parcijalno primenjenih f-ja)

• Iteartor[_]

• Iterator[_ <: Component]

-- Funkcionalno programiranje --

ETF Beograd

13

Page 14: Funkcionalno programiranje Interoperabilnost jezika …rti.etf.bg.ac.rs/rti/ms1fp/materijali/1819/FP_P_09_Inter...Prevođenje u Java bajt kod • Svi Java tipovi imaju ekvivalentan

Funkcijski literali

i lambda izrazi• Java 8 je uvela lambda izraze

– suštinski: koncizan način pravljenja instanci anonimnih klasa

• Lambda izraz se može koristiti gde god se očekuje

SAM (single abstract method) tip

• ActionListener je takav tip: jedino ima metodu

actionPerformed

• Funkcijski literali u jeziku Scala se mogu koristiti

na isti način

– Razlika u verzijama jezika Scala

// Java 8JButton button = new JButton();button.addActionListener(event -> System.out.println("klik!"));

14

Page 15: Funkcionalno programiranje Interoperabilnost jezika …rti.etf.bg.ac.rs/rti/ms1fp/materijali/1819/FP_P_09_Inter...Prevođenje u Java bajt kod • Svi Java tipovi imaju ekvivalentan

Funkcijski literali

i lambda izrazi

val button = new JButton

// Pre Scala 2.12implicit def function2ActionListener(f: ActionEvent => Unit) =

new ActionListener {def actionPerformed(event: ActionEvent) = f(event)

}

button.addActionListener( (_ : ActionEvent) => println("klik!") )

// Scala 2.12 +button.addActionListener( _ => println("klik!") )

-- Funkcionalno programiranje --

ETF Beograd

15