2011-12-18 74 views
27

請原諒這個有趣的標題,我用它類比「zip bomb」。是否有可能創建一個scala源文件,這會在編譯時生成大量的類文件(或非常大的單個類文件)?有沒有什麼方法可以使類文件的大小比源文件的大小線性增長更快?斯卡拉炸彈? (像一個拉鍊炸彈)

+1

你到底想要什麼? – 2011-12-18 11:48:22

+1

@NikitaVolkov這聽起來像一個有趣的心理練習,但我有一個問題試圖找到一個實際的應用程序。 – Vatine 2011-12-18 11:55:08

+6

好的,對於那些需要實踐應用的人:試圖保護一個從DOS攻擊編譯Scala代碼的服務。 – 2011-12-18 12:00:13

回答

32

專業化在類型參數的數量方面天生就是指數型的。

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 

模式匹配也可能涉及大量的代碼重複複雜的情況下(雖然我覺得很難準確預測何時會發生)。

+0

啊,我從來沒有用過專業化,很好的答案! – 2011-12-18 13:09:27

+2

Rex,對於信息來說,有一個模式匹配https://issues.scala-lang.org/browse/SI-1133的錯誤,它會失敗,因爲生成的代碼太多。這應該在2.10中使用新的虛擬模式匹配器來解決。 – 2011-12-18 13:27:36