E语言
此條目需要补充更多来源。 (2018年11月28日) |
E语言是1997年由Mark S. Miller、Dan Bornstein和Electric Communities的其他人创建的用于安全分布式计算的面向对象程序设计语言。E语言主要源自于安全分布式编程中Java的并行语言Joule和Original-E,后者是Java的一组扩展。E将基于消息的计算与类Java语法相结合。基于事件循环和Promise的并发模型确保永远不会发生死锁。
编程范型 | 多范型;面向对象,消息传递 |
---|---|
設計者 | Mark S. Miller |
发行时间 | 1997 |
型態系統 | 强类型、动态类型 |
操作系统 | 跨平台 |
許可證 | portions in different free licenses |
網站 | erights |
主要實作產品 | |
E-on-Java, E-on-CL | |
啟發語言 | |
Joule, Original-E, Java | |
影響語言 | |
Pony |
开发理念以及过程
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...