返回 登录
0

P语言: 为异步、容错和不确定性而生的编程语言

原文P: A programming language designed for asynchrony, fault-tolerance and uncertaint
作者:Shaz Qadeer
翻译:雁惊寒

cover

译者注:P语言是一款由微软、加州大学伯克利分校和伦敦帝国学院共同研发完成的编程语言,它在处理并发、故障切换等方面具有很强的优势。本文介绍了P语言的起源、特性及其使用场景。以下是译文。

新兴应用程序的复杂性需要使用新兴的方式去理解,然后才能高效地去构建、测试和调试。现在的应用程序常常会使用云资源,采用人工智能技术,并嵌入到物理设备中。这三个因素的结合使得软件开发变得非常困难。

通常来说,这些现代应用程序都具有异步性,主要表现在:为了提高性能,请求者在当前操作完成之前可继续执行后面的操作。异步不可避免地会产生并发,并带来一些臭名昭著的坑,例如竞态条件和海森堡bug(软件错误,通常与时序相关,但在调查其原因的时候该错误可能会消失,这是因为当前环境已经产生了变化)。为了应对异步计算带来的挑战,我们开发了P,一种用于在异步事件驱动应用程序中建模和制定协议的编程语言。该项目是微软研发人员以及加州大学伯克利分校伦敦帝国学院的学术研究人员之间通力合作的结果。

A flowchart of the P programming language tool chain

P语言工具链流程图

P的程序员在上层编写协议及其规范。P编译器提供针对竞态条件的自动化测试和承载了指定协议的可执行程序。P在如下这几个方面提供了一流的支持,包括:对并发进行建模、指定安全和活性属性​、系统性的搜索并检查程序是否满足其规范。对于这些功能来说,P与Leslie Lamport的TLA+Gerard Holzmann的SPIN相似。但与TLA+和SPIN不同的是,P程序也可以编译成可执行的C代码。这种能力在高级模型和低级实现之间起到了桥梁的作用,也让程序员可以更容易地接受正式的建模模型和规范。

P: programming language communicating state machines

通信状态机

在P中,程序设计模型的基础是依赖事件进行通信的并发执行状态机,而每个事件包含了类型化的有效负载值。基于线性输入和独特指针的内存管理系统提供了安全的内存管理和data-race-free并发执行机制。在这方面,P类似于现代编程语言,比如Rust

P在微软软件开发中的首次应用是在Windows 8.1和Windows Phone中承载USB 3.0驱动程序。这些驱动程序管理了Windows生态系统中的一个最重要的外围设备,并在当前数亿台设备上运行。P在驱动程序的设计早期启用了数百种竞态条件和海森堡bug的检测和调试,并在当前广泛应用于Windows的驱动程序开发之中。P在Windows内核中的早期的积极经验推动了P#的出现,P#是一个使用C#扩展来提供状态机和系统测试的框架。与P相比,P#采用了最小化的语法集合,并最大限度地利用外部库来提供建模、制定规范和测试等功能。

P正在改变Azure云基础架构的开发。Azure与其他云提供商一样,面临着由意想不到的竞态条件和软硬件故障引起的海森堡bug所带来的挑战。这些错误会导致实时服务的中断,这是云服务提供商及其客户需面对的巨大问题。P和P#目前已经在已部署的服务中查找和调​​试海森堡bug,并在系统部署前进行设计和验证服务。P允许工程师在大型Azure服务的组件之间精确地模拟异步接口。它还能协助工程师发现并调试他们当前桌面上的问题,否则在部署服务后这些问题可能需要耗费几个月甚至几年的时间来解决。

P能够进行充分的故障切换测试,这使其特别适合于进行容错分布式服务验证,也就是说,在意外故障发生时验证服务是否能恢复并继续运行。网络消息的丢失和单个状态机的故障都会被建模为事件。P将故障建模为事件使得故障注入变得更加地自动化,并可以在存在大量事件和错误的情况下对故障切换进行系统性的测试,而这几乎无需程序员出力。

P在系统测试方面的能力使其能够彻底搜查由于并发发送事件的顺序不确定性而引起的所有可能。然而,该能力在处理显式数据输入方面存在一定的限制,特别是当该输入的多样性异常庞大的时候。 这种限制使得难以将P应用于诸如机器人技术之类的应用,该类应用的复杂性主要源于不确定输入下的决策。处理大量不确定的输入目前正在研究之中。我们正在研究符号和概率技术来应对这一挑战。

下载P语言

更多下载,请访问:微软P语言及其工具

Reddit上的精彩相关评论:

  1. 所有的编程语言设计者在对语言进行命名的时候都应该考略到可搜索性。C这个名字就起的很不好。为什么现在的编程语言在搜索引擎上都那么难搜索呢,比如“go”和“p”。
  2. 对于go来说,我们还能使用golang。
  3. 这个好像跟Erlang挺像的?希望它的语法更好用。
  4. 微软再一次证明了他们很不擅长起名。
  5. 明年将发布 P 360,然后再发布 P 1。
  6. 以后你就可以说:我在用P写代码,我需要用P来工作,请安装P。
评论