2013-04-08 4 views
5

Esistono buone annotazioni su come il compilatore Scala esegue il mapping di varie caratteristiche di Scala in bytecode?Buon riferimento per il modo in cui scala è mappata al codice byte jvm

Una rapida di Google alzato il materiale di supporto a partire dal 2009 discorso di David Pollak

https://github.com/dpp/jvm_summit_2009/blob/master/scala_fancy_pants.pdf

Ma ho il sospetto questo può essere sia datata e incompleta.

Potrei provare a raccogliere questi dati me stesso tramite scalap javap, ma sarebbe bello beneficiare di uno sforzo di qualcun'altro e intuizione.

+0

Questo probabilmente varia da versione a versione. Hai provato a guardare la sorgente del compilatore? Puoi anche compilare alcune classi e poi disassemblarle. – Antimony

+0

Ho potuto sfogliare e provare a capire la fonte, smontare un po 'di scala o leggere alcuni anni della mailing list scala interna, ma speravo di trovare qualcosa di simile a tutto ciò. Sono pigro. – henry

+0

@Antimony Penso che tu abbia ragione che cambi da versione a versione. Sono più interessato a 2.10.1 - ma i cambiamenti imminenti per usare le funzionalità java 1.7 java sono anche di interesse. – henry

risposta

1

Nessuno di cui sono a conoscenza. Considerare l'utilizzo di uno strumento di ispezione bytecode per ispezionare il codice prodotto dal compilatore. È spesso utile quando si scrive codice critico delle prestazioni per verificare se la specializzazione è stata applicata correttamente, le chiusure eliminate, gli array sono accessibili direttamente tramite istruzioni bytecode, macro correttamente espanse, ecc.

Se si utilizza Sublime, c'è un questo plugin for viewing the bytecode.

5

su Scala REPL, utilizzare :javap -c per visualizzare il codice byte generato.

Per esempio:

scala> class Bytes { def a = println("hello") } 
defined class Bytes 

scala> :javap -c Bytes 
Compiled from "<console>" 
public class Bytes extends java.lang.Object{ 
public void a(); 
    Code: 
    0: getstatic #13; //Field scala/Predef$.MODULE$:Lscala/Predef$; 
    3: ldC#15; //String hello 
    5: invokevirtual #19; //Method scala/Predef$.println:(Ljava/lang/Object;)V 
    8: return 

public Bytes(); 
    Code: 
    0: aload_0 
    1: invokespecial #24; //Method java/lang/Object."<init>":()V 
    4: return 

} 
+0

Grazie, sono consapevole di poterlo fare, ma quello che sto cercando è un'analisi di qualcun altro piuttosto che dovermi fare proprio. – henry

+1

Non funziona ancora con Java 1.7 –

Problemi correlati