Eiffel | это... Что такое Eiffel? (original) (raw)

Eiffel

Класс языка: объектно-ориентированный
Появился в: 1986
Автор(ы): Bertrand Meyer
Типизация данных: строгая, статическая
Основные реализации: EiffelStudio[1], SmartEiffel[2], Visual Eiffel[3], Gobo Eiffel[4], The Eiffel Compiler tecomp[5]
Испытал влияние: Ada, Algol-60, Simula, Z
Повлиял на: C#, D, Delphi, Java, Lisaac, Ruby, Sather

Eiffel (Эйфель) — объектно-ориентированный язык программирования с алголоподобным синтаксисом, разработанный Бертраном Мейером. В этом языке впервые был реализован метод контрактного программирования.

Существуют компиляторы Эйфеля для Windows, DOS, OS/2 и UNIX. Большинство реализаций Eiffel генерирует код Си, то есть являются своеобразным препроцессором. Далее этот код компилируется с помощью компилятора Си. Однако есть системы, которые порождают и непосредственно машинный код. Например, Visual Eiffel.[3]

Содержание

Ключевые особенности

Переопределение операций

Для подпрограмм доступен синтаксис операций. То есть инфиксный оператор + является псевдонимом для метода plus, а * — для product:

class INTEGER feature … feature plus alias "+" (other: like Current): like Current do … end

product alias "*" (other: like Current): like Current
  do … end

… end

Данный синтаксис является развитием способа переопределения операций в языке Клу. В отличие от С++ и Клу, Eiffel позволяет также определение свободных операций, знаки которых могут состоять из одного или более символов из следующего набора

: \ ? = ~ / ! # $ % & * + - / < > @ ^ ` |

при условии, что этот символ или комбинация символов не заняты в синтаксисе Eiffel для других целей. Вот примеры возможных свободных операций:

!-! @ |> <| -|-> <-|- ==> <== ++

Hello, world!

Коротко:

class HELLO create make feature make do print("Hello World%N") end end

или развёрнуто, соблюдая стиль написания:

note description: "Программа Здравствуй,мир!" author: "Elizabeth W.Brown" class HELLO create
make feature make -- Напечатать простое сообщение. do
print ("Hello World%N") end end

Примеры кода и особенности языка

Пример объявления класса на Eiffel:

class КВАДРАТ inherit ПРЯМОУГОЛЬНИК -- КВАДРАТ - подкласс ПРЯМОУГОЛЬНИКа -- может быть указано более одного блока inherit. -- для каждого родительского класса может быть указан список наследуемых методов. -- таким образом решается проблема конфликтов множественного наследования. create -- перечень имен конструкторов feature -- свойства, описываемые здесь, являются видимыми для всех клиентов. -- Более точно такая запись эквивалентна записи feature {ANY} - -- что означает, что свойства, определенные в этом разделе, -- доступны классу ANY и всем его наследникам. -- А так как класс ANY является родителем всех классов (истоком графа классов), -- у которых в явном виде не заданы родительские классы, -- то это означает доступность для использования любым классом feature {CHILD} -- свойства, описываемые здесь, являются доступными для использования для класса CHILD и его наследников feature {NONE} -- свойства, описываемые здесь, являются скрытыми для использования клиентами. -- Более точно доступны только для класса NONE, который является стоком графа классов end

где свойства — это общее название полей данных и методов. То есть атрибутов (англ. attributes) и подпрограмм (англ. routines) в терминологии Eiffel. Подпрограммы в подклассах (классах наследниках) могут замещать (переопределять) наследуемые только при конформности (то есть совпадении) их сигнатур.

Ещё пример:

class COMPLEX create make feature real_part, imag_part: REAL feature make(r, i: REAL) do real_part := r imag_part := i end end

Описание переменной выглядит сходно с описанием переменных в Паскаль-подобных языках:

идентификатор_переменной: ТИП

Например:

Инициализация (создание) объекта c вызовом конструктора:

create complex_num.make (2.4, −3.2)

Ранее использовался несколько иной синтаксис, при котором служебное слово create заменялось на двойной восклицательный знак !!:

!! complex_num.make (2.4, −3.2)

В языке Eiffel нет деструкторов, но есть автоматический сборщик мусора. Когда на объект не останется ссылок, он будет уничтожен сборщиком мусора.

Язык Eiffel поддерживает множественное наследование (несколько разделов inherit).

Абстрактные классы определяются добавлением зарезервированного слова deferred («отложенный»):

deferred class FIGURE -- тело класса end

«Отложенные» свойства будут определяться в классах наследниках. Для того, чтобы можно было создать объект класса, он не должен содержать ни одного «отложенного» свойства.

Самым характерным свойством языка Eiffel являются встроенные утверждения для создания принудительного контракта между вызывающим оператором и вызываемым кодом подпрограмм (см. также: Планкалкюль).

Все обращения к свойствам объектов по умолчанию динамические, хотя компиляторы могут разобраться, где динамическое связывание может быть заменено на статическое и естественно делают это. Такая особенность позволяет не вводить понятие virtual («виртуальный»). Наоборот, вводится понятие frozen («замороженное»), то есть «непереопределяемое» свойство.

Язык различает на уровне описаний два вида классов ссылочные и expanded («структурные», «развёрнутые»), что также применимо к описаниям переменных. Это позволяет минимизировать разницу между ссылкой на объект и самим объектом. Разница эта проявляется при присваивании, копировании и создании объектов.

Причины слабого распространения языка

Компиляторы с Eiffel от автора языка дороги и не так распространены, как компиляторы C/C++, что, в своё время, и ограничило распространение этого языка, свободных/бесплатных альтернатив долгое время не было.

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

Язык Eiffel спроектирован с максимальным уклоном в простоту конструкций языка.

Так, в нём определена лишь одна конструкция для цикла.

from начальная инициализация until условие выхода из цикла loop тело цикла end

При программировании на Eiffel хорошим тоном считается придерживаться определённых правил оформления.

Благодаря этому, исходники читаются так, как если бы это была документация. Дополнительным стимулом соблюдать правила является строгость самих компиляторов к оформлению. Многие из них (в частности SmartEiffel[2]) не позволяют неправильно оформлять исходные коды, находя многие отступления от стиля, выводя предупреждения или даже отказываясь компилировать.

Вот некоторые рекомендации по оформлению исходных текстов:

note description: "Описание этого класса." author: "Вася Пупкин" class КЛАСС -- тело класса end

feature IP: INTEGER -- IP адрес локальной машины. do -- тело запроса end

Примечания

  1. EiffelStudio A Complete Integrated Development Environment
  2. 1 2 SmartEiffel, the GNU Eiffel Compiler, Tools and Libraries
  3. 1 2 Visual Eiffel home site
  4. Gobo Eiffel Compiler
  5. tecomp: The Eiffel Compiler

Литература

Ссылки

Просмотр этого шаблона Основные языки программирования (сравнениеIDEисторияхронология)
Используемыев разработке АдаAPLЯзык ассемблераActionScriptABAP/4AutoItAWKБейсикСиКоболC++C#ClarionClojureColdFusionCommon LispDdBaseDelphiEiffelErlangEuphoriaF#ФортФортранGambasGoGroovy • HAL/S • HaskellIconJavaJavaScriptLimboLuaМодула-3Object PascalObjective-COCamlOzParserПаскальКомпонентный ПаскальPerlPHPPowerBASICPythonПЛ/1ПрологRubyScalaSchemeSmalltalkSQLPL/SQLTclValaVisual Basic (.NET)
Академические AgdaCleanCurryЛогоMLРЕФАЛСимулаОберон
IEC 61131-3 Instruction ListSTFBDLadder Diagram (LD) • SFC
Прочие АлголАлгол 68Модула-2МирандаHope
Эзотерические HQ9+/HQ9++ • INTERCALBrainfuck • Brainfork • BefungeMalbolgePietSpoonUnlambdaWhitespaceFALSELOLCODE
Визуальные G (LabVIEW) • Microsoft VPLSikuliVisSimАлисаДРАКОНСкретч
Просмотр этого шаблона Стандарты Ecma International
AIT • ANSI escape code • C++/CLIC#CD-ROMCDFSCLI • DDS • DLT • E4XECMAScriptEiffelFATFDHVDNFCOffice Open XMLOpenXPS • Super DLT • U3DUDFUDOUltrium-1UMDUWBVXA