E語言
此條目需要補充更多來源。 (2018年11月28日) |
編程範型 | 多範式;物件導向,訊息傳遞 |
---|---|
設計者 | Mark S. Miller |
釋出時間 | 1997 |
型態系統 | 強型別、動態型別 |
作業系統 | 跨平台 |
許可證 | portions in different free licenses |
網站 | erights |
主要實作產品 | |
E-on-Java, E-on-CL | |
啟發語言 | |
Joule, Original-E, Java | |
影響語言 | |
Pony |
E語言是1997年由Mark S. Miller、Dan Bornstein和Electric Communities的其他人建立的用於安全分散式計算的物件導向程式設計語言。E語言主要源自於安全分散式編程中Java的並列語言Joule和Original-E,後者是Java的一組擴充。E將基於訊息的計算與類Java語法相結合。基於事件迴圈和Promise的並行模型確保永遠不會發生死結。
開發理念以及過程
[編輯]E語言在設計時考慮到了安全計算; 這主要是通過嚴格遵守物件導向計算模型來實現的,物件導向計算模型的純形式具有支援安全計算的屬性。E語言及其標準庫始終採用基於能力的設計理念,以幫助程式設計師構建安全的軟件,並使軟件組件即使彼此不完全信任也能夠合作。在E語言中,對象參照用作功能,因此功能不增加計算或概念性開銷。該語言的語法被設計為便於人們審查安全性缺陷。例如,詞法作用域限制了必須檢查對給定變數的影響的代碼數量。另一個例子,語言使用==運算子進行比較,使用:=運算子進行賦值; 為了避免混淆的可能性,沒有=運算子。
計算模型
[編輯]在E語言中,所有值都是對象,計算是通過向對象傳送訊息來執行的。每個物體都屬於一個vat(類似行程)。每個vat都有一個執行線程、一個堆疊幀和一個事件佇列。分散式編程只是向遠端對象(其他vat中的對象)傳送訊息的問題。與遠端方的所有通訊都由E執行時加密。到達的訊息被放置到vat的事件佇列中; vat的事件迴圈按到達的次序逐個處理傳入的訊息。
E語言有兩種傳送訊息的方式:即時呼叫和eventual傳送。立即呼叫類似於非並行語言中的典型函數或方法呼叫:傳送方等待接收方完成並返回值。eventual傳送傳送訊息,同時為結果生成一個預留位置,稱為promise。傳送者立即帶着promise繼續執行。之後,當接收者完成並產生結果時,promise將解析為結果。由於在與遠端對象通訊時只允許eventual傳送,因此不會發生死結。在分散式系統中,promise機制還可以最小化由網絡延遲引起的延遲。
語法和範例
[編輯]E的語法與Java最為相似,儘管它也與Python和Pascal有些相似。變數都是動態型別的,並且有詞法作用域。然而,與Java或Python不同的是,E完全由表達式組成。下面是一個非常簡單的E語言程式:
println("Hello, world!")
這裏有一個遞歸函數,用於計算一個數的階乘,它是用E語言寫的。函數使用def關鍵字定義。
def factorial(n :int) :int {
if (n == 1) {
return 1
} else if (n > 0) {
return n * factorial(n-1)
} else {
throw("invalid argument to factorial: "+n)
}
}
在第一行中,:int是約束函數的參數和結果的「守衛」。守衛與類型聲明並不完全相同;守衛是可選的,可以指定約束。第一個:int確保函數體只需要處理整數參數。如果沒有上面的第二個:int參數,函數將不能返回值。能夠事先看到函數的資訊泄漏,有利於安全審計。
由於E的目的是支援安全合作,因此E程式的典型例子是挖礦,它是一個簡單的電子貨幣系統,只需幾行E代碼。下面的代碼定義了一個挖礦的函數,其中每個礦廠都有自己的貨幣。每個礦廠可以製造裝有自己貨幣的錢包,任何兩個同一種貨幣的錢包的持有者都可以安全地在兩個錢包之間轉賬。通過快速檢查原始碼,E程式設計師可以很容易地驗證只有礦廠可以改變流通中的貨幣數量,貨幣只能被創造而不能被銷毀,礦廠只能創造自己的貨幣,只有錢包的持有者才能改變它的餘額。
def makeMint(name) :any {
def [sealer, unsealer] := makeBrandPair(name)
def mint {
to makePurse(var balance :(int >= 0)) :any {
def decr(amount :(0..balance)) :void {
balance -= amount
}
def purse {
to getBalance() :int { return balance }
to sprout() :any { return mint.makePurse(0) }
to getDecr() :any { return sealer.seal(decr) }
to deposit(amount :int, src) :void {
unsealer.unseal(src.getDecr())(amount)
balance += amount
}
}
return purse
}
}
return mint
}
在E語言中使用def關鍵字定義對象,在對象定義中,to關鍵字開始每個方法。本例中的守衛表達式說明了如何指定值約束(如:(int >= 0)或:(0..balance))。
挖礦的例子使用了一個內建的機制,稱為sealer。函數makeBrandPair建立了兩個關聯對象,一個sealer和一個unsealer,這樣sealer就可以在一個盒子中封口一個對象,而unsealer就是唯一可以檢索盒子中內容的對象。有關此貨幣範例的更詳細說明,請參閱E語言的網站。[1]
參考文獻
[編輯]- ^ Rees, Jonathan; Miller, Mark. From Objects To Capabilities - Simple Money. erights.org. ERights. 2001 [2014-07-08]. (原始內容存檔於2014-07-24).
Before presenting the following simple example of capability-based money, we must attempt to head off a confusion this example repeatedly causes. We are not proposing to actually do money this way! A desirable money system must also provide for...