當前位置:
首頁 > 知識 > Facebook開源全新靜態語言Skip,性能如何你不了解下?

Facebook開源全新靜態語言Skip,性能如何你不了解下?

機器之心報道

機器之心編輯部

不久之前,MIT 發布 Julia 1.0引起了極大的關注。即使我們有了 Python 這樣簡單易用的語言,但新語言的開發依舊源源不斷。今日,Facebook 宣布開源全新語言 Skip,語法嚴謹、性能更好。

Skip 是 Facebook 開發的一個實驗性質的編程語言,從 2015 年到 2018 年開發了三年。

作為一個研究項目,Skip 的主要目標是探索支持準確、高效、基於記憶化(memoization)的緩存和緩存失效的語言和運行時。通過靜態類型系統追蹤可變性,Skip 做到了前面提到的特性,同時它也支持現代語言特徵,例如 trait、泛型與子類型。

據項目介紹,Skip 項目 2018 年已經結束,Facebook 不再積極開發。至於如何繼續保持該語言的穩定性,文章表示,Facebook 將會開源該語言,使編程語言研究社區在語言設計與實現、編譯器和庫的基礎上進行研究和構建。

該語言的主要設計者是 Facebook 語言團隊負責人 Julien Verlaguet,他維護了該語言、編譯器與庫。

Skip 概覽

Skip 是一種通用編程語言,它跟蹤副作用(side effect),提供反應無效的緩存、ergonomic 和安全的並行化以及高效的垃圾回收。Skip 是靜態類型的,它使用 LLVM 提前編譯,生成高度優化的可執行文件。

反應無效的緩存

Skip 主要的新特性是精準跟蹤副作用,包括值的可變性和區分非確定性數據源與能夠提供反應無效的數據源(當數據發生變化時告訴 Skip)。當 Skip 的類型系統能夠證明給定函數邊界沒有副作用時,開發人員可以選擇安全地記憶該計算,並在運行時確保當底層數據發生變化時,以前緩存的值無效。

安全的並行化

Skip 支持兩種互補的並發編程,由於它跟蹤副作用,這兩種編程都避免了常見的線程安全問題。首先,Skip 支持使用 async/await 語法的 ergonomic 非同步計算。由於 Skip 跟蹤副作用,非同步計算不能引用可變狀態,因此可以安全地並行執行(所以獨立的非同步計算可以並行繼續)。其次,Skip 有可用於直接並行計算的 API,同樣利用其追蹤副作用的特型來防止線程安全問題,如共享對可變狀態的訪問。

高效和可預測垃圾回收器(GC)

Skip 使用一種新型方法進行內存管理,即結合典型的垃圾回收特性和更直接的線性分配模式。由於 Skip 追蹤副作用,垃圾回收器僅需要掃描從底層計算處可訪問的內存。在實踐中,這意味著開發者能夠使用可預測 GC 寫代碼。

面向函數和面向對象的混合語言

Skip 的一大特點是混合了面向函數和對象的方法,整合二者形成一種具備聚合力的語言。與函數式語言類似,Skip 表達能力強,支持抽象的數據類型、模式匹配、簡單的匿名函數(easy lambdas)和高階函數等。與命令式面向對象的語言相似,Skip 支持具備繼承性的類別、可變對象、循環和 early return。Skip 還整合了「systems」語言的部分理念,支持低開銷抽象、通過值類的緊湊存儲布局,以及確保利用靜態方法調度實現代碼特化(code specialization)的模式。

絕佳的開發者體驗

Skip 的設計初衷是支持絕佳的開發者體驗,實現迅速迭代(常見於動態語言)。編譯器支持增量類型檢查(使用 IDE 插件的 alpha 版本,該版本可在你輸入時實現接近實時更新),提供常見的語法錯誤提示,幫助新手學習語言、識別方法/類別名的打字錯誤,甚至識別 Skip 標準庫方法名的常見別名,並建議正確的名稱。Skip 還主打代碼格式化工具(確保一致的代碼風格)和運行代碼模塊的工具。

初涉 Skip 語言

文檔地址:http://www.skiplang.com/docs/hello_world.html

試驗地址:http://www.skiplang.com/playground/

Hello world!

我們從經典的 Hello world 程序開始。

從中可以發現很多東西。函數需要類型注釋:我們指定了返回類型(void)。名為 main 的特殊函數被調用作為程序的入口點。我們沒有使用關鍵詞 return,因為 Skip 是一種基於表達式的語言:沒有語句的概念。接下來我們將看到如何在序列中編寫表達式。

函數

使用 fun 來聲明一個函數:

Skip 是一種類型化的語言,函數聲明必須包括所有參數的類型以及函數返回的類型。函數的主體是一個表達式,它被評估以產生函數的返回值。

變數通過運算符 = 引入:

變數 y 在沒有其指定類型的情況下被引入;局部變數的類型是被推斷出來的,很少需要明確指定。

上面的例子還引入了;運算符,被其分開的表達式按順序進行評估。

若要修改局部變數,需在 = 左邊的變數前面加上!。

Skip 是一種類型化語言。函數參數、返回類型和類別欄位等聲明都包括類型注釋。編譯器計算所有表達式的類型,並在遇到預料之外的類型時報錯。Skip 包括常見的基元類型:Int、Float、String、Char、Bool、void。

控制流

Skip 包括常見的控制流語句,如 if、for/in、while、do 和 loop。與大部分語言不同,Skip 的控制流語句是表達式,且和其它表達式一樣可以生成值。控制流表達式可用於期望使用的任何語境。

If-else

if/else 評估兩個可能的表達式中的一個。

在 if 表達式的結果必須是 void 類型表達式的情況下,else 從句可能被省略。

循環

for/in 表達式使得在集合或者序列所有元素上的迭代成為可能。

for/in 表達式主體中的 break 表達式終結了這一迭代。

類似地,while 和 do 循環可能包括其它子句:

機器之心《全球500強上市公司人工智慧戰略適應性報告》重磅發布。17個行業,140家上市公司,縱覽500強落地人工智慧的成與敗。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 機器之心 的精彩文章:

前沿 | Neuromation新研究:利用卷積神經網路進行兒童骨齡評估
人工智慧軍備競賽:一文盡覽全球主要國家AI戰略

TAG:機器之心 |