Julia ---- 有沒有類型檢查?

 

Julia 目前沒有用於類型檢查的工具,語言本身也沒有特別的類型檢查的機制。但它是有類型註釋的。但類型註釋可能是一個紅鯡魚問題,類型註釋無法實現類型檢查。添加類型註釋也非常簡單:只需在任何字段、參數或表達式上加上::Any,它就會有一個類型註釋,這也是Julia隱式地做的。但這不能告訴編譯器關於該對象的實際類型的任何有用信息。它給人一種假象,好像是有類型檢查 但實際沒有添加任何信息。

這裏有一個問題,需要具體的類型註釋怎麼辦?這就沒有辦法在任何函數上添加::Any。然而,抽象類型還是非常有用的,如果不用很多情況下是非法的。例如,identity函數的定義是

identity(x) = x

在這中情況下,你會在x上添加什麼具體的類型註釋?這個定義適用於任何x,唯一正確的類型註釋是x::Any。這並不是一個異常現象:有許多函數定義需要抽象類型才能正確,因此,在使用Julia編寫代碼,並強迫使用具體類型將是相當有限的。

Julia 經常提到“類型穩定性”的概念。這個術語似乎起源於Julia社區,但也被其他動態語言社區(如R)所接受。它的定義有點棘手,但它大致意味着,如果您知道方法參數的具體類型,那麼您也知道其返回值的類型。即使一個方法是類型穩定的,這也不足以保證它會進行類型檢查,因爲類型穩定並沒有討論任何規則來決定是否進行類型檢查。但這也是一種正確的方式:您希望能夠檢查每個方法定義的類型是否穩定。

但有可能你不想要求類型穩定性。自從Julia 1.0以來,可以定義一個小的類型集合(Union{Nothing,T}),並且這種方式已經很普遍了。這是從重新設計迭代協議開始的,該協議現在不使用任何方式來指示迭代已經完成,而在有更多的值要迭代時,返回(值、狀態)元組。標準庫中的find*函數也使用返回值nothing來表示沒有找到值。這些都是技術上的類型不穩定性,但是它們是有意的,編譯器非常擅長在這種不穩定性的情況下,對代碼進行優化。因此,小的類型集合在現在的代碼編寫中是被允許的,而且,沒有明確的界限。雖然可以說Union{Nothing,T}的返回類型是可以接受的,但是沒有比這更不可預測的了。

可能有些人需要的既不是類型註釋 也不是 類型穩定性,而是一個有效的工具來檢查代碼是不是會拋出異常,或者更廣泛地說,檢查代碼會不會拋出任何類型異常的錯誤。Julia的編譯器通常可以精確地確定應該調用哪個方法,或者至少將其縮小到幾個方法的範圍。這也是它爲什麼能生成快速執行的代碼,而完全動態調度卻非常慢(例如,在C++中比VTABLE慢得多)。另一方面,如果您編寫了不正確的代碼,編譯器直到運行時才告訴你出錯,但這些是語言的語義。

編譯器能夠確定在每個調用點可以調用正確的方法:這將保證代碼將是快速的,並且沒有方法錯誤。某種程度上說,Julia 編譯器已經做了很多工作,並且是作爲代碼生成過程的一部分,這也有點類似類型檢查的功能吧。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章