МФСП, 05 лекция (от 01 октября)
Материал из eSyr's wiki.
(small fixes) |
|||
(1 промежуточная версия не показана) | |||
Строка 1: | Строка 1: | ||
- | + | Средства спецификации в современных ЯП | |
* Расширение взаимного моделирования | * Расширение взаимного моделирования | ||
Строка 5: | Строка 5: | ||
* Сближение с ЯП | * Сближение с ЯП | ||
* ООП | * ООП | ||
- | * Параллелизм. синхронное взаимодействие. Естественные, методы обмен информацией. В каждом новом языке спецификации | + | * Параллелизм. синхронное взаимодействие. Естественные, методы обмен информацией. В каждом новом языке спецификации основное внимание уделяется не всем возможным расширениям, а какому-то достаточно узкому классу расширений. Если язык спецификации используется для описания архитектуры систем реального времени со сложными характеристиками, большик количеством процессов, но бедным информационным обменом, там много будет уделено внимания этим механизмам, а … уделен не будет. |
- | Сейчас | + | Сейчас всеобщего языка спецификации нет, они большей частью специализированные. |
- | Это не | + | Это не значит, что это истина в последней инстанции, всё развивается циклически, и сейчас имеется большое количество языков, каждый из которых продвигает своё направление, и что будет лет через 5—10, неизвестно. |
- | * | + | * Временны́е или темпоральные свойства. Описание таких свойств — отдельная тема. Достаточно тесно связана с приложениями. Далеко не все языки это поддерживают, некоторые активно развивают эту область. |
- | + | Появляются сейчас достаточно экзотические направления, например | |
- | * | + | * Спецификация требований к ресурсам. Объём вычислений, объём памяти, может быть вещи, связанные с периферией, могут быть требования, связанные с классификацией и конфигурацией процессоров. Задача при спецификации ресурсов достаточно сложная, конечно, потому что когда систему композируете, сложно сказать, сколько ресурсов нужно конкретному объекту или классу. Сттически предсказать, сколько ресурсов потребуется каждому и в совокупности, очень сложно. С одной стороны, это тема отдельная, с другой, для оценки необходимо отслеживать связь с функциональностью. |
+ | * Тема безопасности. Совсем неспецифицирована, поскольку сейчас все этой проблемой озабочены. Это серьёзная вещь и хочется рассмотреть разные стороны описания системы как независимые аспекты, в частности, хотелось бы безопасность отделить от функциональности, но это удаётся далеко не всегда. | ||
+ | Есть некие совсем экзотические темы, например: | ||
+ | * Спецификация ответственности. В больших системах всегда достаточно высокая вероятность отказа, а взаимоотношения между потребителями некоторых услуг и провайдерами ресурсом джлжны быть достаточно ясны. Если клиент за что-то заплатил и ему это предоставляется, то всё хорошо, если не предоставляется, то как эту коллизию разрешить. Провайдер, который выступает перед клиентом, теоретически мог бы взять ответственность за всё ПО, за весь компьютерный парк, за сетевые возможности и так далее. Но провайдер не хочет и не может сделать этого, он хочет ответственности только за то, что может отвечать. Тут возникает субподрядчик, который и должен отвечать. И взаимоотношения этих бяз, если бы ни были описаны, и если бы был бы механизм разбора инцидентов, то это была бы неплохая практика страховых компаний. | ||
- | + | Что можно было бы сказать по части упрощённого анализа? Указанное выше — тенденция к усложению языков спецификации | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | Что можно было бы | + | |
* Функциональные языки | * Функциональные языки | ||
- | * | + | * Упрощённая система типов |
- | * | + | * Строгая семантика |
- | * | + | * Платформонезависимая спецификация |
- | Приняли | + | Приняли решение, что языками спецификации пользоваться не будем, берём хороший язык программирования и дополняем его элементами спецификации: добавляем предусловия, постусловия и инвринты. |
Spec# | Spec# | ||
- | * | + | * Расширение C# |
- | * | + | * Компилятор |
- | * | + | * Верификатор — Boogie |
- | * | + | * SpecExplorer |
- | прект | + | прект бесплатный, но не открытый. Для программиста-практика это не совсем новый язык, а расширение известного. Выявляется достаточно широкий класс ошибок за счёт использования различных техник. |
- | Пример | + | Пример того, как выглядит, предусловие: |
'''class''' ArrayList | '''class''' ArrayList | ||
{ | { | ||
Строка 47: | Строка 45: | ||
} | } | ||
} | } | ||
- | В этом | + | В этом случае, если попадается некое число, выходящее за рамки границы, выдаётся предопределённое исключение, никак не окрш: requires violation exception. Про исключения и прочую трактовку предусловий стоит сказать отдельно. Разработчики следуют трактовке исключений, которая была ещё их предшественниками предложена, и трактовка исключений следующая: исключения трактуются как отказы. Эти отказы бывают двух видов: клиентские и провайдерские. Клиентские — клиент неправильно обращается к методу, или когда реализация метода не сделана или некорректна. Провайдерские отказы, в свою очередь, делятся ещё н два класса: admissible — допустимые отказы, и observed program error. Первый и последующий виды — unchecked исключения, второй, единственный — checked. Любая программа должна ожидать такие ожидаемые исключения и описывать, что при этом делать. Если возникло unchecked, то значит, что реализация некорректна. |
- | Пример | + | Пример описания admissible исключения: |
'''class''' ArrayList | '''class''' ArrayList | ||
{ | { | ||
Строка 62: | Строка 60: | ||
} | } | ||
- | + | Постусловие: | |
'''ensures''' Count=='''old'''(Count) + 1; | '''ensures''' Count=='''old'''(Count) + 1; | ||
'''ensures''' value==this[index]; | '''ensures''' value==this[index]; | ||
Строка 68: | Строка 66: | ||
'''ensures''' Forall{'''int''' i '''in''' index:'''old'''(Count): '''old'''(this[i])==this[i+1]} | '''ensures''' Forall{'''int''' i '''in''' index:'''old'''(Count): '''old'''(this[i])==this[i+1]} | ||
- | Для | + | Для постусловия важной бывает ситуация, когда выдаётся какое-то исключение, нужно сказать, что выполняется, что не выполняется. Что реализация должна гарантировать? Если я работаю с некоторым файлом |
'''throws''' EndOFileException '''ensure''' a.Count==old(a.Count); {...} | '''throws''' EndOFileException '''ensure''' a.Count==old(a.Count); {...} | ||
Минусы: | Минусы: | ||
- | * Нет обратной | + | * Нет обратной совместимости |
- | * | + | * Спецификация с реализацией |
Плюсы: | Плюсы: | ||
* Библиотеки | * Библиотеки | ||
- | * | + | * Единая система типов |
- | * | + | * Подходит для design by contract |
(тут история) | (тут история) | ||
Строка 85: | Строка 83: | ||
* 99 - JML | * 99 - JML | ||
* 2003 --- Spec# | * 2003 --- Spec# | ||
- | * Конец 90-х ( | + | * Конец 90-х (примерно 98; первые идеи в районе 72 года) --- Extended Static Checker (ESC). Идея: когда мы говорили про предусловия и постусловия, то считали, что правильное поведение описано там. Есть другой подход: программа корректна, если в ней нет дурацких ошибок. Этот подход — реализация этой идеи, и до после времени эти анализаторы и верификаторы, которые проверяли корректность требований и … были два независимых набора инструментов. Сейчас две эти техники объединены. |
- | Те | + | Те техники верификации, с которыми во второй части сем. позн., это именно те техники, на которых … базируется …. |
{{МФСП}} | {{МФСП}} | ||
{{Lection-stub}} | {{Lection-stub}} |
Текущая версия
Средства спецификации в современных ЯП
- Расширение взаимного моделирования
- Упрощение формального анализа
- Сближение с ЯП
- ООП
- Параллелизм. синхронное взаимодействие. Естественные, методы обмен информацией. В каждом новом языке спецификации основное внимание уделяется не всем возможным расширениям, а какому-то достаточно узкому классу расширений. Если язык спецификации используется для описания архитектуры систем реального времени со сложными характеристиками, большик количеством процессов, но бедным информационным обменом, там много будет уделено внимания этим механизмам, а … уделен не будет.
Сейчас всеобщего языка спецификации нет, они большей частью специализированные.
Это не значит, что это истина в последней инстанции, всё развивается циклически, и сейчас имеется большое количество языков, каждый из которых продвигает своё направление, и что будет лет через 5—10, неизвестно.
- Временны́е или темпоральные свойства. Описание таких свойств — отдельная тема. Достаточно тесно связана с приложениями. Далеко не все языки это поддерживают, некоторые активно развивают эту область.
Появляются сейчас достаточно экзотические направления, например
- Спецификация требований к ресурсам. Объём вычислений, объём памяти, может быть вещи, связанные с периферией, могут быть требования, связанные с классификацией и конфигурацией процессоров. Задача при спецификации ресурсов достаточно сложная, конечно, потому что когда систему композируете, сложно сказать, сколько ресурсов нужно конкретному объекту или классу. Сттически предсказать, сколько ресурсов потребуется каждому и в совокупности, очень сложно. С одной стороны, это тема отдельная, с другой, для оценки необходимо отслеживать связь с функциональностью.
- Тема безопасности. Совсем неспецифицирована, поскольку сейчас все этой проблемой озабочены. Это серьёзная вещь и хочется рассмотреть разные стороны описания системы как независимые аспекты, в частности, хотелось бы безопасность отделить от функциональности, но это удаётся далеко не всегда.
Есть некие совсем экзотические темы, например:
- Спецификация ответственности. В больших системах всегда достаточно высокая вероятность отказа, а взаимоотношения между потребителями некоторых услуг и провайдерами ресурсом джлжны быть достаточно ясны. Если клиент за что-то заплатил и ему это предоставляется, то всё хорошо, если не предоставляется, то как эту коллизию разрешить. Провайдер, который выступает перед клиентом, теоретически мог бы взять ответственность за всё ПО, за весь компьютерный парк, за сетевые возможности и так далее. Но провайдер не хочет и не может сделать этого, он хочет ответственности только за то, что может отвечать. Тут возникает субподрядчик, который и должен отвечать. И взаимоотношения этих бяз, если бы ни были описаны, и если бы был бы механизм разбора инцидентов, то это была бы неплохая практика страховых компаний.
Что можно было бы сказать по части упрощённого анализа? Указанное выше — тенденция к усложению языков спецификации
- Функциональные языки
- Упрощённая система типов
- Строгая семантика
- Платформонезависимая спецификация
Приняли решение, что языками спецификации пользоваться не будем, берём хороший язык программирования и дополняем его элементами спецификации: добавляем предусловия, постусловия и инвринты.
Spec#
- Расширение C#
- Компилятор
- Верификатор — Boogie
- SpecExplorer
прект бесплатный, но не открытый. Для программиста-практика это не совсем новый язык, а расширение известного. Выявляется достаточно широкий класс ошибок за счёт использования различных техник.
Пример того, как выглядит, предусловие:
class ArrayList { public virtual void Insert(int index, obect value) requires 0 <= index && index <= Count; requires !IsReadOnly && !IsixedSize; { ... } }
В этом случае, если попадается некое число, выходящее за рамки границы, выдаётся предопределённое исключение, никак не окрш: requires violation exception. Про исключения и прочую трактовку предусловий стоит сказать отдельно. Разработчики следуют трактовке исключений, которая была ещё их предшественниками предложена, и трактовка исключений следующая: исключения трактуются как отказы. Эти отказы бывают двух видов: клиентские и провайдерские. Клиентские — клиент неправильно обращается к методу, или когда реализация метода не сделана или некорректна. Провайдерские отказы, в свою очередь, делятся ещё н два класса: admissible — допустимые отказы, и observed program error. Первый и последующий виды — unchecked исключения, второй, единственный — checked. Любая программа должна ожидать такие ожидаемые исключения и описывать, что при этом делать. Если возникло unchecked, то значит, что реализация некорректна.
Пример описания admissible исключения:
class ArrayList { public virtual void Insert(int index, obect value) requires 0 <= index && index <= Count otherwise ArgumentOutORangeException; requires !IsReadOnly && !IsixedSize otherwise NotSupportedException; { ... } }
Постусловие:
ensures Count==old(Count) + 1; ensures value==this[index]; ensures Forall{int i in 0:index: old(this[i])==this[i]} ensures Forall{int i in index:old(Count): old(this[i])==this[i+1]}
Для постусловия важной бывает ситуация, когда выдаётся какое-то исключение, нужно сказать, что выполняется, что не выполняется. Что реализация должна гарантировать? Если я работаю с некоторым файлом
throws EndOFileException ensure a.Count==old(a.Count); {...}
Минусы:
- Нет обратной совместимости
- Спецификация с реализацией
Плюсы:
- Библиотеки
- Единая система типов
- Подходит для design by contract
(тут история)
- 75 --- Gypsy
- 80-90 Eiel, Spark
- 99 - JML
- 2003 --- Spec#
- Конец 90-х (примерно 98; первые идеи в районе 72 года) --- Extended Static Checker (ESC). Идея: когда мы говорили про предусловия и постусловия, то считали, что правильное поведение описано там. Есть другой подход: программа корректна, если в ней нет дурацких ошибок. Этот подход — реализация этой идеи, и до после времени эти анализаторы и верификаторы, которые проверяли корректность требований и … были два независимых набора инструментов. Сейчас две эти техники объединены.
Те техники верификации, с которыми во второй части сем. позн., это именно те техники, на которых … базируется ….
Формальная спецификация и верификация программ
|
|