动态类型和分布式系统编程

14

我之前学习Scala(和Akka),最近开始了解其他专注于分布式计算的语言,特别是Erlang(以及一点点Oz和Bloom)。Erlang和Oz都是动态类型的语言,如果我没记错的话(会尝试找链接证实),人们尝试为Erlang添加类型,并成功地对其中大部分内容进行了类型标注,但无法成功强制让系统适应最后一部分。

Oz虽然是一门研究性质的语言,但它也是动态类型的。

Bloom目前的实现是用Ruby编写的,因此也是动态类型的。

据我所知,Scala(我想Haskell也是,尽管它最初建立在纯惰性函数编程语言的探索基础之上,而不是分布式系统)是唯一一种静态类型的语言,可以在语言级别提供分布式计算的抽象(缺乏更好的词汇形容)。

我只是想知道动态类型编程与静态类型编程相比,在提供编程分布式系统的语言级别抽象方面,是否有明显的优势。


1
Akka的当前实现目前是无类型的(使用任何消息)。Scala 2.10引入宏使得实现有类型版本更容易。请参阅nescala 2013年的此视频:http://nescala.org/#t-14537068 - Ionuț G. Stan
3个回答

15

并不是完全如此。例如,之后发明Oz的同一团队曾经在Alice ML上进行了一些工作,这个项目的使命宣言是重新思考Oz作为一个类型化的函数式语言。虽然它仍然是一个研究项目,但我认为它已经足够证明同样的基本功能可以在这种环境中得到支持。

(充分披露:我当时是该组的博士生,Alice ML的类型系统是我的论文。)

编辑:向Erlang添加类型的问题不在于分布,而只是一个更普遍的问题的实例,即在事后向语言添加类型通常效果不好。另一方面,对于Erlang仍然有Dialyzer。

编辑2:我应该提到还有其他有趣的研究项目用于类型化分布式语言,例如Acute,其范围类似于Alice ML,或者ML5,它使用模态类型来实现更强的移动特性检查。但它们只以论文的形式存在。


Alice ML 确实看起来很有趣,但自2007年以来似乎没有任何活动了?你知道是否有未来的工作将在其上进行吗?根据 GitHub 的活动记录,Oz(特别是 Mozart)正在计划平台的第2版。 - adelbertc
@adelbertc,Alice仍然用于教授大一新生,但遗憾的是我不知道是否有进一步开发的计划。关于Mozart 2:大部分原始贡献者已不再参与,我也不确定是否有具体的时间表。 - Andreas Rossberg
啊,这些编程语言都很有趣,但不幸的是它们似乎都遭受了其他研究项目遭遇的同样命运..也许Bloom会成为下一个竞争者? - adelbertc
@adelbertc,没错。不幸的是,很少有研究项目拥有将项目转化为产品所需的资源,更别提维护了。 - Andreas Rossberg
Alice ML好像对动态类型/模块加载有一些不同寻常的支持,如果我没记错的话。那个支持是专门为分布式系统添加的吗? - Steven Shaw
1
@StevenShaw(抱歉,我当时不知道你有问题):更普遍地说,支持我们所谓的“开放式”编程。某些形式的分布式编程是其实例。但是,像动态/惰性链接这样的功能即使对于非分布式应用程序也可能相关。 - Andreas Rossberg

10
动态类型与静态类型在分布式系统中没有固有的优势。总的来说,两者各有优缺点。
Erlang(Akka受到Erlang Actor模型的启发)是一种动态类型语言。历史上选择Erlang中的动态类型是出于简单的原因;最初实现Erlang的人大多来自动态类型语言,特别是Prolog,因此,将Erlang设为动态类型对他们来说是最自然的选择。Erlang是为失败而建立的。
静态类型有助于在编译时捕获许多错误,而不是像动态类型一样在运行时捕获。在Erlang中尝试了静态类型,但失败了。但是动态类型有助于更快的原型设计。查看这个链接以获取更多关于区别的信息
主观上,我宁愿考虑问题的解决方案/算法,而不是思考我在算法中使用的每个变量的类型。这也有助于快速开发。
这些是可能有帮助的一些链接。

动态类型的好处

静态类型与动态类型

反常的静态类型辩论


1
请问您能否详细说明“Erlang是为失败而构建的”? - Andriy Tylychko
4
Erlang的核心理念是:一个组件的失败不应该影响整个系统。编程错误、硬件故障或网络故障等都会被考虑在内:该语言包含了一些特性,如监管树、监控Erlang进程等,能够帮助系统从故障中恢复,分配到不同的节点,处理意外错误,并且始终保持运行状态。尽管大多数编程语言和类型系统的目标是使程序无错误,但Erlang却假定错误总会发生,并确保覆盖这些情况。参考来源:http://learnyousomeerlang.com/types-or-lack-thereof - Vinod

0

Cloud Haskell 迅速成熟,具有静态类型和强大的功能。唯一不具备的是 Erlang 风格的热代码交换 - 这是动态类型分布式系统的真正“杀手锏”(使 Erlang 难以静态类型化的“最后一点”)。


最近我看了一下,它也没有包括监管进程,这是 Erlang 带来的最好的想法之一。最近有变化吗?当然,提到这一点,并不意味着动态语言在这方面有优势 - Akka 为 Scala(和 Java)提供了这些功能,因此显然没有固有的限制。 - Thomas Lockney
1
云Haskell提供了监督功能,但不是由distributed-process库提供,而是由其超集distributed-process-platform提供。这还没有发布到hackage上,但它确实提供了对gen-server和supervisor的支持,以及从OTP借鉴来的其他一些有用的抽象。第一个公共版本将在今年夏天发布 - 当它发布时,我会更新这个帖子。 - hyperthunk
@hyperthunk:太棒了,很高兴听到这个消息!前几天我在阅读 Cloud Haskell 论文时发现缺少 Erlang 风格的监督机制,期待今年夏季发布。 - adelbertc
@adelbertc - 正如你所知,这个版本的发布已经严重延迟,但是它仍在制作中,并且应该会在二月底前发布。 - hyperthunk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接