機器之心報導
作者:一鳴、Jamin
近日,微軟研究院開源了一個名為 Verona 的項目。這是一個面向研究的程式語言,旨在解決內存管理和計算機安全方面的問題,並借鑑了 Rust 等的新特性。
計算機安全中很多問題都和內存管理相關,很多相關研究機構正在探究一些方法。近日,微軟研究院開源了一個研究型的程式語言項目——Verona。
Verona 語言是一個開源項目,微軟研究院希望通過這個項目幫助學界研究更好的內存管理方法。據悉,該項目吸收了 Rust、Cyclone 的一些特點。
開源地址:https://github.com/microsoft/verona
Verona 語言是什麼
Verona 是一個微軟研究院發起的項目,用於研究並發方面的問題。研究者希望提供一種新的並發模型,能夠無縫地和所有權結合。
根據微軟給出的介紹,Verona 項目旨在探索有關語言和 runtime 方面的研究,以實現安全的可擴展內存管理和分區工作。
主要的研究問題如下:
如果設計的語言沒有並發突變,是否可以構建可擴展的內存管理;能否在不犧牲內存管理的情況下,使用線性區域來消除每個對象線性度的限制;能否使用語言級別的分隔?
目前 Verona 仍然是一個處於很早期的研究類項目,部分類型檢查器還有待實現,同時實現的語言功能也較少。
社區評價
項目開源後引起了社區的討論。一些開發者認為,Verona 嘗試抽象所有者模型,更接近人們的使用習慣,能夠在不失安全性的情況下創建數據結構,但是是否能夠成功有待觀察。
還有開發者認為,從微軟本身(而不是微軟研究院)的角度來看,建立一個像 Go 語言那樣的原生語言也是應該的。
Verona 要解決的問題
「系統程式語言」是一個有著廣泛範圍的問題。從高級關鍵性能系統到低級的內存管理器,以及內核模塊都有所涉及。系統編程有兩個不同的方面:
可預測性
延遲資源佔用
原始訪問(Raw access)
可將內存直接視作位(bits)和字節(bytes)硬體層面使用更少的抽象(甚至完全不需要)
並發突變和內存安全
在 Verona 項目中,研究者認為放棄並髮型突變(concurrent mutation)是可擴展內存管理的必要一步。通過消除並髮型突變,開發者就不能將並發實現成庫。通常情況下有兩種選擇,暴露「unsafe」以啟用不安全的庫去實現並發(如 Rust),或者為語言提供一個並發模型(如 Pony)。
前者意味著程式語言只能依賴較少的不變量,因為它無法理解那些非安全模塊中的代碼是如何提供並發能力的。後者意味著需要一個驚人的 Concurrency Story,因為只能有一個 Concurrency Story。
共享所有權
在 Verona 中,研究者引入一種新的並髮型編程模型:並發所有者,簡稱 cowns。它封裝了一些資源集(如內存區域),同時確保了每次由一個執行線程訪問這些資源。
在 Verona 中,我們可以將一個對象包裝在 cown 中,使其並發。
// x is some isolated object graphvarc = cown(x)// c is a cown that mediates access to x.// We have lost direct access to x here
一旦使用者將一個對象包裝在一個 cown 中,便只能通過調度的方式去訪問它。在 Verona 中,這一方法通過關鍵詞 when 完成的。
when (var x = c){// Access internals of cown(c) using name x in hereBuiltin.print("Hello\n")}Builtin.print("Goodbye\n")
分區
Verona 使用分區和對象組,作為所有權中的基本概念。研究者沒有將對象所有權指定為一個 reference 有一個對象,而是將其概括為一個引用可以對應擁有一個分區,而一個分區是一組對象。在一個分區內,任何對象都可以引用該分區內的任何其他對象。但是研究者對拓撲結構沒有限制。當整個分區的 reference 消失時,則回收整個分區。
在類型中,使用 iso(isolated)去表示這是對某個分區的引用。對於可變的則使用 mut 表示,在類型中表示可變但不可擁有的引用。當 mut 用於欄位類型時,引用指向與欄位對象位於同一分區。當對參數類型使用 mut 時,引用會指向未知分區中的對象。這借鑑了 Rust 中的一種類型。
當分配一個對象時,指定它是否應該在自己的分區中:
var x = new Node;
或者與另一個對象在同一分區中:
var y = new Node in x
分區可以嵌套,並形成一個分區樹,其中的根分區要麼在堆棧中或在 cowns 中。
系統測試
由 P 和 P# 啟發,Verona 的 runtime 和系統測試在設計時深度結合。Verona 的並發模型讓所有的並發交互都在 runtime 上進行。
基礎的應用原本是針對 runtime 的測試,但是研究者想到了一種語言上的替代編譯器,由於幫助測試。它由 veronac-sys 和 interpeter-sys 構建,需要以下額外的參數:
--run-seed N--run-seed_upper N
所以
veronac-sys.exe --run testsuite/demo/run-pass/dining_phil.verona --run-seed 100 --run-seed_upper 200
使用如下命令,便可以運行 100 個交叉存取(一種內存加速方法)樣例。
veronac-sys.exe --run testsuite/demo/run-pass/dining_phil.verona --run-seed 100 --run-seed_upper 200
據項目介紹稱,這一項目希望能夠通過開源和研究界展開更多的合作。目前項目仍在早期階段,對於微軟本身使用的工程項目不會有影響。