Eiffel
Eiffel | |
---|---|
![]() | |
Семантика | объектно-ориентированный |
Класс языка | объектно-ориентированный,класс-ориентированный,обобщённый,параллельный |
Тип исполнения | компилируемый |
Появился в | 1986 |
Автор | Бертран Мейер |
Разработчик | Bertrand Meyer &Eiffel Software |
Расширениефайлов |
.e |
Выпуск | EiffelStudio 24.05[1](14 июня 2024 ) |
Система типов | строгая,статическая |
Основные реализации | EiffelStudio[2],SmartEiffel[3],Visual Eiffel[4],Gobo Eiffel[5],The Eiffel Compiler tecomp[6] |
Испытал влияние | Ada,Algol-60,Simula,Z |
Повлиял на | C#,D,Delphi,Java,Lisaac,Ruby,Sather,Ada |
Лицензия | двойная:GPLикорпоративная |
Сайт | eiffel.org |
Платформа | кроссплатформенный |
ОС | FreeBSD,Linux,macOS,OpenBSD,Solaris,Windows |
![]() |
Eiffel(Эйфель) — объектно-ориентированный язык программирования с алголоподобным синтаксисом, разработанныйБертраном Мейером.В этом языке впервые был реализован методконтрактного программирования.
Существуют компиляторы Эйфеля дляWindows,DOS,OS/2иUNIX.Большинство реализаций Eiffel генерирует кодСи,то есть выполнены, кактранслятор.Далее этот код компилируется с помощью компилятораСи.Однако есть системы, которые порождают и непосредственно машинный код. Например,Visual Eiffel.[4]
Происхождение названия
[править|править код]Язык «Eiffel» был назван в честь инженераГустава Эйфеля,который построилзнаменитую башню,названную в его честь. Выбирая такое название языка, его создатели концентрировали внимание на следующих особенностях Эйфелевой башни:
- её построили очень быстро — всего за два с небольшим года;
- она была возведена без превышения бюджета;
- она собрана из небольшого числа стандартных деталей;
- будучи задумана как временная постройка, она тем не менее осталась стоять по истечении намеченного срока и продолжает стоять до сих пор.
Тем самым создатели намекали на то, что система программирования «Eiffel» позволяет быстро и бюджетно построить крупные программные системы, используя относительно небольшое количество программных модулей из библиотек Eiffel Software, а также выражали надежду, что программным комплексам, созданным с помощью системы «Eiffel», будет суждена долгая жизнь[7].
Ключевые особенности
[править|править код]- Объектно-ориентированная программная структура, в которой класс выступает в качестве основной единицыдекомпозиции.
- Дизайн по контрактутесно интегрирован с другими языковыми конструкциями.
- Автоматическое управление памятью, как правило, осуществляется в процессесборки мусора.
- Наследование,в том числемножественное наследование,переименование, переопределения, конструкция
select
(«выбор»), наследование без полиморфизма, и другие механизмы, призванные сделать наследование безопасным. - Ограниченное и неограниченноеобобщённое программирование.
- Единая система типов, использующая механизмы как значащих, так и ссылочных типов данных, в которых все типы, включая базовые, например,
INTEGER
,являются классами. - Типо-безопасность (статическая типизация).
- Статическая защита от вызовов по пустой ссылке, используя механизм прикрепления типов (англ.attached-types mechanism).
- Агенты — объекты, сворачивающие вычисления внутри себя, — тесно связаны с механизмами замыканий и лямбда-выражений.
- «Единоразовые» (англ.once) процедуры или процедуры выполняющиеся только один раз, для совместного использования объекта и децентрализованной инициализации.
- Традиционный синтаксис на основе ключевых слов языковАлголиПаскаль,но без использования сепаратора (точка с запятой в конце инструкции не является обязательной).
- Нечувствительность к регистру.
Коротко:
classHELLO
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. Подпрограммы в подклассах (классах наследниках) могут замещать (переопределять) наследуемые только при конформности (то есть совпадении) их сигнатур.
Ещё пример:
classCOMPLEX
create
make
feature
real_part,imag_part:REAL
feature
make(r,i:REAL)
do
real_part:=r
imag_part:=i
end
end
Описание переменной выглядит сходно с описанием переменных в Паскаль-подобных языках:
идентификатор_переменной:ТИП
Например:
complex_num:COMPLEX
Инициализация (создание) объекта c вызовом конструктора:
createcomplex_num.make(2.4,−3.2)
Ранее использовался несколько иной синтаксис, при котором служебное словоcreate
заменялось на двойной восклицательный знак!!
:
!!complex_num.make(2.4,−3.2)
В языке Eiffel нет деструкторов, но есть автоматический сборщик мусора. Когда на объект не останется ссылок, он будет уничтожен сборщиком мусора.
Язык Eiffel поддерживаетмножественное наследование(несколько разделовinherit
).
Абстрактные классыопределяются добавлением зарезервированного словаdeferred
(«отложенный»):
deferredclassFIGURE
-- тело класса
end
«Отложенные» свойства будут определяться в классах наследниках. Для того, чтобы можно было создать объект класса, он не должен содержать ни одного «отложенного» свойства.
Самым характерным свойством языка Eiffel являются встроенныеутверждениядля создания принудительногоконтрактамежду вызывающим оператором и вызываемым кодом подпрограмм (см. также:Планкалкюль).
Все обращения к свойствам объектов по умолчанию динамические, хотя компиляторы могут разобраться, где динамическое связывание может быть заменено на статическое и естественно делают это. Такая особенность позволяет не вводить понятиеvirtual
(«виртуальный»). Наоборот, вводится понятиеfrozen
(«замороженное»), то есть «непереопределяемое» свойство.
Язык различает на уровне описаний два вида данных: ссылочные иexpanded
(«структурные», «развёрнутые»), что также применимо к описаниям переменных. Это позволяет минимизировать разницу между ссылкой на объект и самим объектом. Разница эта проявляется при присваивании, копировании и создании объектов.
Переопределение операций
[править|править код]Для подпрограмм доступен синтаксис операций. То есть инфиксный оператор+
является псевдонимом для методаplus
,а*
— дляproduct
:
classINTEGER
feature
…
feature
plusalias"+"(other:likeCurrent):likeCurrent
do…end
productalias"*"(other:likeCurrent):likeCurrent
do…end
…
end
Данный синтаксис является развитием способа переопределения операций в языкеКлу.В отличие отC++и Клу, Eiffel позволяет также определение свободных операций, знаки которых могут состоять из одного или более символов из следующего набора
:\? = ~ /! # $ % & * + - / < > @ ^ ` |
при условии, что этот символ или комбинация символов не заняты в синтаксисе Eiffel для других целей. Вот примеры возможных свободных операций:
!-! @ |> <| -|-> <-|- ==> <== ++
Причины слабого распространения языка
[править|править код]Компиляторы с Eiffel от автора языка дороги и не так распространены, как компиляторы C/C++, что, в своё время, и ограничило распространение этого языка, свободных/бесплатных альтернатив долгое время не было.
Стиль оформления программ
[править|править код]Язык Eiffel спроектирован с максимальным уклоном в простоту конструкций языка. Так, в нём определена лишь одна конструкция для цикла.
from
начальнаяинициализация
until
условиевыходаизцикла
loop
телоцикла
end
При программировании на Eiffel хорошим тоном считается придерживаться определённых правил оформления.
Благодаря этому, исходники читаются так, как если бы это была документация. Дополнительным стимулом соблюдать правила является строгость самих компиляторов к оформлению. Многие из них (в частностиSmartEiffel[3]) не позволяют неправильно оформлять исходные коды, находя многие отступления от стиля, выводя предупреждения или даже отказываясь компилировать.
Вот некоторые рекомендации по оформлению исходных текстов:
- служебные слова набираютсяжирным(актуально для печати и вывода на современные мониторы)
- все идентификаторы —курсивом
- в отличие от Си-подобных языков, в Eiffel отрицательно относятся к сокращениям. Вместо drvMngr принято писать driver_manager
- все классы пишутся прописными буквами
classLIST
- переменные пишутся строчными буквами
count_of_sheeps:INTEGER
- константы всегда начинаются с прописной
Gravity:REAL=9.81
- рекомендуется использовать немоноширинный шрифт
- в начале каждого класса желательно вставлять информацию о нём: кто написал, когда, функциональность класса. Вся эта информация записывается в самом начале файла с классом.
note
description:"Описание этого класса."
author:"Вася Пупкин"
classКЛАСС
-- тело класса
end
- после названия каждой процедуры на следующей строке желательно описывать результат её действия:
feature
IP:INTEGER
-- IP адрес локальной машины.
do
-- тело запроса
end
- особенностью Eiffel является необязательность точки c запятой «;» в конце синтаксических конструкций.
Примечания
[править|править код]- ↑"EiffelStudio 24.05 is available!".Архивировано5 июля 2024.Дата обращения:7 июля 2024.
- ↑EiffelStudio A Complete Integrated Development Environment .Дата обращения: 22 ноября 2010.Архивировано23 ноября 2010 года.
- ↑12SmartEiffel, the GNU Eiffel Compiler, Tools and Libraries .Дата обращения: 22 ноября 2010.Архивировано13 апреля 2011 года.
- ↑12Visual Eiffel home site .Дата обращения: 7 мая 2022. Архивировано изоригинала15 июня 2021 года.
- ↑Gobo Eiffel Compiler .Дата обращения: 8 января 2009.Архивировано16 января 2009 года.
- ↑tecomp: The Eiffel Compiler .Дата обращения: 8 января 2009.Архивировано17 января 2010 года.
- ↑Where does the name come from?https:// eiffel.Дата обращения: 17 июля 2019.Архивировано7 июня 2019 года.
Литература
[править|править код]- Бертран Мейер. Почувствуй класс.
- Bertrand Meyer. Object-Oriented Software Construction. 2nd edition, Prentice Hall, 1997.
- Bertrand Meyer. Eiffel: The Language
- Invitation to Eiffel. From ISE.
- Richard Paige. An Overview of Eiffel
- Jean-Marc Jezequel. Object-Oriented Software Engineering with Eiffel
Ссылки
[править|править код]- http:// elj /
- https://web.archive.org/web/20040604193933/http://cetus-links.org/oo_eiffel.html
- http:// eiffel /
- news://comp.lang.eiffel/
- Документация Эйфель на русском