编程环境研究


Original Essay: http://cs.brown.edu/~spr/research/env.html

历史

编程是一项艰巨的任务。编程环境的目的是提供可帮助程序员并简化其工作的工具。对此,我们一直强烈,并且也已经长时间开发此类工具。在大学期间,我研究了Dartmouth Basic的运营时系统。而这里的关键创新之一,是在编程环境中加入了源语言调试器。

我们对编程环境的真正研究始于工作站(Apollos, Suns, Percs等)的出现。我们(以及其他几个小组)认为,人们应该能够通过使用利用计算机和图形显示来简化并增强编程体验。对此,我们最开始的尝试体现在PECAN系统中。PECAN使用编译器技术来生成用于语言的工具套件。该工作套件包括文本(部门语法导向)和图形(Nassi-Schneiderman 图,Rothon图)编辑器,符号表的语义视图,控制流和表达方式,以及堆栈和代码的执行视图。另一个特点是用户在输入时,还有增量编译功能。这虽然是个有趣的系统,也给了我们很多启发,但实际使用并不切实(它耗尽了大约1000行代码的内存),也并没有能够充分利用工作站的图形功能。

基于这项工作,我们在接下来尝试通过使用可视语言,更好地利用工作站的图形功能。我们认识到可视语言通常仅覆盖了编程有限的一部分(例如,仅控制流或仅数据流),并且若要进行真正的编程,程序员需要使用多种此类语言。为了实现这一目标,我们开发了所谓的概念编程环境GARDEN,该编程环境使程序员可以开发新的可视或文本语言(具有合理的可视语法和语义),并将这些语言嵌套以及混合在整个系统中。该系统提供了对应的图形和文本编辑器(类似于Lisp的基本语言),完整的共享存储库(使多个程序员可以同时处理同一个程序并且支持分布式应用程序)(类似Smalltalk的浏览器,多个线程,甚至是编辑器)。该系统用于开发多种可视语言。

在开发GARDEN时,有人曾挑战编程环境中的整体研究,声称这些我们和其他人正在开发的工具很好并且可能有用,但实际上根本不实用,并且任何项目都无法用其进行开发;UNIX(或当时任何其他OS)上程序的日常开发都是实用单独的文本编辑器、调试器等完成的,十年来并没有明显变化。因此,我们开始开发可用于实际编程的实际环境。我们发现,没有通用商城或中央机构也有拥有一个集成环境,也不需要开发新工具来获得图形化前段。相反,我们开发了一种简单的基于消息的集成机制,该机制可以使工具之间彼此通信,以及一系列的包装器,可为现有工具(dbx, gdb, make, rcs, ...)提供图形界面。开发的成果就是FIELD环境。在开发过程中,我们使用各种图形视图扩展了环境,包括结构视图(流程图、种类层次结构)和动态视图(数据结构显示、堆虚拟化、I/O可视化)。FIELD非常成功。我们在入门编程课程中使用了很多年,之后由DEC(作为FUSE)商业化,并被HP(Softbench),Sun(Tooltalk),SGI等复制。

我们下一个环境DESERT,即为FIELD在多方面的扩展。首先,DESERT致力于为程序员提供高质量的代码显示。这是通过将Adobe Framemaker作为程序编辑器来扩展完成的。该扩展的程序具备Barker-Marcus风格的代码格式设置,其设置时在用户输入时实现,其中包括了对整个系统(不仅仅是当前文件)的符号进行语义查找。其次,我们希望让程序员能以不同的方式查看系统,从而能够将于某种特定变化或功能相关的代码分别开来。通过将程序拆分成多个片段,并让编辑器处理包含了从实际源文件中收集到的不同片段组成的虚拟文件,即可完成此项操作。程序员可以通过适当的查询来指定一组片段。这些片段处于配置管理之下,当虚拟文件在保存时,虚拟文件的更改会被集成到原始源文件中。最后,我们希望可以提供更高质量的可视化代码和执行,因此开发了一个集成到环境中的3D可视化系统。

我们最近的工作集中于为演进和软件一致性提供支持,而非尝试提供全面的编程环境。而CLIME这个程序包,假设有用于创建和维护软件系统中所有不同工件的工具:规范、设计、源代码、测试用例、文档等。这些工件的语义之后根据以下术语定义,及其他共建的一组元约束。该设计即为源的约束(反之亦然),因此UML图形的品类必须在源中具有相应的类;语言的使用规则限制了源的形式;文档必须与代码一致;测试用例必须包含代码,并在代码变更时重新运行。在用户编辑工件时,这些所有内容得到逐步检查,所有导致矛盾的点都会通过图形界面有所显示。

尽管CLIME致力于源代码的静态结构和各种软件工件,但我们发现有些规范和设计工件与应用程序的行为有关,并非和代码本身有关。为了适应这样的情况,我们一直在开发CHET,其为一种用于检查实际软件系统中品类和资源库规范的工具。CHET可以基于事件的扩展自动机(可以从UML交互图,品类合同中派生)获取输入,在大型系统中查找规范的所有实例,并逐个检查。

我们最近的工作涉及到编程环境的一个新前段, Code Bubbles。这项工作与Desert视图显示文件片段(例如单个功能)的方式类似,其设计目的在于使程序员可以同时在屏幕上看到当前任务所有相关代码,即高效显示其当前的工作集。