- Eiffel (programming language)
Infobox programming language
name = Eiffel
paradigm = object-oriented
year = 1986
designer =Bertrand Meyer
developer =Bertrand Meyer &Eiffel Software
latest release version = 4.2
latest release date =Feb 6 ,1998
typing =static typing ,strong typing
implementations =EiffelStudio ,SmartEiffel ,Visual Eiffel , [http://www.gobosoft.com/eiffel/gobo/gec/index.html Gobo Eiffel] , [http://www.sourceforge.net/projects/tecomp "The Eiffel Compiler" tecomp]
dialects =
influenced_by = Ada,Simula , Z
influenced =Sather , Ruby, Java, C#, D,Lisaac
operating_system =
license =
website =Eiffel is an ISO-standardized,
object-oriented programming language designed to enable programmers to efficiently develop extensible, reusable, reliable software. Eiffel is used in academia as a language for teaching computer-programming principles. Eiffel is used in the finance, aerospace, health-care, video-gaming, and other industries as a development platform. Since 1985, many suppliers have developed Eiffel programming environments.The Eiffel language's design is closely connected with the Eiffel programming method. Both are based on a set of principles, including
design by contract ,command-query separation , uniform-access principle, single-choice principle, open-closed principle, andoption-operand separation .Many concepts initially introduced by Eiffel have later found their way into Java, C#, and other languages. New language-design ideas, particularly through the ECMA/ISO standardization process, continue to be incorporated into the Eiffel language.
Characteristics
The key characteristics of the Eiffel language include:
* An object-oriented program structure in which a class serves as the basic unit of decomposition.
*Design by contract tightly integrated with other language constructs.
* Automatic memory management, typically implemented by garbage collection.
* Inheritance, includingmultiple inheritance ,renaming , redefinition, "select",non-conforming inheritance , and other mechanisms intended to make inheritance safe.
* Constrained and unconstrainedgeneric programming .
* A uniform type system handling both value and reference semantics in which all types, including basic types such as INTEGER, are class-based.
* Type safety (static typing ).
* Void safety, or static protection against calls on null references, through the attached-types mechanism.
* Agents, or objects that wrap computations, closely connected with closures andlambda calculus .
* "Once" routines, or routines evaluated only once, for object sharing and decentralized initialization.
* Keyword-based syntax in theALGOL /Pascal tradition but separator-free, insofar as semicolons are optional, with operator syntax available for routines.
* Case insensitivity.Design goals
Eiffel emphasizes declarative statements over procedural code and attempts to eliminate the need for bookkeeping instructions.
Eiffel shuns coding tricks or coding techniques intended as optimization hints to the compiler. The aim is not only to make the code more readable, but also to allow programmers to concentrate on the important aspects of a program without getting bogged down in implementation details. Eiffel's simplicity is intended to promote simple, extensible, reusable, and reliable answers to computing problems. Compilers for computer programs written in Eiffel provide extensive optimization techniques, such as automatic in-lining, that relieve the programmer of part of the optimization burden while producing code whose efficiency is comparable to that of code written in
C++ .Background
Eiffel was originally developed by
Eiffel Software , a company originally called Interactive Software Engineering Inc. (ISE) founded byBertrand Meyer .Object-Oriented Software Construction contains a detailed treatment of the concepts and theory of the object technology that led to Eiffel's design. ["Object-Oriented Software Construction", Second Edition, byBertrand Meyer , Prentice Hall, 1997, ISBN 0-13-629155-4]The design goal behind the Eiffel language, libraries, and programming methods is to enable programmers to create reliable, reusable software modules. Eiffel supports
multiple inheritance ,genericity , polymorphism,encapsulation , type-safe conversions, andparameter covariance . Eiffel's most important contribution tosoftware engineering isdesign by contract (DbC), in which assertions,precondition s,postcondition s, andclass invariant s are employed to help ensure program correctness without sacrificing efficiency.Eiffel's design is based on object-oriented programming theory, with only minor influence of other paradigms or concern for support of legacy code. Eiffel formally supports
abstract data type s. Under Eiffel's design, a software text should be able to reproduce its design documentation from the text itself, using a formalized implementation of the "Abstract Data Type".Implementations and environments
EiffelStudio is anintegrated development environment available under either an open source or a commercial license. It offers an object-oriented environment forsoftware engineering .EiffelEnvision is a plug-in forMicrosoft Visual Studio that allows users to edit, compile, and debug Eiffel projects from within the Microsoft Visual Studio IDE. EiffelStudio and EiffelEnvision are free for non-commercial use. Four other open source implementations are available: [http://www.sourceforge.net/projects/tecomp "The Eiffel Compiler" tecomp] , Gobo Eiffel,SmartEiffel —the GNU implementation, based on an older version of the language—andVisual Eiffel .Several other programming languages incorporate elements first introduced in Eiffel.
Sather , for example, was originally based on Eiffel but has since diverged, and now includes severalfunctional programming features. The interactive-teaching language Blue, forerunner ofBlueJ , is also Eiffel-based. TheApple Media Tool includes an Eiffel-based Apple Media Language.Specifications and standards
The Eiffel language definition is an international standard of the ISO. The standard was developed by ECMA International, which first approved the standard on
21 June 2005 as ECMA standard 367, Eiffel: Analysis, Design and Implementation Language. In June 2006, ECMA and ISO adopted the second version. In November 2006, ISO first published that version. The standard can be found and used free of charge on the ECMA site. [ECMA International: Standard ECMA-367 —Eiffel: Analysis, Design and Programming Language 2nd edition (June 2006); available online at [http://www.ecma-international.org/publications/standards/Ecma-367.htm www.ecma-international.org/publications/standards/Ecma-367.htm] ] The ISO version [International Organisation for Standardisation: Standard ISO/IEC DIS 25436, available online at [http://www.iso.org/iso/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=42924&ICS1=35&ICS2=60&ICS3=] ] is identical in all respects except formatting.Eiffel Software, "The Eiffel Compiler" tecomp and Eiffel-library-developer Gobo have committed to implementing the standard; Eiffel Software's EiffelStudio 6.1 implements some of the major new mechanisms—in particular, inline agents, assigner commands, bracket notation, non-conforming inheritance, and attached types. The
SmartEiffel team has turned away from this standard to create its own version of the language, which they believe to be closer to the original style of Eiffel. Object Tools has not disclosed whether future versions of its Eiffel compiler will comply with the standard.The standard cites the following, predecessor Eiffel-language specifications:
* Bertrand Meyer: Eiffel: The Language, Prentice Hall, second printing, 1992 (first printing: 1991)
* Bertrand Meyer: Standard Eiffel (revision of preceding entry), ongoing, 1997-present, at [http://www.inf.ethz.ch/~meyer/ongoing/etl Bertrand Meyer's ETL3 page] , and
*Bertrand Meyer: Object-Oriented Software Construction, Prentice Hall: first edition, 1988; second edition, 1997.Syntax and semantics
Overall structure
An Eiffel "system" or "program" is a collection of "classes". Above the level of classes, Eiffel defines "cluster", which are essentially a group of classes, and possibly of "subclusters" (nested clusters). Clusters are not a syntactic language construct, but rather a standard organizational convention. Typically an Eiffel application will be organized with each class in a separate file, and each cluster in a directory containing class files. In this organization, subclusters are subdirectories. For example, under standard organizational and casing conventions,
x.e
might be the name of a file that defines a class called X.A class contains "features", which are similar to "members", "attributes" or "methods" in other object-oriented programming languages. A class also defines its invariants, and contains other properties, such as a "notes" section for documentation. Eiffel's standard data types, such as
ARRAY
are all themselves classes, and collections are modified and accessed via features rather than special syntax. Moreover, unlike some "impure" object-oriented languages like Java, Eiffel eschews "basic data types" outside of its class system.Every system must have a class designated as "root", with one of its creation procedures designated as "root procedure". Executing a system consists of creating an instance of the root class and executing its root procedure. Generally, doing so creates new objects, calls new features, and so on.
Eiffel has six basic executable instructions: assignment; object creation; routine call; conditional; iteration; and choice. Eiffel's control structures are strict in enforcing structured programming: every block has exactly one entry and exactly one exit.
Scoping
Unlike many object-oriented languages, but like Smalltalk, Eiffel does not permit any assignment into fields of objects, except within the features of an object. Eiffel emphasizes information hiding and data abstraction, by requiring formal interfaces to data mutation. To put it in the language of other object-oriented programming languages, all Eiffel fields are "private", and "setters" are needed to modify values. An upshot of this is that "setters" can, and normally do, implement the invariants Eiffel provides syntax for.
"Hello, world!"
A programming language's look and feel is often conveyed using a "Hello, world!" program. Such a program written in Eiffel might be:
Design by Contract
The concept of
design by contract is central to Eiffel. The mechanisms are tightly integrated with the language. Contracts guide redefinition of features in inheritance.* Routine precondition: The precondition may only be weakened by inheritance; any call that meets the requirements of the ancestor meets those of the descendant.
* Routine postcondition: The postcondition can only be strengthened by inheritance; any result guaranteed by the ancestor is still provided by the descendant.
* Class invariantIn addition, the language supports a "check instruction" (a kind of "assert") and loop invariants.
Features, commands, queries
The primary characteristic of a class is that it contains a set of features. As a class represents a set of run-time objects, or "instances", a feature is an operation on these objects. There are two kinds of features: queries and commands. A query provides information about an instance. A command modifies an instance.
The command-query distinction is important to the Eiffel method. In particular:
*Uniform-Access Principle: from the point of view of a software client making a call to a class feature, whether a query is an attribute (field in each object) or a function (algorithm) should not make any difference. For example a_vehicle.speed could be an attribute, accessed from the object's representation; or it could be computed by a function that divides distance by time. The notation is the same in both cases, so that it's easy to change representation without affecting the rest of the software.
*Command-Query Separation Principle: Queries must not modify the instance. This is not a language rule but a methodological principle. So in good Eiffel style, one does not find "get" functions that change something and return a result; instead there are commands (procedures) to change objects, and queries to obtain information about the object, resulting from preceding changes.
Overloading
Eiffel does not allow argument overloading. Each feature name within a class always maps to a specific feature within the class. One name, within one class, means one thing.
This design choice helps the readability of classes, by avoiding a cause of ambiguity about which routine will be invoked by a call. It also simplifies the language mechanism; in particular, this is what makes Eiffel's multiple inheritance mechanism possible. [Bertrand Meyer: Overloading vs Object Technology, in Journal of Object-Oriented Programming (JOOP), vol. 14, no. 4, October-November 2001, available [http://se.ethz.ch/~meyer/publications/joop/overloading.pdf online] ]
Names can, of course, be reused in different classes. For example the "+" operator is defined in several classes: INTEGER, REAL, STRING, etc.
Genericity
Classes can be generic, to express that they are parameterized by types. Generic parameters appear in square brackets:G is known as a "formal generic parameter". (Eiffel reserves "argument" for routines, and uses "parameter" only for generic classes.) With such a declaration G represents within the class an arbitrary type; so a function can return a value of type G, and a routine can take an argument of that type:The
LIST [INTEGER]
andLIST [WORD]
are "generic derivations" of this class. Permitted combinations (withn: INTEGER
,w: WORD
,il: LIST [INTEGER]
,wl: LIST [WORD]
) areINTEGER
resp.WORD
are the "actual generic parameters" in these generic derivations.It is also possible to have 'constrained' formal parameters, for which the actual parameter must inherit from a given class, the "constraint". For example ina derivation
HASH_TABLE [INTEGER, STRING]
is valid only ifSTRING
inherits fromHASHABLE
(as it indeed does in typical Eiffel libraries). Within the class, havingKEY
constrained byHASHABLE
means that forx: KEY
it is possible to apply tox
all the features ofHASHABLE
, as inx.hash_code
.Inheritance basics
To inherit from one or more others, a class will include an
inherit
clause at the beginning:The class may redefine (override) some or all of the inherited features. This must be explicitly announced at the beginning of the class through aredefine
subclause of the inheritance clause, as inDeferred classes and features
Classes may be defined with
deferred class
rather than withclass
to indicate that the class may not be directly instantiated. Non-instantiatable classes are calledabstract class es in some other object-oriented programming languages. In Eiffel parlance, only an "effective" class can be instantiated (it may be a descendent of a deferred class). A feature can also be deferred by using thedeferred
keyword in place of ado
clause. If a class has any deferred features it must be declared as deferred; however, a class with no deferred features may nonetheless itself be deferred.Deferred classes play some of the same role as interfaces in languages such as Java, though many object-oriented programming theorists believe interfaces are themselves largely an answer to Java's lack of multiple inheritance (which Eiffel has).
Renaming
A class that inherits from one or more others gets all its features, by default under their original names. It may, however, change their names through
rename
clauses. This is required in the case of multiple inheritance if there are name clashes between inherited features; without renaming, the resulting class would violate the no-overloading principle noted above and hence would be invalid.Tuples
Tuples types may be viewed as a simple form of class, providing only attributes and the corresponding "setter" procedure. A typical tuple type readsand could be use to describe a simple notion of birth record if a class is not needed. An instance of such a tuple is simply a sequence of values with the given types, given in brackets, such asComponents of such a tuple can be accessed as if the tuple tags were attributes of a class, for example if
t
has been assigned the above tuple thent.weight
has value 3.5.Thanks to the notion of assigner command (see below), dot notation can also be used to assign components of such a tuple, as inThe tuple tags are optional, so that it is also possible to write a tuple type as
TUPLE [STRING, REAL, DATE]
. (In some compilers this is the only form of tuple, as tags were introduced with the ECMA standard.)The precise specification of e.g.
TUPLE [A, B, C]
is that it describes sequences of "at least" three elements, the first three being of typesA
,B
,C
respectively. As a resultTUPLE [A, B, C]
conforms to (may be assigned to)TUPLE [A, B]
, toTUPLE [A]
and toTUPLE
(without parameters), the topmost tuple type to which all tuple types conform.Agents
Eiffel's "agent" mechanism wraps operations into objects. This mechanism can be used for iteration, event-driven programming, and other contexts in which it is useful to pass operations around the program structure. Other programming languages, especially ones that emphasize
functional programming , allow a similar pattern usingcontinuations , closures, or generators; Eiffel's agents emphasize the language's object-oriented paradigm, and use a syntax and semantics similar to code blocks in Smalltalk and Ruby.For example, to execute the
my_action
block for each element ofmy_list
, one would write:To executemy_action
only on elements satisfyingmy_condition
, a limitation/filter can be added:In these examples,my_action
andmy_condition
are routines. Prefixing them withagent
yields an object that represents the corresponding routine with all its properties, in particular the ability to be called with the appropriate arguments. So ifa
represents that object (for example becausea
is the argument todo_all
), the instructionwill call the original routine with the argumentx
, as if we had directly called the original routine:my_action (x)
. Arguments tocall
are passed as a tuple, here[x]
.It is possible to keep some arguments to an agent open and make others closed. The open arguments are passed as arguments to
call
: they are provided at the time of "agent use". The closed arguments are provided at the time of agent "definition". For example, ifaction2
has two arguments, the iterationiteratesaction2 (x, y)
for successive values ofx
, where the second arguments remained set toy
. The question mark?
indicates an open argument;y
is a closed argument of the agent. Note that the basic syntaxagent f
is a short hand foragent f (?, ?, ...)
with all arguments open. It is also possible to make the "target" of an agent open through the notation{T}?
whereT
is the type of the target.The distinction between open and closed operands (operands = arguments + target) corresponds to the distinction between bound and free variables in
lambda calculus . An agent expression such asaction2 (?, y)
with some operands closed and some open corresponds to a version of the original operation "curried" on the closed operands.The agent mechanism has been recently generalized to allow defining an agent without reference to an existing routine (such as
my_action
,my_condition
,action2
), through inline agents as inThe inline agent passed here can have all the trappings of a normal routine, including precondition, postcondition, rescue clause (not used here), and a full signature. This avoids defining routines when all that's needed is a computation to be wrapped in an agent. This is useful in particular for contracts, as in an invariant clause that expresses that all elements of a list are positive:The current agent mechanism leaves a possibility of run-time type error (if a routine with "n" arguments is passed to an agent expecting "m" arguments with "m" < "n"). This can be avoided by a run-time check through the preconditionvalid_arguments
ofcall
. Several proposals for a purely static correction of this problem are available, including a language change proposal by Ribet et al. [Philippe Ribet, Cyril Adrian, Olivier Zendra, Dominique Colnet: "Conformance of agents in the Eiffel language", in , vol. 3, no. 4, April 2004, Special issue: TOOLS USA 2003, pp. 125-143. Available on line from the [http://www.jot.fm/issues/issue_2004_04/article7 JOT article page] ] .Once routines
A routine's result can be cached using the
once
keyword in place ofdo
. Non-first calls to a routine require no additional computation or resource allocation, but simply return a previously computed result. A common pattern for "once functions" is to provide shared objects; the first call will create the object, subsequent ones will return the reference to that object. The typical scheme is:The returned object—Result
in the example—can itself be mutable, but its reference remains the same.Often "once routines" perform a required initialization: multiple calls to a libraries can include a call to the initialization procedure, but only the first such call will perform the required actions. Using this pattern initialization can be decentralized, avoiding the need for a special initialization module. "Once routines" are similar in purpose and effect to the
singleton pattern in many programming languages, and to the Borg pattern used in Python.The ECMA specification allows variants of "once" (qualified by a keyword in parentheses, e.g.
once (THREAD)
: once per process, once per thread, once per object. However, this is not yet fully implemented by current compilers (typically, only PROCESS and THREAD).Conversions
Eiffel provides a mechanism to allow conversions between various types. The mechanisms coexists with inheritance and complements it. To avoid any confusion between the two mechanisms, the design enforces the following principle:
: (Conversion principle) A type may not both conform and convert to another.
For example
NEWSPAPER
may conform toPUBLICATION
, butINTEGER
converts toREAL
(and does not inherit from it).The conversion mechanism simply generalizes the ad hoc conversion rules (such as indeed between
INTEGER
andREAL
) that exist in most programming languages, making them applicable to any type as long as the above principle is observed. For example aDATE
class may be declared to convert toSTRING
; this makes it possible to create a string from a date simply throughas a shortcut for using an explicit object creation with a conversion procedure:To make the first form possible as a synonym for the second, it suffices to list the creation procedure (constructor)make_from_date
in aconvert
clause at the beginning of the class.As another example, if there is such a conversion procedure listed from
TUPLE [day: INTEGER; month: STRING; year: INTEGER]
, then one can directly assign a tuple to a date, causing the appropriate conversion, as inException handling
Exception handling in Eiffel is based on the principles of design by contract. For example, an exception occurs when a routine's caller fails to satisfy a precondition, or when a routine cannot ensure a promised postcondition. In Eiffel, exception handling is not used forcontrol flow or to correct data-input mistakes.An Eiffel exception handler is defined using the rescue keyword. Within the rescue section, the retry keyword executes the routine again. For example, the following routine tracks the number of attempts at executing the routine, and only retries a certain number of times:
This example is arguably flawed for anything but the simplest programs, however, because connection failure is to be expected. For most programs a routine name like attempt_connecting_to_server would be better, and the postcondition would not promise a connection, leaving it up to the caller to take appropriate steps if the connection was not opened.
Concurrency
A number of networking and threading libraries are available, such as EiffelNet and EiffelThreads. A concurrency model for Eiffel, based on the concepts of design by contract, is
SCOOP (software) , or "Simple Concurrent Object-Oriented Programming", not yet part of the official language definition but available as an add-on fromETH Zurich .Operator and bracket syntax, assigner commands
Eiffel's view of computation is completely object-oriented in the sense that every operation is relative to an object, the "target". So for example an additionis conceptually understood as if it were a function callwith target
a
, featureplus
and argumentb
.Of course [1] is the conventional syntax and usually preferred. Operator syntax makes it possible to use either form by declaring the feature (for example in
INTEGER
, but this applies to other basic classes and can be used in any other for which such an operator appropriate):The range of operators that can be used as "alias" is quite broad; they include predefined operators such as "+" but also "free operators" made of non-alphanumeric symbols. This makes it possible to design special infix and prefix notations, for example in mathematics and physics applications.Every class may in addition have "one" function aliased to " [] ", the "bracket" operator, allowing the notation
a [i, ...]
as a synonym fora.f (i, ...)
wheref
is the chosen function. This is particularly useful for container structures such as arrays, hash tables, lists etc. For example access to an element of a hash table with string keys can be written"Assigner commands" are a companion mechanism designed in the same spirit of allowing well-established, convenient notation reinterpreted in the framework of object-oriented programming. Assigner commands allow assignment-like syntax to call "setter" procedures. An assignment proper can never be of the forma.x := v
as this violates information hiding; you have to go for a setter command (procedure). For example the hash table class can have the function and the procedureThen to insert an element you have to use an explicit call to the setter command:It is possible to write this equivalently as(in the same way thatphone_book ["JILL SMITH"]
is a synonym fornumber := phone_book.item ("JILL SMITH")
), provided the declaration ofitem
now starts (replacement for [3] ) withThis declaresput
as the assigner command associated withitem
and, combined with the bracket alias, makes [5] legal and equivalent to [4] . (It could also be written, without taking advantage of the bracket, asphone_book.item ("JILL SMITH") := New_person
.note: The argument list of a's assigner is constrained to be: (a's return type;all of a's argument list...)
Lexical and syntax properties
Eiffel is not case-sensitive. The tokens
make
,maKe
andMAKE
all denote the same identifier. See, however, the "style rules" below.Comments are introduced by
--
(two consecutive dashes) and extend to the end of the line.The semicolon, as instruction separator, is optional. Most of the time the semicolon is just omitted, except to separate multiple instructions on a line. This results in less clutter on the program page.
There is no nesting of feature and class declarations. As a result the structure of an Eiffel class is simple: some class-level clauses (inheritance, invariant) and a succession of feature declarations, all at the same level.
It is customary to group features into separate "feature clauses" for more readability, with a standard set of basic feature tags appearing in a standard order, for example:In contrast to most
curly bracket programming language s, Eiffel makes a clear distinction between expressions and instructions. This is in line with theCommand-Query Separation principle of the Eiffel method.Style conventions
Much of the documentation of Eiffel uses distinctive style conventions, designed to enforce a consistent look-and-feel. Some of these conventions apply to the code format itself, and others to the standard typographic rendering of Eiffel code in formats and publications where these conventions are possible.
While the language is case-insensitive, the style standards prescribe the use of all-capitals for class names (
LIST
), all-lower-case for feature names (make
), and initial capitals for constants (Avogadro
). The recommended style also suggests underscore to separate components of a multi-word identifier, as inaverage_temperature
.The specification of Eiffel includes guidelines for displaying software texts in typeset formats: keywords in bold, user-defined identifiers and constants are shown in "
italics
", comments, operators, and punctuation marks inRoman
, with program text inblue
as in the present article to distinguish it from explanatory text. For example, the "Hello, world!" program given above would be rendered as below in Eiffel documentation:class "HELLO_WORLD" create "make" feature "make" do "print" ("Hello, world!") end end
Interfaces to other tools and languages
Eiffel is a purely object-oriented language but provides an open architecture for interfacing with "external" software in any other programming language.
It is possible for example to program machine- and operating-system level operations in C. Eiffel provides a straightforward interface to C routines, including support for "inline C" (writing the body of an Eiffel routine in C, typically for short machine-level operations).
Although there is no direct connection between Eiffel and C, many Eiffel
compiler s except one (Visual Eiffel ) output Csource code as anintermediate language , to submit to a C compiler, for optimizing and portability. The Eiffel Compiler tecomp can execute Eiffel code directly (like an interpreter) without going via an intermediate C code or emit C code which will be passed to a C compiler in order to obtain optimized native code. On .NET, theEiffelStudio compiler directly generates CIL (Common Intermediate Language) code. TheSmartEiffel compiler can also outputJava bytecode .References
External links
* [http://se.ethz.ch/~meyer/publications/online/eiffel/basic.html Basic Eiffel Language Mechanisms] , [http://se.ethz.ch/~meyer/ Bertrand Meyer] , August 2006.
* [http://dev.eiffel.com Eiffel Software's Open Source initiative]
* [http://www.eiffel.com/ Eiffel Software] web site of the company that introduced Eiffel, was Interactive Software Engineering (ISE).
* Eiffel tutorial (100 pages) byBertrand Meyer ( [http://archive.eiffel.com/doc/online/eiffel50/intro/language/tutorial-00.html HTML] , [http://www.eiffel.com/doc/online/eiffel50/intro/language/tutorial.pdf PDF] )
* [http://www.ecma-international.org/publications/standards/Ecma-367.htm Eiffel standard] , revision 2 (2006); this is the ECMA standard, with free access, its text identical to that of the ISO standard.
* [http://smarteiffel.loria.fr/ SmartEiffel] fairly complete Eiffel compiler, released under GNU GPL license, was SmallEiffel, not ECMA standard compliant.
* [http://www.sourceforge.net/projects/tecomp "The Eiffel Compiler" (tecomp)] anopen source Eiffel compiler with [http://tecomp.sourceforge.net documentation] .
* [http://visual-eiffel.org Visual Eiffel] anopen source implementation of Eiffel creatingnative code for X86 systems (Windows, Linux)
* [http://www.eiffel-nice.org/ NICE] Nonprofit International Consortium for Eiffel.
* [http://www.eiffelroom.com/ eiffelroom.com] Community around standard Eiffel
* [http://eiffelzone.com/ eiffelzone.com] Includes a comprehensive Eiffel Software Directory
* [http://www.cetus-links.org/oo_eiffel.html Cetus Eiffel Page]
* [http://www.eiffel.com/products/envsn Eiffel for .Net]
* [http://archive.eiffel.com/nice/language/ Eiffel: the Language] subset
Wikimedia Foundation. 2010.