Da Vinci Machine - Da Vinci Machine
Vývojáři | Sun Microsystems |
---|---|
Operační systém | Cross-platform |
Typ | Knihovna |
Licence | Výjimka z propojení GPL + |
webová stránka | openjdk |
Stroj Da Vinci , nazývaný také Multi Language Virtual Machine , byl projekt Sun Microsystems, jehož cílem bylo prototypovat rozšíření Java Virtual Machine (JVM) a přidat tak podporu dynamických jazyků .
Již bylo možné spouštět dynamické jazyky nad JVM, ale cílem je usnadnit implementaci nových dynamických jazyků a zvýšit jejich výkon. Tento projekt byl referenční implementace of JSR 292 ( Podpora Dynamicky zadávané jazyky na Java Platform ).
Dějiny
Před verzí Java 7 neměl virtuální stroj Java integrovanou podporu pro dynamicky zadávané jazyky :
- Stávající instrukční sada JVM je zadána staticky .
- JVM má omezenou podporu pro dynamické úpravy existujících tříd a metod. V současné době funguje pouze v ladicím prostředí .
JSR 292 ( Podpora dynamicky zadávaných jazyků na platformě Java ) navrhuje:
- přidat novou
invokedynamic
instrukci na úrovni JVM, která umožní vyvolání metody založené na dynamické kontrole typu , - být schopen dynamicky měnit třídy a metody za běhu v produkčním prostředí.
Po úspěchu implementace JRuby Java byl na konci ledna 2008 zahájen projekt Da Vinci. Plánováno bylo přidání funkcí experimentovaných společností Da Vinci do Java 7 . Jeho cílem je prototypovat tento JSR, ale také další rozšíření s nižší prioritou. První funkční prototyp, vyvinutý jako oprava na OpenJDK , byl oznámen a zpřístupněn koncem srpna 2008.
Od té doby tým JRuby úspěšně zapojil dynamické vyvolání do své kódové základny. Dynamické vyvolání dodávané s vydáním 1.1.5 a bude deaktivováno na JVM bez invokedynamic
funkcí.
Od té doby byl projekt integrován do kódové základny JDK 7 a poté integrován do verze Java 7 .
Architektura
Dynamické vyvolání je postaveno na skutečnosti, že i když je Java na jazykové úrovni silně statickým jazykem, informace o typu jsou na úrovni bytecode mnohem méně rozšířené .
Implementace dynamických jazyků však musí být schopny použít kompilaci just-in-time (spíše než reflexi ) k dosažení dobrého výkonu, a tak kompilovat skripty do bytecode za běhu. Aby bylo možné je spouštět pomocí Java Virtual Machine , musí být tyto bajtové kódy před provedením ověřeny a ověřovatel zkontroluje, zda jsou typy v celém kódu statické. To vede k těmto implementací mají vytvořit mnoho různých bytecodes pro různé kontexty volání metody, pokaždé, když podpisu na argumenty změny.
To nejen využívá hodně paměti, ale také vyplňuje paměťovou oblast nazvanou Metaspace (Permanent Generation před Java 8), část haldy používanou JVM k ukládání informací o třídách . Paměť používaná v této oblasti se téměř nikdy neshromažďuje, protože ukládá neměnná data v kontextu programů Java; a proto mohou implementace dynamických jazyků kompilovat pouze malou část skriptů.
JSR 292 navrhuje:
- poskytnout mechanismus, pomocí kterého lze načíst a upravit existující třídu a vytvořit novou třídu s těmito úpravami, ale sdílet zbytek její struktury a dat, čímž nevyplní prostor stálé generace ,
- poskytnout nový
invokedynamic
bytecode, který umožňuje JVM optimalizovat hovory tohoto druhu.
Viz také
- Skriptování pro platformu Java
- Seznam jazyků JVM
- Dynamic Language Runtime - prostředí od společnosti Microsoft, které přináší podporu dynamických jazyků do .NET Framework Common Language Runtime
- Nashorn (JavaScript engine) - založený na stroji Da Vinci