意向软件
2009年4月20日
几年前,我的同事马特·福梅尔对我们用来构建软件的工具感到不满,他设法联系了查尔斯·西蒙尼,以了解更多关于神秘的 意向软件 的信息。他所看到的东西给他留下了深刻的印象,他劝说我和其他 ThoughtWorkers 也参与进来。我们看到的是一个具有惊人潜力的工具,但我们仍然对它的保密性和发布的缺乏紧迫感感到沮丧。这种沮丧在上周结束了。
上周,我启程前往克里斯·塞尔斯举办的 DSL Devcon,而意向的产品经理马格努斯·克里斯特森建议我去看看他们的进展。经过多年的“很快就会发布”,我感到不确定,但我的同事丽贝卡·帕森斯一直在与意向保持定期联系,她说现在是好时机。
我在贝尔维尤的办公室度过了令人着迷和激动的一天。并不是说我看到了什么特别新颖的东西——这些都是已经存在了一段时间的理念和能力——但它们有一种真实性和成熟度,是我以前从未见过的。事实上,意向在几周前发布了其产品的 1.0 版本。通常的做法是从山顶上吹嘘一个突破性产品的 1.0 版本发布。只有意向会发布这样的版本,却不会告诉任何人。事实上,当我写这篇文章时,他们的网站上没有提到他们的产品——如果你想要更多信息,你必须与他们交谈。
有什么
这不是对他们的工具(称为意向领域工作台)的全面讨论,我没有时间把类似的东西整理出来。但我希望我零散的想法和观察会很有趣。意向领域工作台是一个 语言工作台,事实上,它是促使我创造这个词的系统之一。语言工作台是一个允许人们设计 领域特定语言 的工具:不仅仅是解析它们,而是构建一个包含丰富编辑功能的综合环境。在意向的情况下,这是一个 投影编辑 环境。
他们其中一个例子是我在 书籍介绍 中使用的状态机示例。工作台允许你使用其模式定义语言来定义状态机语义模型的模式。为了操作状态机,你定义语义模型的投影。意向领域工作台的一个显著特点是它能够支持同一个语义模型的多个投影。对于状态机示例,他们已经使用我在讨论该示例时使用过的几种 DSL 定义了投影:XML、自定义语法和 Ruby。这三种投影都是可逆的,这意味着你可以通过它们进行编辑,更新语义模型和其他投影。在投影之间切换只需选择一个菜单项。
他们还提供了流畅的 C#、命令查询 C 和状态机图的只读投影。虽然他们还没有设置图的可编辑性,但工作台可以处理可编辑的图示表示。在另一个例子中,他们展示了一个电子电路,它可以在树状结构的属性表投影和电路图投影中进行编辑。
电路图还展示了工作台的另一个非常强大的功能——能够将示例执行与程序定义无缝集成。在电子电路的情况下,这意味着你可以为电路的各个元素提供属性,模型将计算电路各个部分的阻抗,并在你编辑电路时显示它们。当然,你可以构建一个自定义程序来执行这种操作——但关键是,这种行为作为工作台中的 DSL 定义的一部分很容易实现。
将示例执行与程序定义相结合是电子表格的功能之一——这可能是电子表格作为 非专业程序员 环境如此成功的原因之一。这也是推动乔纳森·爱德华兹 有趣而大胆的想法 的一个概念。我的感觉是,语言工作台中的有趣 DSL 将具有这种特性,特别是如果它们的目标是供非专业程序员使用。
将执行与规范相结合的另一种方式是使用测试用例。他们有一个与 Capgemini 合作构建的养老金工作台示例,它允许精算师使用完整的数学符号输入公式,以及 FIT 样式的表格来显示测试用例。这些测试用例在你编辑公式时与相应的红/绿行为保持一致。
养老金工作台还说明了多种语言的组合。当你查看屏幕上的养老金文档时,你实际上是在查看三种独立的语言:用于散文处理的文字处理文本、用于公式的数学符号和用于测试用例的表格。这些语言是独立开发的,但在工作台的核心数据结构(称为意向树)中集成在一起。这种集成也扩展到执行——你可以进入测试用例,深入研究数学公式中的中间值。
为了使这些东西能够运行,你必须在语义模型中包含行为。意向开发了自己的通用语言,其工作名称为 CL1,来实现这一点。CL1 看起来像 C# 的超集,但这种观点又是核心语义模型的投影。我发现有趣的是,这与 JetBrains MPS 类似,他们有自己的“基础语言”,它投影到类似 Java 的通用语言中。越来越多的这些工具都是使用这种工作台内的通用语言进行编程的。
预期的工作方式是,开发人员使用意向领域工作台构建领域特定工作台。他们提供一个运行时(意向领域运行时)供它们在没有语言编辑功能的情况下运行。因此,Capgemini 使用意向领域工作台构建了养老金工作台作为他们自己的产品。意向领域工作台允许你定义新的模型模式和投影,而养老金工作台允许你使用这些语言构建养老金计划。
意向系统主要在 .NET 生态系统中组织。工作台和运行时都在 CLR 上运行,它们的核心部分是用 C# 编写的。工作台可以非常轻松地生成 .NET 程序集,这些程序集可以自动加载到工作台中进行测试,或者与运行时一起运行。自定义工作台可以为任何环境生成代码,而意向已经与另一个合作伙伴进行了一些工作,涉及生成 Java 代码,以便人们可以在自定义工作台中指定行为,然后在 Java 环境中部署生成的系统。
实现的一个有趣方面是,他们通过使用大量的小转换来处理表示转换,而不是一个大的转换。例如,从语义模型生成 C# 代码涉及大约十几个小的转换,这些转换按类似于多级编译器的管道排列,最后一步是从 C# AST 转换为文本。他们的内部设计大部分都用于使这种方法高效,这样你就可以轻松地将许多小的转换串联起来,而不用担心任何效率成本。另一个结果是,用于代码生成的转换管道与用于编辑投影的管道非常相似。
使用投影编辑的工具的一个常见问题是它们如何处理版本控制。通常的答案是让多个人同时编辑同一个存储,这会让许多严肃的开发人员感到不安。意向领域工作台内置了一个版本控制机制,它记录对意向树所做的所有更改,并且可以在树级别进行提交和合并。然后,你可以通过进行另一个投影来查看语言中的差异。
这种版本控制方法的一个有趣特点是,你可以提交冲突,并且冲突会作为冲突提交到存储库中。与文本文件不同,它们不会弄乱你的文本——你有一个真实的数据结构存在,因此你可以找到冲突并修复它们。开发人员使用此功能将他们无法解决的冲突提交到分支,以便更熟悉冲突区域的开发人员可以更新到该分支并修复它。
编辑是在意向树而不是文本上进行的事实也改变了一些其他事情。例如,无序集合被标记,因此编辑器中元素顺序的更改不会触发冲突。你还可以包含领域特定的冲突检测和解决行为。
公开
历史上,意向缺乏发布是一个问题,他们的保密性是另一个问题。要看到关于意向领域工作台的任何真实信息,都需要尼尔·福特所说的 UnforgivenContract。意向已经进行了一些 公开演讲,但它们实际上归结为“相信我们,我们有一些非常酷的技术”。我们确实知道他们有,但我们无法向人们解释为什么。
因此,我带着相当大的期待等待马格努斯和他们的开发经理谢恩·克利福德在 DSL DevCon 上的演讲。他们说他们终于要揭开面纱了。他们会吗?人们会如何反应?
他们以令人担忧的方式开始,使用通常不揭示内容的 PowerPoint,但随后他们切换到展示工作台,面纱终于揭开了。为了衡量反应,请 查看 Twitter。
- @pandemonial 印象深刻!太棒了!多个领域,多种语言,没有问题无法回答
- @csells 好吧,观看在 C# 文件中渲染并工作的实时电子电路非常酷。
- @jolson 关于意向软件的电子演示,我想说两个词:太棒了。就是这样,我的大脑终于爆炸了。
- @gblock 这不是关于花哨的演示,而是关于彻底改变我们所知的世界。
- @twleung 好吧,精算公式的智能感知太棒了
- @lobrien 这就像看到一个 100 英里/加仑的化油器:我的天哪,有人会买下它并把它放在保险库里!
之后,一些人说这是他们见过的最重要的演示,甚至将其与 史上最伟大的演示 相比。对于许多人来说,有一种感觉,整个软件开发世界都发生了改变。
(非常感谢克里斯·塞尔斯和他的团队组织了这次会议,并邀请我发言。他们还 提供了演讲视频。)
那么现在呢?这一切都比演示所能揭示的更多。现在,我们希望让几个人上手使用工作台,并对其进行严格的测试。假设它通过了测试,我们希望将其用于商业项目,看看它在实际情况下的效果。还没有使用意向领域工作台设计的系统投入使用,正如任何敏捷人士都知道的那样,在你每周将其部署到生产环境中之前,你永远不会真正理解它。
不久,另一个类似的主要工作台——JetBrains 的 元编程系统——将发布 1.0 版本,作为开源软件。因此,今年很可能是这些语言工作台最终走出阴影,看到它们第一个外部试点项目的一年。(我还应该提到,MetaEdit 工作台已经存在一段时间了,尽管它并没有得到太多关注。)我不知道这些工作台是否会改变我们所知的编程的面貌,毕竟我曾经认为 Smalltalk 将成为我们的未来;但这些工作台确实有可能带来如此深刻的改变。当然,我很兴奋,我们现在正处于这次旅程的下一个,更公开的阶段。