Two Eiffel Implementations
The Tower class library has 102 classes, including the 47 kernel classes, providing the standard Eiffel language hooks into the underlying runtime library and operating system, as well as certain basic amenities, such as ANY, the ancestor of all user classes. Also present here are classes for strings, numbers, arrays, and so on.
Another 22 encrypted classes comprise a subset of the Booch components from Rational (Santa Clara, CA). These provide data structure and support classes giving you containers, lists, searching and sorting, pattern matching, and so on. Tower sells the full set of Booch components in unencrypted form.
Finally, 16 classes provide for storage and transmission of objects, and 10 more provide support functions.
Tower staff were consistently prompt in responding to e-mail, even when the answer to a question was not immediately available. The longest delay between sending mail and receiving a response was about four days, for a non-urgent matter. Most e-mail responses were within 24 hours. I phoned Tower only twice, about matters unrelated to any preceding e-mail. The person I wished to speak with answered the phone himself the first time, and the second, returned my call within a couple of hours.
Interactive Software Engineering is the company of Bertrand Meyer, Eiffel's designer.
Included with the pre-release document set I read were Eiffel: The Language, Eiffel: The Reference, Eiffel: The Libraries, and Eiffel: The Environment, all by Bertrand Meyer.
The Language is the definitive work on Eiffel, required reading for every Eiffel developer. Best read after obtaining some initial familiarity with the language, it is the language standard, and the place where all discussions of the fine points turn for answers.
The remaining books are necessary if you plan to use the ISE package, and are worthwhile reading in their own right. Bertrand Meyer's writing is often entertaining, always very insightful.
Interactive Software Engineering Eiffel-3 version 3.3.4 for Linux arrived on a DAT tape. I took it over to the Linux Journal offices to read it onto disk, then compressed it to six floppies for klister to read. Unpacking was easy, and I filled out the registration form and sent it off by e-mail. In due time the license codes arrived by return e-mail, I installed them and fired up the license manager daemon, and ISE Eiffel-3 was up and running.
Program edit, class browsing, compilation, and debug are performed from ebench or the tools it launches. These static linked Motif applications require no Motif shared libraries.
The user interface is thoughtful and innovative. Many of the things you need to do are initiated by pushbuttons or drag and drop. Dragging is performed without holding down a button, by clicking button three once to drag and again to drop, reducing the carpal tunnel wear and tear. Drag is easily aborted by clicking button 1. Pushbuttons have distinctive icons, and a phrase describing each pushbutton appears in the tool frame when the cursor is over the button. Those who have worked with graphical tools will appreciate that multiple level menus, pop-ups, and pull-downs are few. Instead, most of the controls needed at any point are immediately available on the frames of the tools present on the desktop.
You can edit program text using the native Motif capabilities, or you can click on a button that launches your favorite editor in a subshell. vi is the default editor. If you prefer emacs, you might run it in its own window to avoid starting it every time you want to edit a file.
ISE includes the following tools:
Project tool: Launch other tools, debug programs.
System tool: Edit Ace file; look at system statistics. Provide class names, for launching or targeting class tools.
Class tool: Edit and browse classes.
Feature tool: Closer look at features, including ancestry.
Object tool: Examine objects at debug time.
Explanation tool: Help on compilation errors
The class, one of the more interesting tools, gives you alternate views of a class at the push of a button. Views include:
Text: Editable class text.
Short: Feature definitions and feature header comments.
Short flat: Short, with all ancestors rolled in.
Ancestors: Indented list of all ancestors.
Descendents: Indented list of descendents.
Clients: List of all class clients in system.
Suppliers: List of classes whose client the target class is.
And more. Within each of these views, many things can be clicked and dragged to various tools. The effect is a very good hypertext view of a system, including the supporting classes from the libraries. Users of ctags may know what I mean if I call this “ctags on steroids”.
My small test application took sixteen minutes to compile from scratch with full optimizations and no assertions. The resulting binary file was about 130KB.
With assertions enabled and optimizations off, full compile time from scratch was about six minutes, and the binary file was about 1.7MB.
ISE ebench uses “melting ice technology”, which allows incremental changes to run in an interpreted mode. Only modified classes are recompiled. Changing one class and clicking the Melt button caused only a few seconds of compilation. The entire application can be run in this mode, which runs slower but compiles faster. My test application took 20 seconds to compile from scratch in “melt” mode.
Compiler errors are shown in the project tool, whence you can drag and drop class and feature names into class tools, letting you find the affected program code quickly. For more information, drag and drop the error code itself into an explanation tool, and very likely you'll see a paragraph and page number from The Language.
Debug uses the same drag and drop technique used elsewhere. Breakpoints can be set regardless of whether the system is executing, in any class whose text is accessible to the tools. At each breakpoint the stack frame is shown, and features may be displayed by dragging from the stack frame to an object tool. Once displayed, further references may be followed by dragging from the object tool to itself. For example, to traverse a linked list, drag its root object to an object tool, then repeatedly drag the forward link to the same tool.
A breakpoint can be set only at a routine's entry point. As most Eiffel routines are short, this gives better granularity than a C source debugger able to break only at function entry points, but can sometimes require insertion of feature calls and recompilation. Single stepping is available, but I was unable to discover any indication of which source statement had been reached at a step.
The EiffelBench environment is a very nice piece of work. If you are interested in integrated development environments, ISE Eiffel-3 is worth the purchase price just to get a good look at what they've done here. While not perfect, this environment gives a stable, quick, and user friendly, but not confining, basis for doing projects in Eiffel.