投影式编辑

2008年1月14日

作为源代码编辑的替代方案,一个想法是将系统的核心定义保存在模型中,并通过投影进行编辑。

为了讨论这种类型的环境,我发现用系统的多种表示来思考非常方便。

  • 可编辑表示:用于更改系统的编辑内容。
  • 存储表示:系统定义的持久记录。
  • 可执行表示:用于执行系统运行的代码 - 可执行文件。
  • 抽象表示:用于操作和推理系统定义。
  • 可视化表示:系统定义的不可编辑视图。

源代码结合了可编辑和存储表示。它通过将源代码转换为可执行表示来执行源代码,这可以通过一个可观察的步骤(解释)或通过编译器进行多个步骤来完成。为了做到这一点,它通常将源代码转换为抽象表示作为中间步骤,但这种抽象表示是短暂的,只在编译期间存在。源代码被视为系统的核心定义。

在投影式编辑中,抽象表示是系统的核心定义。一个工具操作抽象表示并为程序员投影多个可编辑表示,以便更改系统的定义。该工具将抽象表示持久化到存储表示中,但这与它投影的任何可编辑表示完全分离。与可执行表示的关系几乎相同 - 可执行文件是通过从抽象表示进行一系列转换而产生的。

源代码编辑环境和投影式编辑环境之间的一个重要区别在于持久存储和编辑之间的分离。投影式编辑系统可以选择任何它们选择的持久化机制,而源代码系统需要具有一些通用的存储机制 - 这就是为什么它们几乎总是文本文件的原因。

可以通过多个投影来编辑抽象表示,每个投影都可以显示总信息的有限部分,这些信息与抽象表示的实际结构无关。因此,投影式编辑通常显示更广泛的编辑环境 - 包括图形和表格结构 - 而不仅仅是文本形式。

复杂的基于源代码的 IDE 也显示多个投影 - 例如,一个侧边栏显示一个类的所有方法列表,并使用图形注释来指示它们的访问修饰符。但是,这些投影通常只是源代码编辑器的辅助工具,并且通常不能直接编辑投影 - 你必须更改源代码并查看投影更新。

这种PostIntelliJ IDE 通过在加载源文件时创建抽象表示来实现这一点(这就是为什么它们启动需要一段时间的原因)。它们还使用抽象表示来执行许多其他代码辅助功能,例如上下文代码补全和重构。

投影式编辑的一个重要的实际问题是,没有普遍接受的存储表示格式。程序员可读的文本是源文件的通用选择这一事实意味着可以构建大量工具来处理它们:编辑器、源代码控制、差异可视化器等。投影式系统必须自己完成所有这些工作,这通常是这些功能经常缺乏的原因。特别是,许多投影式环境由于缺乏完善的配置控制系统而受到很大影响,这使得多人协作同一个系统定义变得更加困难。这与源代码环境形成了鲜明对比,源代码环境拥有大量源代码控制系统来完成这项任务。

基于投影的系统与模型驱动软件开发密切相关,尽管我认为两者并不完全是同义词。在 MDSD 上下文中,抽象表示通常被称为模型。当然,几乎所有 MDSD 工具都是基于存储库的,但许多基于存储库的工具,例如 Microsoft Access,不会认为自己是 MDSD。

(我最初是在我的关于语言工作台的文章中探索这种看待环境的方式。我在这里描述它,因为我认为投影式环境的概念比语言工作台更广泛。)