[软件工程]Eiffel初探

类别:软件工程 点击:0 评论:0 推荐:
Eiffel初探

摘要      当前面向对象领域存在着众多的方法和语言。它们或高举统一建模方法的大旗,在软件开发的高端领域呼风唤雨;或在设计思想上独辟蹊径,拥有一大批狂热的社区信徒;或已经根深蒂固,用户群广泛,尤在吐故纳新,不断吸取众家之长。在这些方法和语言之中,由瑞士理工大学教授、计算机科学家Bertrand Meryer发明的Eiffel语言被誉为是最纯粹、理论性最强的面向对象语言,而Eiffel方法以严格而有灵活的Design By Contract™作为理论核心,提出了很多独特的基本思想和解决问题的思路。特别是在Eiffel中强调了对形式化方法的研究和运用。它山之石可以工玉。本文旨在对Eiffel方法、语言、开发环境进行概要的介绍,然后通过实例对Eiffel中形式化的运用——Design By Contract™作较深入的介绍,最后提出自己的一点浅见。

 关键字 Eiffel,Bertrand Meyer,Design By Contract™,EiffelStudio™

 正文

第一节 背景和历史

         Eiffel是由Eiffiel公司(现在被称为ISE—Interactive Software Engineering)在1985年设计的。最初ISE在项目开发中,需要一种能体现现代软件工程学思想、现代的、面向对象的开发环境,但ISE认为当时没有这样的工具。因此,ISE开发了Eiffel作为开发产品的内部工具。Eiffel的名字来自工程师Gastave Eiffel,他为1889年世界博览会设计了著名的艾菲尔铁塔,并在计划的工期和预算内完成了这个工程。ISE希望用Eiffel所构建的软件工程项目也能达到这样的目标。

1986年10月,Eiffel 1在OOPSLA(Object-Oriented Programming Systems Language and Applications)大会上一举成名,由此踏上了商业化之路。随后几年中,Eiffel在美国、加拿大、欧洲和远东地区迅速传播,实施了一系列成功的工程项目。同时,学术界也认为Eiffel是教授各种软件概念的理想途径,世界上很多大学都已经采用Eiffel作为主要的教学语言。

1988年,Bertrand Meryer出版了《Object-Oriented Software Construction》,书中介绍了对象技术的概念和Design By Contract™,并用Eiffel作为描述语言进行了讲解。这本经典著作被称为“面向对象软件开发圣经”,极大地促进了人们对Eiffel的认可。 

第二节   Eiffel的理论基础、语言特点和主要技术

Eiffel广义上被称为The Eiffel Development Framework™,该框架提供了一整套软件开发方法,包括以下三部分:一套贯穿构建健壮、可重用软件始终的方法学;Eiffel语言(无缝地支持和加强方法学)、一个称为EiffelStudio™的集成开发环境(包含Eiffel语言和一套提高开发效率和质量的工具集)。

Eiffel并不盲从于提高生产率,而是专注于质量,它认为“When quality is pursued,productivity follows”(K.Fujino in NEC)。Eiffel中的“质量”由五种因素组成:可靠性(Reliability)、重用性(Reusability)、扩展性(Extendibility)、移植性(Portability)、维护性(Maintainability)。Eiffel希望使它的可重用库像硬件、操作系统、编译器一样,成为人们充分信任的高可靠部件之一。

1.  理论基础

Design By Contract™

Design By Contract™(DBC,按契约设计)几乎是Eiffel方法的标志。对于DBC的直接支持是Eiffel最著名的特性。Bertrand Meyer以数学形式严格证明了DBC的合理性,并且通过require/ensure/invariant建立了严格而有灵活的契约体系。DBC理论和机制在软件开发的分析、设计、文档、调试、测试甚至项目管理中都扮演着关键角色,这使得Eiffel历来以长于开发高质量软件而著称。

DBC来源于对人类生活中契约的理解。

DBC认为软件系统是由许多相互交流的组件构造的,这些组件在交流时应该遵守彼此共有的约定(权利和义务),这些规约应该被精确定义。断言就是很好的规约表达工具。

假设要实现根据键值在表中插入元素。契约如下:

断言是DBC的核心。断言(assertion)是一个布尔陈述。除了有错情况,它恒有真;在有错时,它才为假。Eiffel只在调试/测试时才查核断言,在日常运行时不查核断言。

DBC使用了多种责任断言:后置断言(postcondition)、前置断言(precondition)、不变式(invariant)、变式、状态接受条件和状态结果条件。其中后置断言、前置断言和不变式是最主要的。这些断言只是用来捕获各种操作的语义,并不牵涉具体实现。

后置断言和前置断言用于操作。后置断言是操作执行后“事情就该如此”的描述,它区分了接口和实现。前置断言是在操作执行前,对“事情预备状态”的描述。DBC通过断言明确了调用者和服务者的职责(调用者负责前置断言的测试,服务者保证后置断言的实现),避免了核查过少或核查过多。在核查(排错和测试)时,若执行操作,其前置断言满足,后置断言不满足,则发生异常(exception)。

不变式是关于类的断言,是加在和类的所有公共操作相关的前后置断言上的。类的不变式描述了关于类的深层性质,即不变式所提供的约束适用于类的整个后续演进中。在方法执行中,不变式可以为假,但在其它对象调用它时应恢复为真。Eiffel中的不变式包括类不变式(class invariant)、循环不变式(loop invariant)和状态不变式。Meyer认为“只有当产生了不变式(所写的类)或理解了它,才能感觉到这个类的含义”。

Eiffel根据Dijkstra的“气球原理”使用断言——弱化前置断言或强化后置断言,有效地防止了子类构作时多态性可能引入的危险,确保了子类运行正常。

Eiffel认为用断言对软件进行证明的技术还不成熟,因此,它将断言应用到调试/测试中,来得到更可靠的质量保证。

但是Eiffel中并不提倡采用完全形式化规约。Eiffel认为尽管形式化规约很有吸引力,但全面引入形式化规约会造成语言不可执行,或即使能执行,也只能用于原型中。因此,Eiffel在语言中有选择地部分引入了形式化规约,从而使规约语言能嵌入到设计和编程语言中,运用到实际的商业开发中。

DBC并非Eiffel专用,它是一种可用于任何编程语言的重要技术。由于Bertrand Meyer参与了Microsoft公司VisualStudio.NET的设计,因此VisualStudio.NET也具有了DBC的特性。

无缝性和可逆性(Seamlessness & Reversibility)

Eiffel方法的一个美妙之处在于,它弥合了分析、设计和编程之间的差异,在全过程应用相同的工具和理念。也就是说,在项目之初,用Eiffel的精确、清晰和表达能力,高度抽象地进行分析和设计。在系统具体构造时,同样使用Eiffel进行实现和迭代。这被称为无缝性和可逆性,也称“单模型原则”。

这与当前主流的建模思想有所不同。目前流行的思想在分析、设计和实现之间使用了不同的表示法和工具——先用基于UML的CASE工具,再用编程语言环境。

Bertrand Meyer反对这种“人为地区分高贵的分析工作和粗鄙的编程工作”的思想。他认为,借鉴程序设计天然之优美、精致和理性力量,将其运用在设计和建模工具之中,运用在调整和扩展现有成果的工具之中,运用在最终的思考工具中。

Eiffel推崇一种叫做BON(Business Object Notation)的建模技术,提倡从建模、分析、设计到编程,统一使用Eiffel作为表达思想的工具,从而达到各个过程之间的无缝性。它的关键概念包括无缝性(Seamlessness)、可逆性(Reversibility)和契约性(Software contracting)。BON由Dr. Nerson(SOL in Paris)和Dr. Waldén(Enea Data in Stockholm)发明。它定义了一些简单的、直觉化图形的规则,在描述一个庞大而复杂的系统时,能让开发者在深入到组件内部细节时仍能在不同的抽象层次上把握住整体。

2.  语言特点

Eiffel提供了许多其它语言所不具备的特点:简洁的语法、可重用性、天生的Design By Contract™、支持整个软件生命周期、保证工程按期完成并提高各个开发阶段的生产率。

层次化的语言描述

Eiffel仔细区分了语言描述的三个层次:语法、有效性、语义。语法是最低层次,有效性是中间层次,语义是最高层次。高层次语言描述是应用在低层次语言描述上的。每个层次都提供了丰富的规则进行约束。在实现上,语法和有效性由编译器保证,语义则依赖于契约检查和调试工具。

一致的类型系统

Eiffel中所有的类型都是基于class的。从而被纳入到Eiffel整体类型体系中,因此,Eiffel与Smalltalk一样,都是最纯的面向对象语言。

丰富简洁的关键字

Eiffel中有五种关键字。类结构关键字(Class structure keywords),包括indexing、class、inherit、creation、feature等。特征结构关键字(Feature structure keywords),包括is、require、require else、local、do、once、defered、external、rescue、ensure、ensure then、alias等。控制结构关键字(Control structure keywords),包括if、then、elseif、else、inspect、when、from、variant、until、loop、debug、check等。继承子句关键字(Inherit structure keywords),包括rename、redefine、undefine、select、export等。其它关键字,包括precursor、create、obsolete、invariant、end等。Eiffel对关键字和语法结构力求简约,表达一种概念尽量只用一种结构,以免混淆开发者。这也便利了调试时的错误定位。

以下是Eiffel的63个保留字。

Eiffel类的基本结构如下:

class <class declaration>

feature

        <routine interface declaration> is

        require <precondition predicate>

        local <local declaration>
              do <routine body>

        ensure <postcondition predicate>

        rescue <exception expression>

        end

feature

        ---

invariant <invariant predicate>

end

静态编译型语言

通常纯粹的面向对象语言,有的是动态语言(如Smalltalk),有的运行在虚拟机上(如Java和C#),而Eiffel是极少数的几个直接运行在硬件上的静态编译型纯面向对象语言。Eiffel编译器一般产生ANSI C代码,因此理论上可以在任何平台上运行。

断言

Eiffel语言中引入了断言(Assertion),这从根本上改变了软件开发的本质:

其一,使用Design By Contract™作为辅助设计工具,你可以在建立软件的同时,加入验证正确性的参数,有助于生产bug-free软件。

其二,使用Eiffel编译器作为测试和调试工具,开发者可以选择在运行时要监视的断言。开发者可以分别为每个类设置不同的监视级别(不检查、只检查前置断言、检查前置断言和后置断言、检查全部)。如果在运行时发现某个断言不成立,则意味着存在Bug,这时就会抛出异常中断运行。这不仅增强了测试和调试的针对性,而且有软件应作什么(断言)和作了什么(do子句中的可执行部分)的精确描述,所以能使软件尽快调试到正确状态。

其三,Eiffel类的简短形式可以作为文档自动化的实现基础,包含类的特性头、注释和断言。断言中提供了类功能的精确描述而不涉及实现细节。

异常处理(Exception handling)

异常处理的目的不是系统的正确性,而在于保持系统的强壮性。Eiffel认为,成功是指能够履行契约,即使经过了多次重试;失败是指调用时总是触发异常。Eiffel为异常处理提供了关键字rescue、retry。

泛型(Genericity)

泛型是支持类型参数化的类模板。在面向对象社区,这些类被称为泛型类。在设计时,这些类使用泛型参数。只有在运行时,委托类使用它时,才用真正的参数替换泛型参数。这种技术对容器类(如数组和链表)特别有用。

针对“泛型纯属多余”和“泛型先于(Ada)/平行于(C++)面向对象”的看法,Bertrand Meyer认为泛型是对象技术的自然扩展和必要补充。既不能对泛型嗤之以鼻,也不能让泛型喧宾夺主,掩盖了面向对象的光芒,破坏语言的一致性。

在Eiffel中提供了对泛型的支持。

多重继承(Multiple Inheritance)和重复继承(Repeated Inheritance

多重继承,又称为the “Holy Grail” of OO programming,是指一个程序单元可以同时继承多个其它类的特性。多重继承的好处很多,它有助于改善重用,优化整个系统结构设计,更加灵活,维护和调试也更加方便。不少面向对象流派都在警告开发者“警惕多重继承”。但在Eiffel中,多重继承是面向对象密不可分的特性之一。Paul Dubois认为“别人没有做好的,Eiffel做好了的事有两件:支持Design By Contract和多继承”。Eiffel通过重命名等巧妙的技术,消除了命名冲突,并使用了一个选择工具来消除因重复声明而导致的二义性。

重复继承是指一个类通过两个以上路径继承到同一祖先类。它的难点在于子孙类如何对待祖先类的特性,是作为一个特性还是作为多个特性来继承。许多面向对象语言视重复继承为“死亡菱形”,不敢越雷池一步。Eiffel对重复继承的特性,明确规定了哪些特性需要共享,哪些特性需要复制,从而灵活地绕过了这块暗礁。

一般来说,Eiffel中的继承必须遵守以下的规则:

规则一,Type Conformance rule。在赋值语句中的x:=y,或在函数调用中对应形参x的实参y,y的类型都必须和x的类型一致。

规则二,Final Name rule。同一个类中的两个不同特性不能拥有同样的终结名。

规则三,Invariant Accumulation rule。一个类的所有父类的不变式都需应用于类自身。

规则四,Assertion Redeclaration rule。对过程重声明时,不允许再使用require和ensure。在前置断言改用require else表示增加析取分量,在后置断言改用ensure then表示增加合取分量。

规则五,Repeated Inheritance rule。以同一名称被多次继承的特性采用共享方式,在子类中被认为是一个特性;以不同名称被多次继承的特性采用复制方式,在子类中被认为是多个特性。

规则六,Covariance rule。在特性重声明中,不论是函数返回的结果类型,还是过程的参数类型,都必须和原特性的类型一致。

代理(Agent)

在对象技术发展之初,就严格区分了对象和操作,每一个操作都是和类联系在一起的。但在一些应用中,需要用对象来表达操作,比如“操作回滚”。因此提出了代理,也称“操作包装”。Eiffel中提供了对代理的支持。

多线程和分布式开发(Multithreading & Distribution)

在Eiffel中,把每个计算单元看作一个Processor。Processor可以是一台计算机、一个进程或一个线程。通过这种思路就把多线程开发、Client/Server开发、分布式开发统一到了一起。

Eiffel在声明类实例时,加上separate关键字,就为该实例分配了一个Processor,支持并发/并行操作。在实现中,通过配置CCF(Concurrency Configuration File)来决定Processor资源的实际分配。

同时,Eiffel也为同步和竞争机制提供了独特的策略。例如,为了处理多线程的资源竞争,Eiffel明确划分了query和command。

EiffelNet和EiffelThread类库就既可以用于嵌入式开发,又可以用于大型分布式系统开发。

垃圾收集(Garbage Collection)

尽管GC往往被认为是一种具体技术,但Eiffel对其给予了相当的关注。Bertrand Meyer认为,单独的GC线程只有在得到硬件支持之后才是可行的。在Eiffel中为每一个线程分配一个独立的GC(这给多线程程序的并行性能和效率带来了很大的改进),并可以控制GC的立刻运行、部分运行、暂停和完全禁止。

一致的编码风格

Eiffel认为,作为工业级语言,编码风格应当作为语言规范规定下来,而不应该任由个人肆意发挥。因此,Eiffel编译器对于标识符大小写、下划线格式等进行了严格的检查,甚至连注释都作检查。这种近乎严苛的规则,使得世界上几乎所有Eiffel程序员写出来的Eiffel程序都像是一个模子里出来的。

不支持的特性

Eiffel为了完整准确地表达“质量至上”的设计开发理念,舍弃了一些设计概念。如全局变量、union类型、类内重载(in-class overloading)、goto及类似的控制结构(break、exit等)、类型规则特例(exceptions to the type rules)、副作用表达运算符、底层指针和指针算法等。

3.  开发平台和主要技术

IDE

Eiffel的主要技术主要体现在专为Eiffel面向对象语言设计的集成开发环境EiffelStudio™中。EiffelStudio™是一个完全的图形环境,包含了有回溯功能的分析设计平台、快速重编译、编辑、浏览工具、自动生成文档、先进的调试机制等众多功能。整个IDE的设计都体现了Eiffel对开发环境构建的独特见解。

Eiffel本身就是用Eiffel语言开发的。目前最新的EiffelStudio™版本是ISE Eiffel 5。下面是EiffeStudio5.2 Free Version的界面。

其产品族包括EiffelStudio for Windows、EiffelStudio for Unix、EiffelStudio for Linux、EiffelStudio for VMS等,EiffelStudio for MacOS也正在开发中。这极大地提高了Eiffel代码在各种操作系统平台上的可移植性。

类库

类的容易重用和通过继承方便地定制是面向对象技术最吸引人的地方。因此,每一个程序语言设计者都希望能提供丰富可靠的类库,“使开发者不再需要重新设计轮子”,从而为开发组织节省大量的时间和金钱。Eiffel拥有庞大而高质量的类库资源。Meyer在《Eiffel:The Language》一书中定义的EiffelBase库是所有Eiffel实现都提供的高质量标准库,包括了语言核心、操作系统功能、内存管理、事件机制、容器、算法等组件。同时,ISE还提供了网络通信库EiffelNet(通过sockets传送对象)、编译器开发EiffelLex和EiffelParse(支持词法分析和句法分析)、线程库EiffelThread(映射到C线程标准库)、Web开发库EiffelWeb(支持CGI—Common Gateway Interface技术,使Eiffel能直接和WEB交互)、数据库访问库EiffelStore(支持各种对象—关系接口,能映射到ODBC、Oracle、Sybase和Ingres等关系数据库;也提供了到Matisse、Versant和O2等面向对象数据库的接口)、GUI库WEL(Windows Eiffel Library,针对Windows平台的图形库,包含几乎所有的Windows图形API)、GEL(GTK Eiffel Library,针对Unix、Linux和VMS平台)和EiffelVision2(为移植开发而设计的高级图形库,包括用户界面组件和各种几何图形,可运行于Eiffel支持的所有平台)、COM组件库EiffelCOM(封装了标准COM数据类型)、时间日期库EiffelTime(基于三种时间概念:绝对时间、始末时间、持续时间)、Java接口库Eiffel2Java(使Eiffel能调用Java例程和特性。)。

调试和测试

断言是Eiffel中调试和测试的重要组成部分,是一种简单而有效的将自检代码嵌入实现的方式,它可以避免和揭示错误。

断言提供了对与继承相关概念的控制,例如重命名、多态、动态绑定,使它们能根据合适的语义限制进行正常地使用。

开启断言检查时,自动计算不变式的时机是:

1.完成对象实例化之后

2.在routine的入口,且在检查前置条件之前

3.检查后置条件之后,且出去之前

建模图形表示法

EiffelStudio™中的Diagram Tool分析设计平台直接支持BON(Business Object Notation),能在系统设计时自动生成BON图,以便进行整体规划和交互设计。

文档自动化

Eiffel中的文档由直接来自开发环境的,一般由类名、断言、注释等类描述组成,因此抽象而又精确。Eiffel支持以下的文档格式:ASCII、eiffel、MML、postscript、COM、RTF、TeX1、TeX2、troff、html-classic、html-stylesheet,并且通过EFF(Eiffel Filter Format)能够定义新的文档格式。

Metric统计

对软件工程实践来说,统计数据的积累和分析是过程持续改进的必要前提。Eiffel能够对项目产品及其运行状态进行数字化记录。开发者可以直接获取预定义的原始值(如类数目、特征数目等),也可以根据原始值来手工定义新的组合值(如每个类中平均的特征数等)。

融冰技术(Melting Ice Technology)

随着大型复杂软件系统在其生命周期中增量迭代开发的需求日益突出(微软甚至提出了“日构建(Daily Build)”的概念),这就要求开发工具能够迅速适应软件系统的重构和更新。Eiffel为适应这种形势,提出了四种编译模式:Melt(快速增量编译,不优化变化代码)、Freeze(增量编译,优化变化代码)、Finalize(全面编译,高度优化)、Precompile(预编译项目重用库)。其中的关键技术是融冰技术。

融冰技术是Eiffel独特的增量编译理念——对变化系统重编译的时间应决定于系统中变化的影响范围,而不应决定于系统的整个规模——的技术实现。它把编译(生成优化的代码)和字节码解释(快速响应变化)结合在一起。在这里,Eiffel程序分为两部分,包括预编译库(处于“冻结”状态),和刚刚改变的(处于“融解”状态,即编译器快速生成了一些可执行的字节码,然后停下来),在需要时两者能互相调用。

与其它设计开发语言和平台的协作

Eiffel语言保留了一个开发的架构,可以和UML-CASE工具、C/C++、Java、COM组件、.NET组件协同合作。

与UML-CASE工具的协作。EiffelStudio™能为任何Eiffel系统生成XMI(XML Metadata Interchange)信息。XMI符号能在任何支持其标准的不同产品(如Rational Rose)间交换系统信息。因此,Eiffel生成的XMI能被导入支持XMI的UML-CASE产品中,得到UML信息。

与C/C++及其编译器的协作。在C/C++方面,Eiffel有一个精妙的接口,它支持:Eiffel调用C函数、C++类及其成员;通过Cecil(C-Eiffel Call-In Library)库,C/C++能使用Eiffel的机制;将C++类转化成Eiffel类的“包装器”。在编译器方面,Eiffel编译器先生成的是字节码(这些字节码能被直接解释执行),其后字节码被优化并被翻译成C,最后利用各个平台上的C编译器进一步优化编译成可执行码。

与Java的协作。通过JDK(Java Development Kit)提供的JNI(Java Native Interface),Eiffel能调用Java例程和特性。

与COM组件的协作。Eiffel对标准COM数据类型进行了包装,形成了EiffelCOM类。

与.NET组件的协作。Eiffel for .NET编写的代码被自动编译成.NET中间语言(IL),因此与Visual Studio.NET完全集成,能和其它任何.NET语言协同工作、共享代码,并在.NET中支持多重继承。

第三节   应用实例

以下是两个实例。第一个是List类的实现,引自EiffelBase的base.structures.list。第二个是经典范例“Hello World”的实现。

 

1.List

indexing

 

       description:

              "Sequential lists, without commitment to a particular representation"

 

       status: "See notice at end of class"

       names: list, sequence;

       access: index, cursor, membership;

       contents: generic;

       date: "$Date: 2002/01/07 23:04:29 $"

       revision: "$Revision: 1.16 $"

 

deferred class LIST [G] inherit

 

       CHAIN [G]

              export

                     {ANY} remove

              redefine

                     forth, is_equal

              end

 

feature -- Comparison

 

       is_equal (other: like Current): BOOLEAN is

                     -- Does `other' contain the same elements?

              local

                     c1, c2: CURSOR

              do

                     if Current = other then

                            Result := True

                     else

                            Result := (is_empty = other.is_empty) and

                                          (object_comparison = other.object_comparison)

                            if Result and not is_empty then

                                   c1 ?= cursor

                                   c2 ?= other.cursor

                                   check

                                          cursors_exist: c1 /= Void and c2 /= Void

                                                 -- Because every list contains a cursor object

                                   end

                                  

                                   from

                                          start

                                          other.start

                                   until

                                          after or not Result

                                   loop

                                          if object_comparison then

                                                 Result := equal (item, other.item)

                                          else

                                                 Result := (item = other.item)

                                          end

                                          forth

                                          other.forth

                                   end

                                   go_to (c1)

                                   other.go_to (c2)

                            elseif is_empty and other.is_empty and

                                   object_comparison = other.object_comparison then

                                   Result := True

                            end

                     end

              ensure then

                     indices_unchanged:

                            index = old index and other.index = old other.index

                     true_implies_same_size: Result implies count = other.count

              end

 

feature -- Status report

 

       after: BOOLEAN is

                     -- Is there no valid cursor position to the right of cursor?

              do

                     Result := (index = count + 1)

              end

 

       before: BOOLEAN is

                     -- Is there no valid cursor position to the left of cursor?

              do

                     Result := (index = 0)

              end

 

feature -- Cursor movement

 

       forth is

                     -- Move to next position; if no next position,

                     -- ensure that `exhausted' will be true.

              deferred

              ensure then

                     moved_forth: index = old index + 1

              end

 

invariant

 

       before_definition: before = (index = 0)

       after_definition: after = (index = count + 1)

 

indexing

 

       library: "[

                     EiffelBase: Library of reusable components for Eiffel.

                     ]"

 

       status: "[

                     Copyright 1986-2001 Interactive Software Engineering (ISE).

                     For ISE customers the original versions are an ISE product

                     covered by the ISE Eiffel license and support agreements.

                     ]"

 

       license: "[

                     EiffelBase may now be used by anyone as FREE SOFTWARE to

                     develop any product, public-domain or commercial, without

                     payment to ISE, under the terms of the ISE Free Eiffel Library

                     License (IFELL) at http://eiffel.com/products/base/license.html.

                     ]"

 

       source: "[

                     Interactive Software Engineering Inc.

                     ISE Building

                     360 Storke Road, Goleta, CA 93117 USA

                     Telephone 805-685-1006, Fax 805-685-6869

                     Electronic mail <[email protected]>

                     Customer support http://support.eiffel.com

                     ]"

 

       info: "[

                     For latest info see award-winning pages: http://eiffel.com

                     ]"

 

end -- class LIST

 

 

 

2.Hello World

indexing

       description      : "display hello"

       note        : "Initial version automatically generated"

 

class

       ROOT_HELLO

 

creation

       make

 

feature -- Initialization

 

       make is

                     -- Creation procedure.

              do

                     --| Add your code here

                     io.put_string (" Hello World ")

               io.new_line

              end

 

end -- class ROOT_HELLO

第四节   当前发展的现状

 

Eiffel语言目前主要研究的领域包括以下两方面。其一,并行和分布式开发(Concurrency & Distribution);其二,对断言集的拓展。

Eiffel的开源社区也十分活跃。ISE之外的GOBO就是Eiffel社区中一套著名的开源跨平台类库。

Eiffel目前涉及的领域包括金融机构、机械制造、政府机关、保安部门、医疗保健机构等等。HP、Boeing、ENEA、Chicago Board of Trade、Lockheed Martin、Environmental Protection Agency等都是ISE的客户。

 

第五节   总结与评论——No Silver Bullet

 

在Eiffel中运用了面向对象、图形化编程、程序验证、环境工具等技术思想,Frederick Brooks认为这些技术思想都无法解决软件系统“概念上的复杂性”,因而不能根本上解决软件危机。对于重用的思想,Brooks认为是解决软件根本困难的一种方法,但目前重用的形式和变化仍然不能令人满意。

Robert V. Binder认为,Meyer的DBC模型未考虑顺序约束(sequential constraints),虽然这对非模态类不是问题,但给模态类留下了明显的缺口。

根据我们目前对Eiffel的使用,发现了以下问题:

1.编译后的可执行文件庞大。一个“Hello World”的console程序有2290K。

参考文献

1.ISE。Eiffel FAQ。

2.ISE。An Eiffel Tutorial。Eiffel Developer Help Center。

3.ISE。EiffelStudio:A Guided Tour。Eiffel Developer Help Center。

4.ISE。Building bug-free O-O software:An introduction to Design by Contract™。

5.ISE。The BON:The analysis and design method。

6.ISE。Multithreading, Distribution, Internet programming。

7.InformIT。Bertrand Meyer——The Founder Of The Eiffel Language。Programmer2003.02。

8.Martin Fowler、Kendall Scott。UML Distilled 2rd Edtion。Addison Wesley 2000。

9.  Robert V. Binder。Testing Object-Oriented System:Models,Patterns,and Tools。Addison Wesley 2000。

10.    Frederick Brooks。The Mythical Man-Month:The Essays on Software Engineering。Addison Wesley 1995。

本文地址:http://com.8s8s.com/it/it33208.htm