Эйфель (язык программирования)

Эйфель (англ. 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++, что, в своё время, и ограничило расрпостранение этого замечательного языка.

Стиль оформления программ на Эйфеле

Одним из преимуществ 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 к написанию программ ставит во главу угла не краткость записи самой программы, но ее удобочитаемость и однозначное восприятие человеком программного кода, что с успехом достигнуто во всех реализациях языка.

Дополнительная информация.

  1. «Object-Oriented Software Construction», Bertrand Meyer, Prentice Hall, 2nd edition 1997.
  2. «Eiffel: The Language». Bertrand Meyer
  3. «Invitation to Eiffel». From ISE.
  4. «An Overview of Eiffel». Richard Paige.
  5. «Object-Oriented Software Engineering with Eiffel» Jean-Marc Jezequel.
  6. http://www.elj.com/
  7. http://www.cetus-links.org/oo_eiffel.html
  8. http://www.eiffel.com/
  9. http://comp.lang.eiffel/


 
Начальная страница  » 
А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ы Э Ю Я
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
0 1 2 3 4 5 6 7 8 9 Home