Da Vinci Machine - Da Vinci Machine

Vícejazyčný virtuální stroj
Vrtulník Leonardo da Vinci.jpg
Vývojáři Sun Microsystems
Operační systém Cross-platform
Typ Knihovna
Licence Výjimka z propojení GPL +
webová stránka openjdk .java .net / projects / mlvm /

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

Architecture virtuálního počítače Java.svg

Před verzí Java 7 neměl virtuální stroj Java integrovanou podporu pro dynamicky zadávané jazyky :

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é

Reference

externí odkazy