2011-01-11 42 views
6

我來自PHP/Python/Javascript背景,最近對Scala非常感興趣 - 特別是來自Web站點的Akka。學習Scala作爲第一個VM /編譯語言 - 工作流挑戰

雖然有一般的工作流程,但是與解釋性語言(如我所描述的)相比,我遇到了極其困難的時間。

一般來說,我傾向於編碼,測試結果,編碼和重複。當20行類中的單行變更需要30秒才能編譯和運行時,這會停滯不前。這真的很正常嗎?我是否需要構建,構建,構建,然後在30分鐘或一個小時後回溯並編譯/測試?

(我正在使用IDEA和SBT)我是否需要專門學習如何使用Maven,而不是鏈接到回購站?

想法?建議嗎?

+0

它實際上是30秒還是隻是額外的步驟使它看起來如此? – sblundy 2011-01-11 18:44:10

+1

我也做過Scala編譯器非常慢的經驗。通過使用Scala編譯服務器可以緩解這一點。編譯完成後,這個程序不會終止。編譯服務器運行時,使用命令「fsc」而不是「scalac」來編譯。我在IntelliJ IDEA中使用它,但我不使用SBT,也不知道如何在SBT中使用Scala編譯服務器。也許你可以谷歌,或者也許別人知道更多關於這個話題。 – Madoc 2011-01-11 19:16:07

+0

下次我有機會再次與Scala坐下時,我必須看看實際的時間戳。這可能看起來很長...... – mmatey 2011-01-11 19:17:35

回答

8

我認爲你和Idea以及SBT在正確的軌道上。你有沒有試過

~compile 

這將自動檢測到你的源的變化。對於Web應用程序,你可以做後面

~prepare-webapp 

一個

jetty-run 

要不斷編譯和重新部署應用到碼頭。讓Scala開發者感覺很像Python網站開發。

通常我發現編譯時SBT速度非常快,尤其是您所談論的大小文件。當我保存我的更改並轉到我的SBT提示符時,就完成了。

另一個方便的SBT方面是REPL將加載你的項目和它的依賴:

console 

你可以裝任何編譯變化與

:replay 
在斯卡拉REPL

編輯: 猜猜我應該提到,你可以玩一個簡單的類與主要方法。如果您創建一個名爲src /主/斯卡拉/文件Foo.scala看起來像這樣:

object Foo { 
    def main(args: Array[String]) { 
    println("Hello World") 
    } 
} 

和文件工程/建造/ Build.scala這樣的:

import sbt._ 
class Build(info: ProjectInfo) extends DefaultProject(info) { 
    override def mainClass = Some("Foo") 
} 

然後sbt提示符,你可以做

~run 

要不斷編譯並運行Foo.main方法。您可能需要先在sbt中進行「重新加載」。從保存更改到查看輸出似乎需要2-3秒。然後,您只需編輯,保存並查看更改。這是一個非常好的工作流程。

此外,不要忘記REPL - 絕對是學習Scala的關鍵工具。你可以通過交互方式學習一些東西。

5

IDE援助:

靜態類型語言,我發現自己少做工作流比我做動態類型的,但也僅僅是可能的,因爲優秀的IDE援助(打字信息允許它來檢測儘早發現錯誤,並在編輯時提供準確的建議),因此它可以在您描述的代碼測試循環中節省一些時間。

但是IDEA中的Scala IDE支持尚未處於Java級別,例如 在捕捉編輯錯誤(恕我直言)和編譯速度方面都不例外。

REPL /腳本支持:

不要忘記,你仍然可以使用Scala的REPL,工作流是很像你會在Python可以用來例如。

IDEA +斯卡拉速度:

您可以參考this question對IDEA + Scala的速度進行更多的討論。

1

靜態類型語言的一個優點是類型系統可以捕獲多種類型的錯誤/錯誤。所以,從理論上講,你不應該經常經歷艱難的事情。

當然有很多變化,特別是在用戶界面,只有在屏幕上的眼球可以檢查。所有我可以建議有良好的模塊化來保持編譯/編譯時間。和單元測試。我不知道你來自哪個社區,但是在java/scala中,高度推薦單元測試。你會發現代碼的工作方式是否更快。

答案歸結爲:儘量避免建立並重新啓動以儘可能檢查您的工作。

2

我使用JRebel插件與maven。我關掉NetBeans編譯保存功能,(不知道是否有類似intellij),並運行scala:cc - 從控制檯連續編譯目標。它會等待源代碼的任何更改,因此在完成一些操作後,該文件將被編譯,複製到/target目錄,然後被熱切換到正在運行的虛擬機中。這個過程需要幾秒鐘的時間,具體取決於文件的大小(我假設你從事網絡開發,因爲你提到了PHPJavaScript)在後臺運行的服務器有fsc,這也是編譯速度加快的原因之一向上。
有一些小缺點,你不能改變超類,這意味着你不能從AbstractFunction1AbstractFunction2(它們代表匿名函數) - 將(x) => x更改爲(x,y) => x + y意味着你需要重新啓動服務器。
相關鏈接:
scala:cc
jrebel

1

我的Python樣的工作流程 - 這給我留下了很短的時間等待 - 一般無二如下:

  • 轉到我嘗試做成一個庫(把它放在.jar中,並將其添加到類路徑中)。

  • 在編輯器中處理新代碼,但將其粘貼到REPL中而不是單獨編譯。一旦運行良好,請添加單元測試。

  • 將新代碼放入庫中。重複。

我可以在上網本上做到這一點,而不是等待超過〜3秒的任何一步。