Javaforum indy

Click here to load reader

  • date post

    01-Nov-2014
  • Category

    Documents

  • view

    724
  • download

    4

Embed Size (px)

description

Vilka problem har man historiskt sett haft med att kompilera dynamiska språk till Java bytekod? Vad fanns för work-arounds? Vilka andra roliga saker kan man göra själv med Invokedynamic?Även om du bara har en vag bild på vad en bytekod överhuvudtaget är och varför du skall bry dig om en ny sådan så är det här en presentation som kommer att fördjupa din förståelse av Java på riktigt låg nivå.

Transcript of Javaforum indy

  • 1. 1
  • 2. The following is intended to outline our generalproduct direction. It is intended for informationpurposes only, and may not be incorporated intoany contract. It is not a commitment to deliver anymaterial, code, or functionality, and should notbe relied upon in making purchasing decisions.The development, release, and timing of anyfeatures or functionality described for Oraclesproducts remains at the sole discretion of Oracle. 2
  • 3. invokedynamic p 20 minuterJoel Borggrn-Franck Java Platform Group
  • 4. Intro till JSR-292: invokedynamic,MethodHandle och dynamiskt typadesprk p JVM:en Varfr JSR-292/invokedynamic? Vad erbjuder JSR-292? Dynamiskt typade exempel och jmfrelser med vad JVM:en kan gra av Java 4
  • 5. Warning!The following slides may contain traces of:- x86 assembler- Ruby, and- Common Lisp 5
  • 6. Det finns en mngd intressanta programmeringssprk JVM:en r lngt mycket mer avancerad n andra VM:ar/runtimes Java r inte allas favoritsprk Naturligvis vill man kra alla nya spnnande sprk p JVM:en 6
  • 7. Dynamiskt typade sprk: Modifierar klasser vid krtid Alternativt, saknar klasser och lgger till properties i krtidclass ExampleClass def exampleMethod 5 endendexampleObject.class.send(:define_method, "aNewMethod") do 10end 7
  • 8. Motsvarigheten i Java finns egentligen inte Den naiva implementationen blir istllet en Map Mer eller mindre avancerade stt att optimera ovanstende JRuby har sina flt i en Object[] och en Map dr du slr upp vilket index du ska anvnda in i arrayen 8
  • 9. Dynamiskt typade sprk: har ofta inkompatibla stt att definera/anropa metoder(defun foo (var... &optional (var initform svar)... &rest var &key ((keyword var) initform svar)... &aux (var initform)...)) 9
  • 10. Man kan arbeta runt problemen Ett av de f verktyg man har r klassladdning/klassurladdning leder till permgen-problem p HotSpot Det tar tid att implementera om man vill f det att g fort 10
  • 11. Invokedynamic, en sprkimplementatrs rddare inden Invokedynamic r en brygga mellan sprkimplementatren och JVM:en Invokedynamic bestr av 3 delar en ny bytekod som markerar ett dynamiskt CallSite ett protokoll/API fr livscykeln av dynamiska CallSites MethodHandle funktionspekare p sterodier 11
  • 12. Frsta gngen JVM:en exekverar en invokedynamic bytekod kommer den: Hitta och kra den bootstrapmetod som skaparen av klassfilen angett resulterar i ett CallSite-objekt som har ett MethodHandle som target Lnka CallSite-objektet Ovanstende grs bara en gng Efterfljande krningar av samma invokedynamic kommer helt skippa bootstrap och lnkning == Snabbt!! 12
  • 13. Bootstrap method CallSite object target MethodHandleaload 0x25dupinvokedynamic 0x22 0x23getfield 0xba 0xdd 13
  • 14. En invokedynamic kommer alltid att motsvaras av samma CallSite Ett CallSite kan ndra target till att peka p en ny MethodHandle Om du kan uttrycka ditt sprks semantik som CallSite + en utbytbar MethodHandle kommer det g fort! 14
  • 15. MethodHandles is the kitchen sink of the JVM- Dan Heidinga, JVM Lang 2010 MethodHandle r i grund och botten en funktionspekare Pekas normalt ut som target i en CallSite Kan ocks kras genom ett Java-API Hjlpklassen MethodHandles har metoder fr att Wrappa MethodHandle i andra MethodHandle Transformera argumenten p ett MethodHandle Kra kod runt en MethodHandle 15
  • 16. MethodHandle kan ocks peka ut flt Anvndbart fr lat initialisering av en gigantisk array Wrappa arrayaccessen i ett MethodHandle som transparent initialiserar den Generera bytecode som kr MethodHandlet fr den wrappade arrayen istllet fr den vanliga aref-bytekoden 16
  • 17. MethodHandle kan ocks transformera argument asCollector() asFixedArity() asSpreader() Och byta returtyp asType(newType) 17
  • 18. MethodHandles.Lookup har ocks std fr att reflektera ver typer Anvndbart fr det mesta man vill gra med reflection Fast snabbt 18
  • 19. JVM:en vet hur den skall optimera MethodHandle Igen: Kan du bara uttrycka ditt sprks semantik som CallSite + en utbytbar MethodHandle kommer det g fort! 19
  • 20. Exempel: ett vanligt metodanrop i Java Ett call i Java kommer kompileras till: Sl upp objektets vtable (en del av klassen) Kr koden som pekas ut p en vid just-in-time-kompilering knd plats i vtablenmoveq r12, [rdi + 0x128] ;get vtable for thiscallq [r12+0x12] ;call 3:rd method 2 instruktioner + ev. ngra cachemissar == Snabbt! 20
  • 21. Exempel: ett metodanrop i fiktiv Ruby p JVM:en Motsvarande logik fr ett dynamiskt typat sprk utan invokedynamic:String methodName;CallTarget t;for(RubyClazz clz : o.getClzAndSuperClzs()) { if ((t = clz.hasMethod(methodName)) != null) break;}if (t == null) throw new NoSuchRubyMethod(); 21
  • 22. Exempel: med invokedynamic Lt bootstrapmetoden returnera ett MethodHandle:MethodHandle lastCalled;int rubyClzId;if (receiver.currentRubyClzId == rubyClzId) { return lastCalled.invoke(args );} else { missCount++; MethodHandle t = doFulLookup(mName, args); if (missCount > MISS_LIMIT) { relinkThisCallSite(t); } return t.invoke();} 22
  • 23. Exempel: med invokedynamic Bootstrapmetoden fr leta reda p den implementerande ruby-metoden Wrappa i ett MethodHandle som Testar om det r samma implementerande ruby-klass Testar om det r samma version av ruby-klassen S lnge det r samma implementerande klass kommer JVM:en kunna kompilera till en handfull instruktioner Det r nstan alltid samma implementerande klass! Om det inte r samma klass kan din ruby-VM begra omlnkning via CallSite-objektet! 23
  • 24. == Snabbt!! 24
  • 25. Invokedynamic hjlper dig som sprkimplementatr: Kommunicera ditt sprks speciella semantik till VM:en teranvnda VM:ens maskineri fr Optimeringar Deoptimeringar Hjlper dig att transformera semantiken i ditt sprks objektsystem till ngot som JVM:en kan anvnda 25
  • 26. 26