Da Vinci maskin
Utvecklare | Sun Microsystems |
---|---|
Operativ system | Cross-plattform |
Typ | Bibliotek |
Licens | GPL + länkningsundantag |
Hemsida |
Da Vinci-maskinen , även kallad Multi Language Virtual Machine , var ett Sun Microsystems -projekt som syftade till att prototypa förlängningen av Java Virtual Machine (JVM) för att lägga till stöd för dynamiska språk .
Det var redan möjligt att köra dynamiska språk ovanpå JVM, men målet är att underlätta nya dynamiska språkimplementeringar och öka deras prestanda. Detta projekt var referensimplementeringen av JSR 292 ( Supporting Dynamically Typed Languages on the Java Platform ) .
Historia
Före Java 7 hade Java Virtual Machine inget inbyggt stöd för dynamiskt skrivna språk :
- Den befintliga JVM-instruktionsuppsättningen är statiskt typad .
- JVM har begränsat stöd för att dynamiskt modifiera befintliga klasser och metoder. Det fungerar för närvarande bara i en felsökningsmiljö .
JSR 292 ( stöder dynamiskt typade språk på Java-plattformen ) föreslår att:
- lägg till en ny
invokedynamic
-instruktion på JVM-nivå, för att tillåta metodanrop som förlitar sig på dynamisk typkontroll , - att kunna ändra klasser och metoder under körning dynamiskt i en produktionsmiljö.
Efter framgången med JRuby Java- implementeringen startade Da Vinci-projektet i slutet av januari 2008. De funktioner som Da Vinci experimenterade var planerade att läggas till Java 7 . Det syftar till att prototypa denna JSR, men också andra lägre prioriterade tillägg. Den första fungerande prototypen, utvecklad som en patch på OpenJDK , tillkännagavs och gjordes tillgänglig i slutet av augusti 2008.
Sedan dess har JRuby -teamet framgångsrikt kopplat dynamisk anrop i sin kodbas. Dynamisk anrop levereras med version 1.1.5 och kommer att inaktiveras på JVM:er utan anropsdynamiska
funktioner.
Sedan dess har projektet integrerats i JDK 7 -kodbasen och sedan integrerats i Java 7-utgåvan .
Arkitektur
Dynamisk anrop bygger på det faktum att även om Java är ett starkt statiskt språk på språknivå, är typinformationen mycket mindre utbredd på bytekodnivå .
Dynamiska språkimplementeringar måste dock kunna använda just-in-time kompilering (snarare än reflektion ) för att uppnå bra prestanda, och så att kompilera skript till bytekod vid körning. [ citat behövs ] För att få köras av Java Virtual Machine måste dessa bytekoder verifieras innan de körs, och verifieraren kontrollera att typerna är statiska genom hela koden. Det leder till att dessa implementeringar måste skapa många olika bytekoder för de olika sammanhangen för ett metodanrop, varje gång signaturen för argumenten ändras .
Detta använder inte bara mycket minne, utan fyller också ett minnesområde som kallas Metaspace (Permanent Generation före Java 8), en del av högen som används av JVM för att lagra information om klasser . Minnet som används i detta område samlas nästan aldrig in skräp eftersom det lagrar oföränderlig data i sammanhanget med Java-program; och på grund av det kan implementeringar av dynamiska språk bara kompilera en liten del av skripten.
JSR 292 föreslår att:
- tillhandahålla en mekanism varigenom en befintlig klass kan laddas och modifieras, producerar en ny klass med dessa modifieringar men delar resten av dess struktur och data, så att det inte fyller Permanent Generation- utrymmet ,
- tillhandahålla den nya
anropsdynamiska
bytekoden som gör att JVM kan optimera anrop av detta slag.
Se även
- Skript för Java-plattformen
- Lista över JVM-språk
- Dynamic Language Runtime — en miljö från Microsoft som ger stöd för dynamiska språk till .NET Framework Common Language Runtime
- Nashorn (JavaScript-motor) — baserad på Da Vinci-maskinen