两种 Eiffel 实现

作者:Dan Wilder

评测的两款软件包,分别是来自加利福尼亚州圣巴巴拉市的 Interactive Software Engineering (ISE) 的 ISE Eiffel-3 和来自德克萨斯州奥斯汀市的 Tower Technology 的 TowerEiffel,它们有很多共同之处,包括

  • 一个简短的 “Ace” 文件,描述了构成程序的类系统的组成,并包含编译器的选项,最关键的是根类的名称及其创建过程,以及类目录。编译器基于 Ace 文件自行处理所有依赖性分析。

  • 命令行界面(未在此评测中评估)。图形界面很好,但不是绝对必要的,如果您觉得它们妨碍了您,可以绕过它们。

  • 介于 50KB 和 100KB 之间的静态运行时二进制库。ISE 和 Tower Technology 都计划在 ELF 稳定后以 ELF 二进制格式提供共享库。

类库

Eiffel 类库以源代码或有时加密的源代码形式交付,每个类一个文件。这样的库中存在许多类,提供诸如链表、树、文件 I/O、迭代器、用于对象持久性和传输的类等等。

除了内核库(它提供对操作系统和运行时二进制库的钩子)之外,类库计划在编译器之间可移植。随着 PELKS(拟议的 Eiffel 内核库标准)的采用,所有供应商现在都朝着支持其其他类库的通用内核库接口迈进。

TowerEiffel

Tower 开发环境专为 lemacs 或其后继者 xemacs 量身定制。两者都不包含在发行版中,但这些编辑器通常可以从 ftp 站点和 CD-ROM 获得。查找 lemacs-19.10 或 xemacs-19.11。您也可以使用 emacs,尽管契合度稍差。

Tower 正在开发一个非 emacs 集成开发环境,预计在付印时进入 beta 测试阶段。

安装过程很顺利,除了许可证设置方面遇到了一点困难。经过一些电子邮件交流后,安装了可用的许可证代码,TowerEiffel 启动并运行。

运行 TowerEiffel

程序编辑、类浏览、编译和调试都是从 lemacs 下拉菜单选项启动的。“向 Tower 发送性能报告”菜单项是一个不错的功能,它可以电子邮件发送错误报告。我发送了一些,并立即得到了回复。

“浏览”菜单项为您提供库浏览功能,并允许您使用自己的类。菜单中缺少一些非常有用的视图。Tower 同意了这一点,并且已经实现了其中最困难的视图。更多选择即将推出。

在启用所有优化的情况下,一个小型测试应用程序从头开始编译大约需要一分钟。生成的二进制文件使用了大约 77KB 的代码空间。粗略的分解表明大部分代码来自运行时库。

在启用所有断言检查且未进行编译器优化的情况下,编译此应用程序生成的二进制文件占用大约 1 兆字节。从头开始编译仍然需要一分钟。

编译器错误列表显示在一个窗口中,其中包含解释和对 Eiffel: The Language 的引用。如果您单击错误,则相关的程序文本会出现在另一个窗口中。

Tower 调试器 egdb,改编自 GNU gdb,是一个命令行符号调试器。Xemacsxegdb 提供图形化前端。断点可以设置在 Eiffel 源代码的任何合理行。当执行遇到断点时,相应的程序文本会出现在窗口中。您可以一次单步执行一个 Eiffel 语句,显示窗口中的光标会步进到执行的语句。当执行进入 C 代码函数时,egdb 变为 C 源代码调试器。gdb 用户熟悉的所有其他便利功能都存在。

关于如何显示某些对象的内容存在一些疑问。设置一些断点也很模糊。除此之外,egdb 非常简单明了。源代码感知性很好,切换到 C 模式的能力也很好,因为 Eiffel 系统中对时间要求严格或平台依赖的部分通常用 C 语言实现。

TowerEiffel 工具具有丰富的运行时选项,并非所有选项都在菜单中提供。特别是,报告生成工具(如 eshort)可以生成文本、LaTeX、纯 roff、manpage roff 或 LaTeX,或者用于 Word 或 NeXT 的富文本格式的输出。这些选项在 man 页面中有详细文档。

Tower 类库

Tower 类库有 102 个类,包括 47 个内核类,提供标准的 Eiffel 语言钩子,用于连接到底层运行时库和操作系统,以及某些基本设施,例如 ANY,所有用户类的祖先。这里还存在用于字符串、数字、数组等的类。

另外 22 个加密类构成 Rational (加利福尼亚州圣克拉拉市) Booch 组件的子集。这些类提供数据结构和支持类,为您提供容器、列表、搜索和排序、模式匹配等等。Tower 以未加密的形式出售全套 Booch 组件。

最后,16 个类提供对象存储和传输,另外 10 个类提供支持功能。

客户服务

Tower 员工始终及时回复电子邮件,即使问题的答案并非立即可用。发送邮件和收到回复之间的最长延迟约为四天,针对非紧急事项。大多数电子邮件回复都在 24 小时内。我只给 Tower 打过两次电话,都是关于与之前任何电子邮件无关的事项。第一次我想与之交谈的人自己接了电话,第二次在几个小时内回了我的电话。

Interactive Software Engineering

Interactive Software Engineering 是 Eiffel 设计者 Bertrand Meyer 的公司。

我阅读的预发布文档集中包括 Bertrand Meyer 编写的 Eiffel: The Language, Eiffel: The Reference, Eiffel: The Libraries,Eiffel: The Environment,

The Language 是关于 Eiffel 的权威著作,是每位 Eiffel 开发人员的必读之物。最好在初步熟悉该语言后阅读,它是语言标准,也是所有关于细微之处的讨论寻求答案的地方。

如果您计划使用 ISE 软件包,其余的书籍是必要的,并且本身也值得一读。Bertrand Meyer 的写作通常很有趣,而且总是非常深刻。

安装

Interactive Software Engineering Eiffel-3 版本 3.3.4 for Linux 到达时是在 DAT 磁带上。我将其带到 Linux Journal 办公室,将其读取到磁盘上,然后压缩到六张软盘上供 klister 读取。解包很容易,我填写了注册表并以电子邮件发送出去。在适当的时候,许可证代码通过回复电子邮件到达,我安装了它们并启动了许可证管理器守护程序,ISE Eiffel-3 启动并运行。

运行 ISE Eiffel-3

程序编辑、类浏览、编译和调试都是从 ebench 或其启动的工具执行的。这些静态链接的 Motif 应用程序不需要 Motif 共享库。

用户界面经过深思熟虑且具有创新性。您需要做的许多事情都是通过按钮或拖放操作启动的。拖动操作无需按住按钮,只需单击按钮三一次进行拖动,再次单击进行放下,从而减少腕管劳损。单击按钮 1 可以轻松中止拖动。按钮具有独特的图标,当光标位于按钮上方时,工具框架中会显示描述每个按钮的短语。使用过图形工具的人会体会到,多级菜单、弹出窗口和下拉菜单很少。相反,任何时候需要的大部分控件都可以立即在桌面上工具的框架上找到。

您可以使用原生 Motif 功能编辑程序文本,或者您可以单击一个按钮,在子 shell 中启动您喜欢的编辑器。vi 是默认编辑器。如果您喜欢 emacs,您可以将其在自己的窗口中运行,以避免每次要编辑文件时都启动它。

ISE 包括以下工具

  • 项目工具:启动其他工具,调试程序。

  • 系统工具:编辑 Ace 文件;查看系统统计信息。提供类名,用于启动或定位类工具。

  • 类工具:编辑和浏览类。

  • 特性工具:更仔细地查看特性,包括祖先。

  • 对象工具:在调试时检查对象。

  • 解释工具:编译错误帮助

类工具是更有趣的工具之一,只需按一下按钮即可为您提供类的备用视图。视图包括

  • 文本:可编辑的类文本。

  • 简短:特性定义和特性头注释。

  • 简短平面:简短,包含所有祖先。

  • 祖先:所有祖先的缩进列表。

  • 后代:后代的缩进列表。

  • 客户端:系统中所有类客户端的列表。

  • 供应商:目标类是其客户端的类的列表。

还有更多。在这些视图中的每一个视图中,许多东西都可以单击并拖动到各种工具。效果是系统的一个非常好的超文本视图,包括来自库的支持类。ctags 的用户可能知道我的意思,如果我称之为“打了类固醇的 ctags”。

我的小型测试应用程序在完全优化且没有断言的情况下从头开始编译花费了十六分钟。生成的二进制文件约为 130KB。

在启用断言并关闭优化的情况下,从头开始完全编译时间约为六分钟,二进制文件约为 1.7MB。

ISE ebench 使用“融冰技术”,允许增量更改以解释模式运行。仅重新编译修改后的类。更改一个类并单击“Melt”按钮仅导致几秒钟的编译。整个应用程序可以在此模式下运行,该模式运行速度较慢但编译速度更快。我的测试应用程序在“melt”模式下从头开始编译花费了 20 秒。

编译器错误显示在项目工具中,您可以从中将类和特性名称拖放到类工具中,从而快速找到受影响的程序代码。有关更多信息,请将错误代码本身拖放到解释工具中,您很可能会看到来自 The Language 的段落和页码。

调试使用与其他地方相同的拖放技术。无论系统是否正在执行,都可以在工具可以访问其文本的任何类中设置断点。在每个断点处,都会显示堆栈帧,并且可以通过从堆栈帧拖动到对象工具来显示特性。一旦显示,可以通过从对象工具拖动到自身来跟踪进一步的引用。例如,要遍历链表,请将其根对象拖动到对象工具,然后重复将前向链接拖动到同一工具。

断点只能在例程的入口点设置。由于大多数 Eiffel 例程都很短,这比只能在函数入口点设置断点的 C 源代码调试器提供了更好的粒度,但有时可能需要插入特性调用和重新编译。单步执行可用,但我无法发现任何指示在一步中已到达哪个源语句的迹象。

EiffelBench 环境是一项非常出色的工作。如果您对集成开发环境感兴趣,ISE Eiffel-3 值得购买,只是为了好好看看他们在这里所做的事情。虽然不完美,但此环境为在 Eiffel 中进行项目提供了一个稳定、快速且用户友好但不受限制的基础。

ISE 类库

ISE 类库很大,有 752 个类,全部以源代码形式提供。其中,最受普遍关注的是基础层次结构中的 157 个类,包括内核类、支持类以及容器和数据结构。除此之外,还有用于构建解析器、X、Motif 或 MS Windows 下的 GUI 的库,或者用于 EiffelBuild(他们的 Motif GUI 构建器)的库。

客户服务

对于迄今为止我提出的每一个重要问题,ISE 都给出了令人满意的答复。有时这需要我的坚持,并且一两次需要通过电话跟进电子邮件。

Dan Wilder 自 1975 年以来一直担任软件工程师。Dan 居住在西雅图,他在工作、家庭和家庭 Linux 系统之间分配时间。剩下的任何时间都用来忽略他的苔藓收藏,他的邻居认为他称之为草坪。可以通过电子邮件 dan@gasboy.com 联系他。

资源

总结

书评:《Eiffel 面向对象程序构造》

加载 Disqus 评论