Eiffel Studio 6.8 - IDE для языка Eiffel. Новая модель многопоточного программирования SCOOP

Вышла версия 6.8 EiffelStudio, интегрированной среды разработки для языка Eiffel. Eiffel - это объектно-ориентированный язык, поддерживающий технологию проектирования по контракту. Версия 6.8 практически целиком посвящена внедрению принципиально новой модели многопоточного программирования SCOOP - Simple Concurrent Object-Oriented Programming.

В настоящее время в таких языках, как Java, C++ и C# многопоточность реализуется с помощью специальных низкоуровневых библиотек, которые предоставляют механизмы синхронизации и взаимодействия потоков. Эти библиотеки основаны на концепциях 60-х годов прошлого века (например, семафоры), и, по мнению разработчиков языка Eiffel, плохо совместимы с современными объектно-ориентированными концепциями. Все это заставляет разработчика существенно менять способ своего мышления при переходе к многопоточности. Но даже в случае успешного освоения соответствующих инструментов, программы достаточно сложны для написания, понимания и поддержки, сложно гарантировать их корректность, так как традиционные средства тестирования и отладки не применимы.

Модель SCOOP является расширением объектно-ориентированного подхода и добавляет всего лишь одно ключевое слово "separate" для написания многопоточных программ. В качестве примера можно привести обычную (не многопоточную) подпрограмму (метод класса), служащую для перевода денежных средств с одного счета на другой:

       transfer (amount: INTEGER ; source, target: ACCOUNT)         -- Перевести amount долларов со счета source на счет target.       require         enough: source.balance >= amount       do         source.withdraw (amount)         target.deposit (amount)       ensure         removed: source.balance = old source.balance – amount         added: target.balance = old target.balance + amount       end    

Тело подпрограммы (do...) описывает необходимые действия: извлечь (withdraw) необходимую сумму со счета source и пополнить (deposit) этой же суммой счет target. Предусловие (require...) проверяет условие применимости данной операции, а именно требование того, чтобы на балансе счета было достаточно денежных средств (не менее amount). Постусловие (ensure...) описывает конечное состояние баланса счетов source и target.

При переходе к многопоточному выполнению нельзя допускать произвольного чередования операций. Например, если на исходном счете 1000 долларов, и есть две операции на снятие средств со счета по 800 долларов каждая. Эти операции не могут быть выполнены параллельно, так как в этом случае для каждой из них будет удовлетворено предусловие, что приведет снятию 2*800=1600 долларов. При обычном подходе пишутся сложные операции синхронизации, гарантирующие совместное исполнение двух операций. В рассмотренном примере методы withdraw и deposit не долдны чередоваться с операциями другого экземпляра подпрограммы transfer. В дополнение к этому, необходимо обеспечить ожидание операции при недостаточности средств на балансе счета.

При использовании SCOOP для обеспечения многопоточного исполнения необходимо изменить лишь одну строчку вышеприведенного кода:

     transfer (amount: INTEGER ; source, target: separate ACCOUNT)         -- Остальной код без изменений  

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

Модель SCOOP была разработана в начале 90-х создателем языка Eiffel Бертраном Мейером и описана в книге "Объектно-ориентированное конструирование программных систем". С тех пор модель развивалась, но основные принципы остались неизменными. Более подробно узнать о SCOOP можно из соответствующей документации. Детали реализации SCOOP и система типов описаны в статье и диссертации. С полным спсиком изменений версии 6.8 можно ознакомиться здесь.

Также стоит отметить, что последнее время технология проектирования по контракту находит свое применение в современных языках программирования:

  1. .Net 4.0 C# - библиотека Code Contracts, о которой можно подробнее узнать здесь или здесь;
  2. Java - библиотека Contracts for Java, разработанная компанией Google (подробнее здесь);
  3. C++ - библиотека Contract++

В заключение стоит упомянуть о том, что в мае 2011 года издательством "БИНОМ. Лаборатория знаний" выпущена на русском языке книга Бертрана Мейера "Почувствуй класс: учимся программировать хорошо с объектами и контрактами". Эта книга, предназначенная для обучения студентов объектно-ориентированному программированию на основе языка Eiffel, является обобщением многолетнего опыта преподавания соответствующих дисциплин в Швейцарском федеральном технологическом институте в г. Цюрихе (ETH).

Основные характеристики языка Eiffel и среды программирования Eiffel Studio :

  • Кроссплатформенная реализация - существуют версии EiffelStudio для FreeBSD, Linux, OpenBSD, Solaris (в том числе и Solaris SPARC), Windows
  • Автоматическая сборка мусора
  • Технология "Проектирование по контракту" - предусловия, постусловия, инварианты поддерживаются непосредственно самим компилятором языка (не требуются дополнительные инструменты и библиотеки)
  • Поддержка множественного наследования; разрешение конфликта имен (компоненты, наследованные от разных классов имеют одно и тоже имя) путем переименования конфликтующих компонентов у класса наследника; возможность выбора версии компонента при дублируемом наследовании
  • Обобщенное программирование
  • Возможность вызова функций языка C и компонентов классов C++
  • Melting Ice Technology - время компиляции при внесении изменений пропорционально объему измененного кода
  • Статическая типизация
  • Байткод, полученный в результате компиляции, транслируется в эквивалентные конструкции языка C, которые затем компилируются компилятором языка C (для Linux - GCC, для Windows - MinGW или компилятор Visual Stuido)
  • Void-safety - технология, позволяющая избавиться от ошибки разименования пустого указателя, контроль осуществляется компилятором

© OpenNet