2012-09-03 148 views
1

任何人都可以告訴我(或指示某種來源)的編譯方式斯卡拉發生。編譯斯卡拉

我有一些疑惑,例如,

  • 在編譯步驟,如何斯卡拉編譯Java相關的東西?它是否單獨使用Java編譯器?
  • .scala的最終字節碼是否與Java的.class文件相同?
  • 由於Sun收購Oracle,JVM是否也屬於Oracle?
  • 如果有一天JVM獲得了專有軟件,那麼是否也會影響到Scala?
+1

「屬性」是什麼意思?您的意思是「獲得屬性」,如「對bean屬性的第一級支持」一樣? –

+0

他的意思是「成爲專有軟件」,例如,需要付費許可證。 – pcalcao

回答

5

如果您願意,您可以查看compiler source code,但如果您想查看Martin Odersky's presentations on the compiler internals,則可能會提供更多信息。

在回答您的具體問題:

  • 是。 scalac的早期版本不會這樣做,並且需要您先運行javac;但scalac可以compile Java files using javac where needed since 2.7.2
  • 這是相同的格式,當然。具體取決於你在Scala中做了什麼,它可能不會產生完全相同的JVM操作,但它完全符合字節碼規範(這是它可以在JVM上運行的原因)。
  • 是的,不管你是指JVM specification還是實際的vm實現(JRE下載)。
  • 我不確定你的意思是「有錢」。但是,我懷疑答案,就你所問的而言,是「不」。 Scala以標準字節碼格式編譯爲Java類文件。在運行時,在Scala中編寫的代碼/類和用Java編寫的代碼/類之間沒有區別。因此,從根本上防止Scala代碼在這些JVM上運行的任何事情也會阻止Java代碼的運行。
+2

我認爲你的第一個子彈有點誤導。 'scalac'實際上不會編譯Java源文件 - 我不認爲它甚至使用'javac'。 'scalac'只有類型檢查相關的Java源文件。引用您鏈接到的博客帖子:「但是,如果不調用javac,只會收到已編譯的Scala類,Java類將被忽略(除了類型檢查器)。」 – DaoWen

+0

嗨Andrzej Doyle!非常感謝您的寶貴反饋。玩得開心! – Channa

2
  • 在編譯步驟,如何斯卡拉編譯Java相關的東西?

Scala不編譯Java。它足夠了解Java,找出這些類的API是什麼,但僅此而已。

  • 它是否單獨使用Java編譯器?

它期望你用java編譯器編譯你的java文件。

  • .scala的最終字節碼是否與Java的.class文件相同?

是的。 Scala生成有效的.class文件。但是,將該文件轉換爲Java代碼是不可能的,因爲有效的類文件允許Java不允許或不能代表的東西。

  • 由於Sun收購Oracle,JVM是否也屬於Oracle?

沒有「the」JVM。現有的JVM有很多,實際上,Oracle有自己的專有JVM。當然,Sun的JVM現在是Oracle的。

  • 如果有一天JVM得到專有軟件,那麼是否也會影響到Scala?

一直存在着許多專有的JVM,從甲骨文就是其中之一。

讓我們考慮一個假設的「最壞情況」情形:世界上的所有JVM都變成許可(付費)產品或不復存在。當然,斯卡拉仍然可以在Dalvik虛擬機上運行,​​但是讓我們假設它也會被支付或不復存在。

在這種情況下,斯卡拉仍然可以仍然繼續存在,但你必須支付能夠運行用Scala編譯的程序。事實上,由於Scala是一個JVM程序,你甚至不得不付出代價才能使用編譯器!

或者,斯卡拉可以分支到一些其他目標平臺。斯卡拉現在有這樣的努力,但絕對沒有壓力讓他們生產級。如果有必要,它會完成。

+0

嗨,丹尼爾!非常感謝您的好回饋。玩得開心! – Channa