2011-12-18 9 views
27

Si prega di scusare il titolo divertente, sto usando in analogia con "zip bomb". È possibile creare un file sorgente di scala, che, una volta compilato, produrrà un numero elevato di file di classe (o un file di una sola classe molto grande)? C'è un modo in cui la dimensione dei file di classe potrebbe crescere più velocemente di quella lineare con le dimensioni del file sorgente?Scala bomba? (come una bomba a cerniera)

+1

Che diavolo potreste averne bisogno? –

+1

@NikitaVolkov Sembra un esercizio mentale interessante, ma ho un problema nel cercare di trovare un'applicazione pratica. – Vatine

+6

Ok, per coloro che hanno bisogno di applicazioni pratiche: provare a proteggere un servizio che compila il codice Scala dagli attacchi DOS. –

risposta

32

La specializzazione è intrinsecamente esponenziale nel numero di parametri di tipo specializzati.

class Huge[@specialized A, @specialized B, @specialized C](
    val a: A, val b: B, val c: C 
) {} // 730 files, 2.9 MB 

class Gigantic[@specialized A, @specialized B, @specialized C, @specialized D](
    val a: A, val b: B, val c: C, val d: D 
) {} // 6562 files, 26 MB 

pattern matching può coinvolgere anche un sacco di duplicazione del codice per i casi complessi (anche se trovo difficile prevedere esattamente quando ciò avverrà).

+0

Ah, non ho mai usato la specializzazione, ottima risposta! –

+2

Rex, per informazioni, c'è un bug sollevato per il pattern matching https://issues.scala-lang.org/browse/SI-1133, fallisce perché viene generato troppo codice. Questo dovrebbe essere risolto con il nuovo matcher di pattern virtuale in 2.10. –