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

Posted

技术标签:

【中文标题】动态类型和编程分布式系统【英文标题】:Dynamic typing and programming distributed systems 【发布时间】:2013-04-03 22:05:17 【问题描述】:

我来自 Scala(和 Akka),最近开始研究其他设计时考虑到分布式计算的语言,即 Erlang(以及一点点 Oz 和 Bloom)。 Erlang 和 Oz 都是动态类型的,如果我没记错的话(会尝试查找链接)人们曾尝试向 Erlang 添加类型并设法键入其中的大部分内容,但无法成功强制系统使其适合最后一点?

Oz 虽然是一门研究语言,但对我来说当然很有趣,但它也是动态类型的。

Bloom 当前的实现是用 Ruby 实现的,因此是动态类型的。

据我所知,Scala(我猜是 Haskell,虽然我相信它最初是为了探索纯粹的惰性函数语言而不是分布式系统)是唯一一种静态类型并提供语言级别抽象的语言(因为没有更好的术语)分布式计算。

我只是想知道动态类型是否比静态类型具有内在优势,特别是在为分布式系统编程提供语言级别抽象的上下文中。

【问题讨论】:

当前 Akka 的实现是无类型的(使用 Any 表示消息)。 Scala 2.10 中宏的出现使得实现类型化版本变得更加容易。观看 nescala 2013 的这段视频:nescala.org/#t-14537068 【参考方案1】:

不是真的。例如,后来发明 Oz 的同一组在 Alice ML 上做了一些工作,该项目的使命宣言是将 Oz 重新考虑为一种类型化的函数式语言。虽然它仍然是一个研究项目,但我认为它足以证明在这样的环境中可以支持相同的基本功能。

(完全披露:当时我是那个小组的博士生,Alice ML 的类型系统是我的论文。)

编辑:向 Erlang 添加类型的问题不在于分布,它只是一个一般问题的实例,即事后向语言添加类型永远不会很好地工作。另一方面,仍然有 Erlang 的 Dialyzer。

编辑 2:我应该提一下,对于类型化分布式语言还有其他有趣的研究项目,例如Acute,其作用域类似于 Alice ML,或 ML5,它使用模态类型来加强对移动特性的检查。但它们只以纸的形式存在。

【讨论】:

Alice ML 看起来确实很有趣,尽管它似乎自 2007 年以来就没有任何活动?你知道是否有任何未来的工作要做吗?至少根据 GitHub 的活动,Oz(特别是 Mozart)似乎正在计划该平台的第 2 版。 @adelbertc,Alice 仍然在教新生,但遗憾的是我不知道有任何进一步发展的计划。 Re Mozart 2:原财团大部分不再参与,我什至不确定是否有具体的时间线。 (也针对您的第二次编辑)啊,这些语言看起来都很有趣,但不幸的是,它们似乎都落入了我见过的其他研究项目落入的同样命运……也许布鲁姆会下一个竞争者? @adelbertc,真的。不幸的是,很少有研究项目拥有将项目转化为产品所需的资源,更不用说维护它了。 @StevenShaw(抱歉,我当时不知何故错过了你的问题):更一般地说,支持我们所谓的 open 编程。某些形式的分布式编程就是其中的一个例子。但当然,动态/延迟链接等功能甚至对于非分布式应用程序也很重要。【参考方案2】:

对于分布式系统来说,动态类型相对于静态类型没有固有的优势。总的来说,两者都有自己的优点和缺点。

Erlang(Akka 的灵感来自 Erlang Actor Model)是动态类型的。历史上选择Dynamic typing in Erlang 的原因很简单;最初实现 Erlang 的人大多来自动态类型语言,尤其是 Prolog,因此,动态 Erlang 对他们来说是最自然的选择。 Erlang 在构建时考虑到了失败。

静态类型有助于在编译时捕获许多错误,而不是像动态类型那样在运行时捕获。在 Erlang 中尝试了静态类型,但失败了。但是动态类型有助于更快的原型设计。 Check this link for reference which talks a lot about the difference。

主观上,我宁愿考虑问题的解决方案/算法,而不是考虑我在算法中使用的每个变量的类型。它还有助于快速开发。

这些链接可能会有所帮助

BenefitsOfDynamicTyping

static-typing-vs-dynamic-typing

BizarroStaticTypingDebate

【讨论】:

能否请您详细说明“Erlang 在构建时考虑到了失败”? Erlang 是建立在一个组件的故障不应该影响整个系统的概念之上的。考虑到编程错误、硬件故障或网络故障等:该语言包括监督树、监控 Erlang 进程等功能,这些功能将允许从故障中恢复、分发到不同的节点、处理意外错误,并且永不停止运行。虽然大多数语言和类型系统旨在使程序无错误,但 Erlang 假设错误无论如何都会发生并确保涵盖这些情况。参考:learnyousomeerlang.com/types-or-lack-thereof【参考方案3】:

Cloud Haskell 正在迅速成熟,静态类型,非常棒。它唯一没有的是 Erlang 风格的热代码交换——这是动态类型分布式系统的真正“杀手级功能”(使 Erlang 难以静态类型的“最后一点”)。

【讨论】:

当我最近查看时,它也没有包括主管,这是 Erlang 带来的最好的想法之一。最近有变化吗?当然,尽管提到了这一点,但这并不意味着动态语言在这里有优势——Akka 为 Scala(和 Java)提供了这些,因此显然没有固有的限制。 监督是在云 haskell 中提供的,不是由分布式进程库,而是它的超集分布式进程平台。这还没有发布到 hackage,但确实提供了对 gen-servers 和 supervisors 的支持,以及从 OTP 借来的一些其他有用的抽象。第一个公开版本将于今年夏天发布 - 当它发生时我会更新这个线程。 @hyperthunk:太棒了,很高兴听到!前几天在看 Cloud Haskell 论文,缺了 Erlang 风格的监督,期待夏天的发布。 @adelbertc - 如您所知,该版本已被严重延迟,但它仍在准备中,应该在 2 月底之前可用。

以上是关于动态类型和编程分布式系统的主要内容,如果未能解决你的问题,请参考以下文章

# Day01-Java基础

软件构造第十章 线程和分布式系统

java

分布式文件系统发展史(内含动态图片)

let和const

分布式技术一周技术动态 2016-08-28