Facebook 開源 Skip,面向對象+函數式程式語言

2020-12-20 開源中國

近日,Facebook 開源了全新語言 Skip,這是 Facebook 內部開發的一個實驗性質程式語言,Facebook 表示,Skip 項目於 2018 年完成,今後將不再積極開發。


Skip 的官方一句話介紹是「跳過那些你已經做過計算的」(skip the things you have already computed),這也就是它作為一個研究項目的主要目標,它要探索程式語言和運行時可以怎樣去支持準確、高效的基於記憶的緩存和緩存失效。而通過靜態類型系統追蹤可變性,Skip 完成了這個目標,同時它也支持現代程式語言特徵,例如 trait、泛型與子類型。

Skip 是一種通用程式語言,它跟蹤副作用,提供反應失效的緩存、ergonomics 和安全的並行化以及高效的 GC。Skip 是靜態類型的,它使用 LLVM 提前編譯,生成高度優化的可執行文件。具體特點如下:

反應失效的緩存

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

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

高效和可預測的 GC

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

混合函數式與面向對象語言的特點

Skip 的一大特點是混合了函數式與面向對象程式語言的特點,將兩者有機整合成了一種緊密結合的語言。與函數式語言類似,Skip 表達能力強,支持抽象的數據類型、模式匹配、簡單的 lambda 和高階函數等;另一方面,與命令式面向對象的語言相似,Skip 支持可繼承的類、可變對象、循環和提前返回。Skip 還結合了「系統」語言的思想,以支持低開銷抽象、通過值類的緊湊內存布局,以及確保利用靜態方法分派實現代碼特例化的模式。

具體細節請查閱官方:http://www.skiplang.com/

Skip 由經驗豐富的團隊設計,包括 ActionScript、C#、Flow、Hack、HHVM、Prettier、React Native 和 Relay 的高級貢獻者,從 2015 年到 2018 年,Facebook 花了 3 年在這個項目上,該語言的主要設計者是 Facebook 語言團隊負責人 Julien Verlaguet,他維護了該語言、編譯器與庫。如今 Facebook 宣布不再積極開發,但是通過開源的方式,希望讓 Skip 繼續保持活力,讓程式語言研究社區在語言設計與實現、編譯器和庫的基礎上進行研究和構建。

GitHub:https://github.com/skiplang/skip

相關焦點

  • 面向對象與函數式編程的簡單案例
    // 每日前端夜話 第396篇// 正文共:2600 字// 預計閱讀時間:8 分鐘介紹先簡要介紹一下面向對象和函數式編程。兩者都是編程範式,在允許和禁止的技術上有所不同。有僅支持一種範式的程式語言,例如 Haskell(純函數式)。
  • Python面向對象程式語言
    Python (發音:[ 'paiθ(ə)n; (US) 'paiθɔn ]n.蟒蛇,巨蛇 ),是一種面向對象的解釋性的電腦程式設計語言,也是一種功能強大而完善的通用型語言,已經具有十多年的發展歷史免費、開源————Python是FLOSS(自由/開放源碼軟體)之一。簡單地說,你可以自 由地發布這個軟體的拷貝、閱讀它的原始碼、對它做改動、把它的一部分用於新的自由軟體中。FLOSS是基於一個團體分享知識的概念。這是為什麼 Python如此優秀的原因之一——它是由一群希望看到一個更加優秀的Python的人創造並經常改進著的。
  • Swift 不是多範式函數式程式語言
    它通常的結構是帶有實例(對象)的類的層次結構,這些實例繼承了屬性和方法。當面對一個問題時,面向對象編程的問題是「需要什麼樣的對象一起工作才能解決此問題?」這兩種思維方式在流行的程式語言中極其普遍,並且可以很好地協同工作。自從第一批機器語言問世以來,過程式編程就一直伴隨著我們。即使是早期的自動織布機也是在過程式範式下工作。
  • Python基礎知識——python面向對象的解釋型計算機程式語言
    python面向對象的解釋型計算機程式語言。,即彙編器高級程式語言,c語言,Java語言,Python語言,JavaScript語言高級計算機程式語言,分為:解釋型程式語言和編譯型程式語言(程序+翻譯器)翻譯軟體:一種稱為虛擬機,一種稱為解釋器c語言,c++語言,Go語言 屬於編譯型的寫好程序,通過編譯器把程序編程機器能執行的程序(含有機器碼),把程序給用戶即可。
  • Facebook 發布開源程式語言——Hack
    據國外媒體報導,Facebook周四發布一款名為「Hack」的全新程式語言,並聲稱該語言將能使代碼的編寫和測試更加高效快速。 Facebook已在公司內部使用該語言超過一年時間,現在將以開源的形式將其正式發布。
  • Java如何支持函數式編程?
    在很長的一段時間裡,Java一直是面向對象的語言,一切皆對象,如果想要調用一個函數,函數必須屬於一個類或對象,然後在使用類或對象進行調用。但是在其它的程式語言中,如JS、C++,我們可以直接寫一個函數,然後在需要的時候進行調用,既可以說是面向對象編程,也可以說是函數式編程。從功能上來看,面向對象編程沒什麼不好的地方,但是從開發的角度來看,面向對象編程會多寫很多可能是重複的代碼行。
  • 一步步分析:C語言如何面向對象編程
    +語言是使用最普及的,在C++11版本之前,它們的語法是比較相似的,只不過C++提供了面向對象的編程方式。這篇文章,我們就來聊聊如何在C語言中利用面向對象的思想來編程。也許你在項目中用不到,但是也強烈建議你看一下,因為我之前在跳槽的時候就兩次被問到這個問題。
  • Python中的函數式編程
    (英語:functional programming)或稱函數程序設計,又稱泛函編程,是一種編程範型,它將電腦運算視為數學上的函數計算,並且避免使用程序狀態以及易變對象。函數程式語言最重要的基礎是λ演算(lambda calculus)。而且λ演算的函數可以接受函數當作輸入(引數)和輸出(傳出值)。
  • 函數式編程聖經
    上帝看到約翰·麥卡錫發明了表處理語言 Lisp,卻只用來學術研究,很是傷心,就把 Lisp 解釋器的秘密告訴了他的學生史蒂芬·羅素,史蒂芬·羅素將eval函數在IBM 704機器上實現後,函數式編程的大門第一次向人類打開了。
  • 大數據入門:Scala函數式編程
    在大數據的學習當中,學到Spark部分,就免不了需要Scala這門語言了,Scala是Spark框架的原生程式語言,想要真正把Spark搞懂,那麼對Scala自然也需要相應程度的掌握。今天的大數據入門分享,我們就來講講Scala函數式編程。
  • C 語言面向對象編程 - 繼承
    語言面向對象編程 – 封裝的簡單概念和實現。上一篇文章的具體內容,可以查看以下連結: C 語言面向對象編程 - 封裝本篇文章繼續來討論一下,如何使用 C 語言實現面向對象編程的一個重要特性:繼承。繼承就是基於一個已有的類(一般稱作父類或基類),再去重新聲明或創建一個新的類,這個類可以稱為子類或派生類。子類或派生類可以訪問父類的數據和函數,然後子類裡面又添加了自己的屬性和數據。
  • 函數式編程,我心中的 C 位!
    最常見的三種範式分別是面向對象程序設計、命令式程序設計和函數式程序設計。這三種思想體系並無優劣之分,通常我們都需要選擇正確的工具來完成工作。大多數軟體工程師對於函數式編程的概念並不太熟悉。實際上,歷史上的第二個程式語言Lisp就屬於函數式範式。
  • 鮮為人知的靜態、命令式程式語言——Nimrod
    Nimrod是一個新型的靜態類型、命令式程式語言,支持過程式、函數式、面向對象和泛型編程風格而保持簡單和高效。Nimrod從Lisp繼承來的一個特殊特性抽象語法樹(AST)作為語言規範的一部分,可以用作創建領域特定語言的強大宏系統。它還是一個編譯型的具有垃圾收集的系統程式語言,有著極其卓越的生產/性能比。
  • C風格的面向對象編程
    面向對象編程(OOP),最早是C++、java等面向對象語言的一個核心特點,之後發展成了一種編程思想。面向對象編程的主要特點是,把屬性(數據)與方法(函數)按照類型綁定,並按照類型之間的關係分層分模塊設計,通過基類指針和虛函數實現多態。
  • 科普必讀丨計算機編程的歷史演進:用 50 種程式語言告訴你!
    Perl 程式語言,是為更容易地處理基於文本的信息而創建的。Perl 是一種解釋性語言,它受到了 C 語言的控制結構和列印結構的啟發,同時也受到了 shell 腳本語言的啟發。Caml 是 Categorical Abstract Machine Language 的縮寫,它是一種面向程序安全性和可靠性的通用程式語言。Caml 支持函數式、命令式和面向對象的編程風格。
  • 再談JavaScript面向對象編程
    導讀:陳皓曾發表過一篇文章《Javascript 面向對象編程》,珠玉在前,作者還是忍不住再畫蛇添足的補上一篇文章,主要是因為JavaScript這門語言魅力。另外這篇文章是一篇入門文章,是作者才開始學習Javascript,有一點心得,才想寫一篇這樣文章,文章中難免有錯誤的地方,還請各位不吝吐槽指正。
  • ...也可以面向對象面層,使用「函數指針結構體」為C語言找個「對象」
    C語言的「對象」事實上,定義好函數指針結構體之後,用起來也和普通數據類型定義的結構體一樣:struct cfun s;// init ss.vfun();s.ifun(a);struct cfun *ps = &s;ps->ffun(x);從上面這幾行C語言代碼可以看出,使用函數指針結構體調用函數,看起來很像其他高級語言中的「面向對象」風格。
  • 最佳 AI 程式語言Top5
    數智君 | 翻譯任何類型AI系統的開發,都需要用到計算機編程。對特定的AI或機器學習任務來說,適用的程式語言不止一種。我們一起來分析一下,對於你特定的應用場景,哪種程式語言可稱最佳? 我們挑選了5種程式語言,如果你想在人工智慧領域獲得成功,那麼它們就是你的最佳選擇。當然,對給定的項目來說,每種語言都有其優勢和缺點,所以要先考慮你的最終目標,再決定具體採用哪種語言。
  • 函數式編程
    這個有點像Javascript的Prototype(參看Javascript的面向對象編程)尾遞歸優化:我們知道遞歸的害處,那就是如果遞歸很深的話,stack受不了,並會導致性能大幅度下降。所以,我們使用尾遞歸優化技術——每次遞歸時都會重用stack,這樣一來能夠提升性能,當然,這需要語言或編譯器的支持。Python就不支持。
  • 給JavaScript 開發者講講函數式編程 - OSCHINA - 中文開源技術...
    從那時起,我開始更深地了解函數式編程並且我覺得應該為那些總能聽到它但不知道究竟是什麼的新人做一點事情。儘管它們都是函數式語言,不過的確有很大的不同,可以說各有各的賣點。在文章的結尾處,我希望你能夠對這些有一個更加清晰的認識。它們都在某些更加現代的語言上留下了自己的影子。你可能聽說過這樣兩種語言:Elm 和 Clojurescript,它們兩個都可以編譯為 JavaScript。不過在我深入了解語言的規範之前,我更想讓你們深入了解函數式語言中的一些核心概念和模式。