Введение

Язык объектно-ориентированного программирования Eiffel — это объектно-ориентированный язык программирования, разработанный Бертраном Мейером (сторонником объектно-ориентированного подхода и автором книги «Разработка объектно-ориентированного программного обеспечения») и компанией Eiffel Software. Мейер начал разработку языка в 1985 году с целью повышения надёжности коммерческой разработки программного обеспечения; первая версия была выпущена в 1986 году. В 2005 году Eiffel был стандартизирован ISO. Архитектура языка тесно связана с методологией программирования Eiffel. Оба подхода основаны на ряде принципов, включая разработку по контракту, разделение команд и запросов, принцип единообразного доступа, принцип единственного выбора, принцип открытости/закрытости и разделение опций и операндов. Многие концепции, впервые реализованные в Eiffel, впоследствии были заимствованы языками Java, C# и другими. Новые идеи в области разработки языка, особенно в рамках процесса стандартизации Ecma/ISO, продолжают интегрироваться в Eiffel.

Цели проектирования

Эйфель делает акцент на декларативных утверждениях, а не на процедурном коде, и стремится устранить необходимость в инструкциях для ведения учёта. Эйфель избегает приёмов и техник кодирования, предназначенных в качестве подсказок для оптимизации компилятору. Цель состоит не только в том, чтобы сделать код более читаемым, но и позволить программистам сосредоточиться на важных аспектах программы, не увязая в деталях реализации. Простота Эйфеля призвана способствовать созданию простых, расширяемых, повторно используемых и надёжных решений вычислительных задач. Компиляторы программ, написанных на Эйфеле, предоставляют широкие возможности оптимизации, такие как автоматическая подстановка, которые облегчают задачу оптимизации для программиста.

Предыстория

Эйфель был первоначально разработан компанией Eiffel Software, основанной Бертраном Мейером. Книга «Объектно-ориентированное построение программного обеспечения» содержит подробное изложение концепций и теории объектных технологий, которые привели к разработке Эйфеля. Основной целью разработки языка Эйфель, библиотек и методов программирования является предоставление программистам возможности создавать надежные и повторно используемые программные модули. Эйфель поддерживает множественное наследование, обобщенное программирование, полиморфизм, инкапсуляцию, типобезопасные преобразования и ковариантность параметров. Наиболее важным вкладом Эйфеля в область разработки программного обеспечения является подход «Разработка по контракту» (DbC), в котором используются утверждения, предусловия, постусловия и инварианты классов для обеспечения корректности программы без ущерба для производительности. Дизайн Эйфеля основан на теории объектно-ориентированного программирования, с минимальным влиянием других парадигм и без учета поддержки устаревшего кода. Эйфель формально поддерживает абстрактные типы данных. Согласно принципам проектирования Эйфеля, программный текст должен иметь возможность воспроизвести свою проектную документацию непосредственно из самого текста, используя формализованную реализацию концепции «Абстрактный тип данных».

Реализация и среда

EiffelStudio — это интегрированная среда разработки, доступная как под открытой лицензией, так и под коммерческой лицензией. Она предоставляет объектно-ориентированную среду для разработки программного обеспечения. EiffelEnvision — это плагин для Microsoft Visual Studio, позволяющий пользователям редактировать, компилировать и отлаживать проекты Eiffel непосредственно из IDE Microsoft Visual Studio. Существует пять других реализаций с открытым исходным кодом: "The Eiffel Compiler" (tecomp); Gobo Eiffel; SmartEiffel, реализация GNU, основанная на более ранней версии языка; LibertyEiffel, основанная на компиляторе SmartEiffel; и Visual Eiffel. Ряд других языков программирования включают элементы, впервые представленные в Eiffel. Например, Sather изначально был создан на основе Eiffel, но впоследствии развивался самостоятельно и теперь включает в себя несколько возможностей функционального программирования. Интерактивный учебный язык Blue, предшественник BlueJ, также основан на Eiffel. Apple Media Tool включает в себя Apple Media Language, основанный на Eiffel.

Общая структура

"Система" или "программа" Эйфеля представляет собой совокупность классов. На уровне выше классов Эйфель определяет кластер, который по сути является группой классов и, возможно, подкластеров (вложенных кластеров). Кластеры – это не синтаксическая конструкция языка, а скорее стандартное соглашение об организации. Обычно программа на Эйфеле организуется таким образом, что каждый класс находится в отдельном файле, а каждый кластер – в каталоге, содержащем файлы классов. В такой организации подкластеры соответствуют подкаталогам. Например, в соответствии со стандартными соглашениями об организации и именовании, x.e может быть именем файла, определяющего класс X. Класс содержит признаки, которые аналогичны "рутинам", "членам", "атрибутам" или "методам" в других объектно-ориентированных языках программирования. Класс также определяет свои инварианты и содержит другие свойства, такие как раздел "примечания" для документации и метаданных. Стандартные типы данных Эйфеля, такие как INTEGER, STRING и ARRAY, сами по себе являются классами. Каждая система должна иметь класс, обозначенный как "root" (корневой), и одну из его процедур создания, обозначенную как "root procedure" (корневая процедура). Выполнение системы состоит в создании экземпляра корневого класса и выполнении его корневой процедуры. Как правило, это приводит к созданию новых объектов, вызову новых признаков и так далее. Эйфель имеет пять основных исполняемых инструкций: присваивание, создание объекта, вызов рутины, условие и итерация. Структуры управления Эйфеля строго обеспечивают принципы структурированного программирования: каждый блок имеет ровно один вход и ровно один выход.

Особенности: команды и запросы

Основная характеристика класса заключается в том, что он определяет набор характеристик: поскольку класс представляет собой набор объектов времени выполнения, или "экземпляров", характеристика – это операция над этими объектами. Существуют два вида характеристик: запросы и команды. Запрос предоставляет информацию об экземпляре. Команда изменяет экземпляр. Разделение запросов и команд важно для метода Эйфеля. В частности:

Принцип единого доступа: с точки зрения программного клиента, вызывающего характеристику класса, не должно иметь значения, является ли запрос атрибутом (значением поля) или функцией (вычисляемым значением). Например, скорость автомобиля может быть атрибутом, доступным для объекта автомобиль, или она может быть вычислена функцией, делящей расстояние на время. Обозначение в обоих случаях одинаковое, что позволяет легко изменить реализацию класса, не затрагивая клиентское программное обеспечение. Принцип разделения команд и запросов: запросы не должны изменять экземпляр. Это не языковое правило, а методологический принцип. Поэтому в хорошем стиле Эйфеля не встречаются функции "получить", которые что-то изменяют и возвращают результат; вместо этого используются команды (процедуры) для изменения объектов и запросы для получения информации об объекте, полученной в результате предыдущих изменений.

Перегрузка

Эйфель не допускает перегрузку аргументов. Каждое имя признака внутри класса всегда соответствует конкретному признаку в этом классе. Одно имя в одном классе означает только одно. Этот конструкторский выбор повышает читаемость классов, устраняя источник неоднозначности в отношении того, какая процедура будет вызвана при обращении. Он также упрощает языковой механизм; в частности, именно это делает возможным механизм множественного наследования в Эйфеле. Имена, конечно, могут использоваться повторно в разных классах. Например, признак (вместе с его инфиксным алиасом) определяется в нескольких классах: , , , и т.д.

Отложенные классы и особенности

Классы могут быть определены как отложенные, а не обычные, чтобы указать, что класс нельзя непосредственно создать (инстанцировать). Несоздаваемые классы в некоторых других объектно-ориентированных языках программирования называются абстрактными. В терминологии Эйфеля, только "эффективный" класс может быть создан (инстанцирован), при этом он может быть потомком отложенного класса. Признак (feature) также может быть отложен путем использования ключевого слова `deferred` вместо блока `do`. Если класс содержит хотя бы один отложенный признак, он должен быть объявлен как отложенный; однако класс, не содержащий отложенных признаков, тем не менее может быть объявлен отложенным. Отложенные классы выполняют схожую роль с интерфейсами в языках, таких как Java, хотя многие теоретики объектно-ориентированного программирования полагают, что интерфейсы сами по себе во многом являются ответом на отсутствие множественного наследования в Java (которое реализовано в Эйфеле).

Переименование

Класс, наследуемый от одного или нескольких других классов, получает все их характеристики по умолчанию под их исходными именами. Однако он может изменить эти имена с помощью пунктов переименования. Это необходимо в случае множественного наследования, если между унаследованными характеристиками возникают конфликты имен; без переименования результирующий класс нарушил бы принцип отсутствия переопределения, упомянутый выше, и, следовательно, был бы недействителен.

Конкуренция

Существует ряд библиотек для работы с сетями и потоками, таких как EiffelNet и EiffelThreads. Модель параллельного программирования для Eiffel, основанная на концепциях разработки по контракту, – это SCOOP, или Simple Concurrent Object Oriented Programming (простое параллельное объектно-ориентированное программирование), пока не включенная в официальную спецификацию языка, но доступная в EiffelStudio. CAMEO – это (нереализованная) вариация SCOOP для Eiffel. Параллельное программирование также взаимодействует с механизмами обработки исключений. Асинхронные исключения могут представлять сложность (например, когда процедура генерирует исключение после завершения работы вызвавшей ее процедуры).

Интерфейсы с другими инструментами и языками

Eiffel – это чисто объектно-ориентированный язык, но предоставляет открытую архитектуру для взаимодействия с "внешним" программным обеспечением, написанным на любом другом языке программирования. Например, можно программировать операции на уровне машины и операционной системы на языке C. Eiffel обеспечивает простой интерфейс для вызова C-функций, включая поддержку "inline C" (написание тела процедуры Eiffel на C, обычно для коротких операций низкого уровня). Хотя прямой связи между Eiffel и C нет, многие компиляторы Eiffel (Visual Eiffel – одно из исключений) генерируют исходный код на C в качестве промежуточного языка, который затем передается компилятору C для оптимизации и обеспечения переносимости. Таким образом, они являются примерами транскомпиляторов. Компилятор Eiffel tecomp может выполнять код Eiffel напрямую (как интерпретатор), минуя промежуточный код на C, или генерировать код на C, который затем передается компилятору C для получения оптимизированного машинного кода. В .NET компилятор EiffelStudio непосредственно генерирует код CIL (Common Intermediate Language). Компилятор SmartEiffel также может генерировать Java-байткод.