在 Wallaroo Labs,我担任工程副总裁,我们正在构建一个用 Pony 编程语言编写的 高性能、分布式流处理器。大多数人没有听说过 Pony,但它一直是 Wallaroo 的绝佳选择,并且它也可能是您下一个项目的绝佳选择。
“编程语言只是另一种工具。它与语法无关。它与表达能力无关。它与范式或模型无关。它与管理难题有关。” —Sylvan Clebsch,Pony 的创建者
我是 Pony 项目的贡献者,但在这里我将介绍为什么 Pony 对于像 Wallaroo 这样的应用程序来说是一个不错的选择,并分享我使用 Pony 的方式。如果您有兴趣更深入地了解我们为什么使用 Pony 编写 Wallaroo,我们有一篇关于此的博客文章。
什么是 Pony?
您可以将 Pony 视为类似“Rust 遇见 Erlang”的东西。Pony 具有引人注目的功能。它是
- 类型安全
- 内存安全
- 异常安全
- 无数据竞争
- 无死锁
此外,它被编译为高效的本地代码,并且它是开源开发的,并根据两条款 BSD 许可证提供。
有很多功能,但在这里我将重点介绍我的公司采用 Pony 的几个关键功能。
为什么选择 Pony?
使用我们现有的大多数工具,编写快速、安全、高效、高度并发的程序并不容易。“快速、高效和高度并发”是一个可以实现的目标,但如果加上“安全”,事情就会变得更加困难。对于 Wallaroo,我们希望实现所有这四个目标,而 Pony 使其易于实现。
高度并发
Pony 使并发变得容易。它实现这一目标的部分方式是提供有主见的并发故事。在 Pony 中,所有并发都通过 Actor 模型实现。
Actor 模型最著名的是 Erlang 和 Akka 中的实现。Actor 模型自 1970 年代以来就已存在,并且实现的细节差异很大。不变的是,所有计算都由通过异步消息传递进行通信的 Actor 执行。
将 Actor 模型这样理解:面向对象编程中的对象是状态 + 同步方法,而 Actor 是状态 + 异步方法。
当 Actor 收到消息时,它会执行相应的方法。该方法可能会对只有该 Actor 才能访问的状态进行操作。Actor 模型允许我们以并发安全的方式使用可变状态。每个 Actor 都是单线程的。Actor 中的两个方法永远不会同时运行。这意味着,在给定的 Actor 中,数据更新不会导致数据竞争或通常与线程和可变状态相关的其他问题。
快速且高效
Pony Actor 使用高效的工作窃取调度程序进行调度。每个可用的 CPU 都有一个 Pony 调度程序。每核线程并发模型是 Pony 尝试与 CPU 协同工作以尽可能高效地运行的一部分。Pony 运行时尝试尽可能对 CPU 缓存友好。您的代码刷新缓存的次数越少,运行效果就越好。Pony 旨在帮助您的代码与 CPU 缓存友好相处。
Pony 运行时还具有每个 Actor 的堆,因此在垃圾回收期间,不会出现“停止世界”的垃圾回收步骤。这意味着您的程序始终在执行至少一些工作。因此,Pony 程序最终具有非常一致的性能和可预测的延迟。
安全
Pony 类型系统引入了一个新颖的概念:引用功能,这使数据安全成为类型系统的一部分。Pony 中每个变量的类型都包含有关数据如何在 Actor 之间共享的信息。Pony 编译器使用该信息在编译时验证您的代码是否无数据竞争且无死锁。
如果这听起来有点像 Rust,那是因为它就是。Pony 的引用功能和 Rust 的借用检查器都提供数据安全;它们只是以不同的方式处理它,并且具有不同的权衡。
Pony 适合您吗?
决定是否为非爱好项目使用新的编程语言是困难的。您必须权衡工具的适用性及其相对于其他解决方案的不成熟性。那么,Pony 和您呢?
如果您有难以解决的并发问题,Pony 可能是正确的解决方案。并发应用程序是 Pony 存在的理由。如果您可以使用单线程 Python 脚本完成您想要的操作,您可能不需要 Pony。如果您有难以解决的并发问题,则应考虑 Pony 及其强大的无数据竞争、并发感知类型系统。
您将获得一个编译器,它可以防止您引入许多与并发相关的错误,并且运行时将为您提供出色的性能特征。
Pony 入门
如果您准备好开始使用 Pony,那么您的第一次访问应该是 Pony 网站的 Learn section。在那里,您将找到安装 Pony 编译器的说明和学习该语言的资源。
如果您喜欢为正在使用的语言做出贡献,我们在 GitHub 上为您准备了一些 初学者友好的问题。
此外,我迫不及待地想在 我们的 IRC 频道和 Pony 邮件列表上与您交谈。
要了解有关 Pony 的更多信息,请参加 Sean Allen 的演讲,Pony:我如何学会停止担忧并拥抱未经证实的技术,在 第 20 届 OSCON,2018 年 7 月 16 日至 19 日,俄勒冈州波特兰举行。
6 条评论