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...