Эйфель (язык программирования)
Материал из Википедии — свободной энциклопедии
Эйфель (англ. Eiffel) — объектно-ориентированный язык программирования, разработанный Бертраном Мейером (Bertrand Meyer), Interactive Software Engineering Inc., Голета, штат Калифорния. Он работает в MS Windows, DOS, OS/2 и большинстве платформ UNIX. Компилятор Eiffel генерирует код Си, который далее компилируется в исполняемый код с помощью компилятора Си.
Содержание |
[править] "Здравствуй, мир!" на Eiffel
Коротко:
class HELLO creation make feature make is do print("Hello World%N") end end
Или развернуто:
indexing description: "Программа Здравствуй,мир! " author: "Elizabeth W. Brown" class HELLO creation make feature make is -- печать простого сообщения do io.put_string ("Hello World") io.put_new_line end end -- class HELLO
[править] Что такое Eiffel?
Eiffel — объектно-ориентированный язык. Он не является надстройкой над процедурным языком, как например C++ или Object Pascal. В языке меньше синтаксических конструкций, что упрощает его изучение по сравнению с языком C++ при практически одинаковой выразительности и лёгкости написания программ. Наиболее полно преимущества Eiffel раскрываются в больших и сложных проектах. Некоторые принципы Eiffel заимствовал из более ранних языков — таких как Simula, Ada, Pascal.
Eiffel имеет стройную обьектно-ориентированную модель, различные методологии, поощряющие написание хороших обьектно-ориентированных программ. Среди таких методологий особенно выделяется «Design By Contract» — которая по сути является «сердцем» Eiffel.
Несмотря на очевидные достоинства данной методологии она достаточно медленно проникает в мир разработки программного обеспечения. До недавнего времени в чистом виде эта методология была реализована только в Eiffel. На сегодняшний день применение «Design By Contract» можно увидеть, например, в скриптовом языке Ruby.
Компания ISE(Interactive Software Engineering) разрабатывает для Microsoft .NET «Contract Wizard» позволяющий использовать преимущества технологии «Design By Contract» с любым .NET компонентом. Также существуют попытки привнести эту методологию в такие языки как C++, Java.
Кроме того, что Eiffel является языком программирования, он может рассматриваться как метод разработки программного обеспечения, благодаря все той же технологии «Design By Contract».
[править] Как появился Eiffel?
Принципы языка были сформулированы в 1985 году и уже в 1986 году появился первый компилятор. Свое имя Eiffel получил в честь конструктора Густава Эйфеля(Gustave Eiffel) — который спроектировал и построил знаменитую французскую башню.
[править] Реализации языка
Наиболее распространенными Eiffel-компиляторами являются:
Компилятор | Разработчик | Официальный сайт | Лицензия |
ISE Eiffel | ISE Inc. | http://www.eiffel.com | коммерческий |
Visual Eiffel | Object-Tools | http://www.object-tools.com | свободный — для личного использования |
ISS Base | Halstenbach ACT GmbH | http://www.halstenbach.com | нет данных |
SmartEiffel | фр. университет «LORIA» | http://smarteiffel.loria.fr/ | свободный по GPL |
SmartEiffel сначала компилирует Eiffel-программы в промежуточный код на Cи и затем полученный код компилируется в выполняемые файлы Си-компилятором. Так же SmartEiffel может компилировать в Java байткод.
Компилятор VisualEiffel от Object Tools генерирует непосредственно выполняемые файлы.
Вместе с выходом Microsoft .NET Beta 2 вышла версия компилятора ISE Eiffel 5.0 которая поддерживает генерацию с языка Eiffel# в байт код(MSIL) для Microsoft .NET.
Eiffel# — это диалект языка Eiffel, поддерживающий пока не все возможности Eiffel. Было анонсировано, что со временем Eiffel# будет обладать теми же возможностями что и Eiffel.
[править] Особенности языка Eiffel.
- Design By Contract — возможность задать пред- и пост- условия в методах и invariant’ах класса
- Все обьекты в Eiffel имеют общий базовый класс.
- Статическая система контроля типов и динамическое связывание.
- Сборщик мусора
- Эффективная реализация множественного наследования — решены проблемы совпадающих имен методов и двойного наследования.
- Гибкий контроль области видимости — каждого метода можно указать классы-"клиенты", которые имеют доступ к этому методу.
- Система обработки исключительных ситуаций — ориентирована именно на обработку исключительных ситуаций и делает использование исключений в других целях неудобным.
- Unified Access Principle — минимизация последствий для кода клиента при смене реализации атрибутов. Имеется в виду, что функции без входных параметров и переменные — фактически имеют один и тот же синтаксис доступа — что делает безразличным для клиента — функция это или переменная.
- Создание интерфейсных классов — абстрактные классы в C++.
- Параметризованные классы — шаблоны в C++, generic types.
- Ковариантное переопределение параметров.
- Более мощный аналог delegates чем в С# — технология называется agents.
- Expanded values (boxed/unboxed values в С#) — подразумевается, что все объекты в Eiffel по умолчанию передаются исключительно по ссылке. Тогда, как при создании класса можно указать, что переменные данного класса передаются только по значению. Таковы предопределенные числовые и некоторые другий классы.
- Простой механизм работы с многопоточными приложениями (SCOOP) — в процессе разработки.
[править] Примеры кода
Пример объявления класса на Eiffel:
class КВАДРАТ inherit ПРЯМОУГОЛЬНИК creation --заголовки конструкторов feature --свойства, описываемые здесь, являются видимыми для клиентов и подклассов feature {child} --свойства, описываемые здесь, являются скрытыми для клиентов, но видимыми для подклассов feature {none} --свойства, описываемые здесь, являются скрытыми для клиентов и подклассов end
где свойства — это агрегирующее название полей и методов, соответственно, атрибутов (attributes) и подпрограмм (routines) в терминологии Eiffel. Подпрограммы в подклассах могут замещать наследуемые только при совпадении их сигнатур. Ещё пример:
class COMPLEX creation initComplex feature real_part, imag_part: REAL feature initComplex(r, i: REAL) is do real_part := r imag_part := i end end --class COMPLEX
Ссылка определяется обычно:
complex_num: COMPLEX
Инициализация объекта (вызов конструктора):
create complex_num.initComplex(2.4, −3.2)
Иногда используется замена слова create
на такое
!!complex_num.initComplex(2.4, −3.2);
В языке Eiffel нет деструкторов — задействуется сборка мусора, когда на объект никто не ссылается. Язык Eiffel поддерживает множественное наследование (несколько разделов inherit). Абстрактные классы определяются добавлением зарезервированного слова deferred («отложенный»):
deffered class FIGURE -- тело класса end
«Отложенные» свойства должны содержать определения в «неотложенных» потомках «отложенного» класса. Самым характерным свойством языка Eiffel является встроенные утверждения для создания принудительного контракта между вызывающим оператором и вызываемым кодом подпрограмм (см. также протоязык Plakalkül). Все связывания сообщений (здесь: «сообщение» — метафора ООП, проявляющая себя в вызове метода объекта) в языке Eiffel динамические. В первоначальной версии языка все объекты размещались в динамической памяти, и доступ к ним осуществлялся с помощью ссылок. Компиляторы с Eiffel были дороги и не так распространены как компиляторы C/C++, что, в своё время, и ограничило расрпостранение этого замечательного языка.
[править] Стиль оформления программ на Eiffel
Одним из преимуществ Pascal-подобных синтаксисов (Pascal, Algol, Eiffel и др.) перед С++ и ему подобными языками — в удобочитаемости текстов программ. Простота самих языков способствует этому.
Язык Eiffel спроектирован с максимальным уклоном в простоту конструкций языка. Так, в нем определена лишь одна (!) конструкция для цикла.
from условие на начало until условие на окончание loop тело цикла end
При программировании на Eiffel хорошим тоном считается придерживаться определенных строгих правил оформления. Благодаря этому, исходники читаются так, как если бы это была документация. Дополнительным стимулом соблюдать правила, является строгость самих компиляторов к оформлению. Многие из них (в частности SmartEiffel) не позволяют неправильно оформлять исходные коды, находя многие отступления от стиля, отказываясь компилировать и выводя предупреждения.
Вот некоторые правила и соглашения по оформлению исходников:
- в отличие от C++, в Eiffel отрицательно относятся к сокращениям.
Вместо drvMngr принято писать driver_manager
- все классы пишутся прописными буквами
class LIST
- переменные пишутся строчными буквами
item_1 : INTEGER
- константы всегда начинаются с прописной
Universal_G : REAL is 9.81
- рекомендуется использовать немоноширинный шрифт
- служебные слова набираются жирным
- все идентификаторы — курсивом
- в начале каждого класса желательно вставлять информацию о нем: кто написал, когда, функциональность класса. Вся эта информация записывается в самом начале файла с классом.
indexing description:"Класс что-то должен делать" author: "Вася Пупкин" class КЛАСС --тело класса end
- после названия каждой процедуры на следующей строке желательно описывать результат ее действия:
feature IP: INTEGER is -- возвращает IP адрес локальной машины do -- тело запроса end
- приятной особенностью Eiffel является необязательность точки-запятой «;» в конце каждой строки.
Подход Eiffel к написанию программ ставит во главу угла не краткость записи самой программы, но ее удобочитаемость и однозначное восприятие человеком программного кода, что с успехом достигнуто во всех реализациях языка.
[править] Дополнительная информация.
- «Object-Oriented Software Construction», Bertrand Meyer, Prentice Hall, 2nd edition 1997.
- «Eiffel: The Language». Bertrand Meyer
- «Invitation to Eiffel». From ISE.
- «An Overview of Eiffel». Richard Paige.
- «Object-Oriented Software Engineering with Eiffel» Jean-Marc Jezequel.
- http://www.elj.com/
- http://www.cetus-links.org/oo_eiffel.html
- http://www.eiffel.com/
- http://comp.lang.eiffel/