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

В настоящее время в таких языках, как Java, C++ и C# многопоточность реализуется с помощью специальных низкоуровневых библиотек, которые предоставляют механизмы синхронизации и взаимодействия потоков. Эти библиотеки основаны на концепциях 1960-х годов (например, мьютексы и семафоры), и, по мнению разработчиков языка 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 - технология, позволяющая избавиться от ошибки разыменования NULL-указателя, контроль осуществляется компилятором.


Источник: http://www.opennet.ru/opennews/art.shtml?num=30880