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 можно ознакомиться здесь.
Также стоит отметить, что последнее время технология проектирования по контракту находит свое применение в современных языках программирования:
- .Net 4.0 C# - библиотека Code Contracts, о которой можно подробнее узнать здесь или здесь;
- Java - библиотека Contracts for Java, разработанная компанией Google (подробнее здесь);
- 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