Введение

Спецификации математических программ

В информатике формальные методы — это математически строгие техники для спецификации, разработки, анализа и верификации программных и аппаратных систем. Применение формальных методов в проектировании программного и аппаратного обеспечения обусловлено ожиданием, что, подобно другим инженерным дисциплинам, проведение соответствующего математического анализа может повысить надёжность и устойчивость разработки. Формальные методы используют различные фундаментальные концепции теоретической информатики, включая логические исчисления, формальные языки, теорию автоматов, теорию управления, семантику программ, системы типов и теорию типов.

Предыстория

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

Легкие формальные методы

Некоторые практики полагают, что сообщество формальных методов чрезмерно акцентирует внимание на полной формализации спецификации или проекта. Они утверждают, что выразительность используемых языков, а также сложность моделируемых систем делают полную формализацию трудной и дорогостоящей задачей. В качестве альтернативы были предложены различные облегченные формальные методы, которые делают упор на частичную спецификацию и целенаправленное применение. Примеры такого облегченного подхода к формальным методам включают нотацию объектного моделирования Alloy, синтез Денни некоторых аспектов нотации Z с разработкой, управляемой вариантами использования, и инструменты CSK VDM.

Применение

Формальные методы могут применяться на различных этапах процесса разработки.

Спецификация

Формальные методы могут использоваться для описания разрабатываемой системы на любом необходимом уровне детализации. Это формальное описание может служить руководством для дальнейшей разработки (см. следующие разделы); кроме того, оно может быть использовано для проверки полноты и точности спецификации требований к разрабатываемой системе, или для формализации этих требований путем выражения их на формальном языке с чётко и однозначно определённым синтаксисом и семантикой. Необходимость в формальных системах спецификаций отмечалась на протяжении многих лет. В отчёте ALGOL 58 Джон Бэкус представил формальную нотацию для описания синтаксиса языка программирования, впоследствии названную нормальной формой Бэкуса, а затем переименованную в форму Бэкуса — Наура (BNF). Бэкус также отметил, что формальное описание смысла синтаксически корректных программ ALGOL не было завершено к моменту публикации отчёта. «Поэтому формальное рассмотрение семантики допустимых программ будет представлено в последующей статье». Однако эта статья так и не была опубликована.

Разработка

Формальная разработка — это использование формальных методов как неотъемлемой части процесса разработки системы, поддерживаемого инструментами. После создания формальной спецификации она может служить руководством при разработке конкретной системы в процессе проектирования (то есть реализации, как правило, в программном обеспечении, но также и в аппаратном обеспечении). Например:

Если формальная спецификация представлена в операционной семантике, наблюдаемое поведение конкретной системы можно сравнить с поведением спецификации (которая сама должна быть исполняемой или моделируемой). Кроме того, операционные команды спецификации могут быть непосредственно преобразованы в исполняемый код. Если формальная спецификация основана на аксиоматической семантике, предусловия и постусловия спецификации могут быть использованы в качестве утверждений в исполняемом коде.

Проверка

Формальная проверка – это использование программных средств для доказательства свойств формальной спецификации или для доказательства того, что формальная модель реализации системы соответствует её спецификации. После разработки формальной спецификации она может быть использована в качестве основы для доказательства свойств самой спецификации и, как следствие, свойств реализации системы.

Проверка отпуска

Подтверждение с использованием подписи — это применение формального инструмента верификации, заслуживающего высокой степени доверия. Такой инструмент может заменить традиционные методы верификации (сам инструмент может быть даже сертифицирован).

Человекоуправляемое доказательство

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

Автоматическое доказательство

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

Приложения

Формальные методы применяются в различных областях аппаратного и программного обеспечения, включая маршрутизаторы, коммутаторы Ethernet, протоколы маршрутизации, приложения безопасности и микроядра операционных систем, такие как seL4. Есть несколько примеров их использования для верификации функциональности аппаратного и программного обеспечения, применяемого в центрах обработки данных. IBM использовала ACL2, систему доказательства теорем, в процессе разработки процессоров AMD x86. Intel применяет подобные методы для верификации своего оборудования и прошивки (постоянного программного обеспечения, записанного в постоянную память). Dansk Datamatik Center использовал формальные методы в 1980-х годах для разработки компиляторной системы для языка программирования Ada, которая впоследствии стала коммерчески успешным продуктом с длительным сроком службы. Существует ряд других проектов NASA, в которых применяются формальные методы, например, система воздушного транспорта нового поколения, интеграция систем беспилотных летательных аппаратов в национальное воздушное пространство и система координированного разрешения и обнаружения конфликтов в воздухе (ACCoRD). Метод B с Atelier B используется для разработки систем автоматической безопасности для различных метрополитенов, установленных по всему миру компаниями Alstom и Siemens, а также для сертификации по стандарту Common Criteria и разработки системных моделей компаниями ATMEL и STMicroelectronics. Формальная верификация широко используется в аппаратном обеспечении большинством известных производителей, таких как IBM, Intel и AMD. Intel применяет формальные методы для верификации работы своих продуктов во многих областях аппаратного обеспечения, включая параметрическую верификацию протокола когерентности кэша, валидацию исполнительного устройства процессора Intel Core i7 (с использованием доказательства теорем, BDD и символической оценки), оптимизацию для архитектуры Intel IA 64 с использованием системы доказательства теорем HOL light и верификацию высокопроизводительного двухпортового гигабитного контроллера Ethernet с поддержкой протокола PCI Express и технологии Intel Advanced Management Technology с использованием Cadence. Аналогично, IBM использовала формальные методы для верификации силовых затворов, регистров и функциональной верификации микропроцессора IBM Power7.

В разработке программного обеспечения

В разработке программного обеспечения формальные методы — это математические подходы к решению программных (и аппаратных) проблем на уровнях требований, спецификаций и проектирования. Формальные методы наиболее часто применяются к критически важному для безопасности или критически важному для надёжности программному обеспечению и системам, таким как программное обеспечение для авиационной техники. Стандарты обеспечения безопасности программного обеспечения, такие как DO 178C, допускают использование формальных методов в качестве дополнения, а Common Criteria предписывает их использование на высших уровнях категоризации. Для последовательного программного обеспечения примерами формальных методов являются метод B, языки спецификаций, используемые в автоматическом доказательстве теорем, RAISE и нотация Z. В функциональном программировании тестирование на основе свойств позволило математически задать и проверить (хотя и не обязательно исчерпывающе) ожидаемое поведение отдельных функций. Язык ограничений объектов (и его специализации, такие как Java Modeling Language) позволяет формально специфицировать объектно-ориентированные системы, хотя и не обязательно формально верифицировать их. Для параллельного программного обеспечения и систем сети Петри, алгебра процессов и конечные автоматы (основанные на теории автоматов; см. также виртуальный конечный автомат или автомат, управляемый событиями) позволяют создавать исполняемые спецификации программного обеспечения и могут использоваться для построения и проверки поведения приложений. Другой подход к формальным методам в разработке программного обеспечения — это написание спецификации на некоторой форме логики, обычно варианте логики первого порядка, и последующее непосредственное выполнение этой логики как программы. Язык OWL, основанный на дескриптивной логике, является примером такого подхода. Ведутся также работы по автоматическому отображению английского (или другого естественного языка) в логику и обратно, а также по непосредственному выполнению логики. Примерами являются Attempto Controlled English и Internet Business Logic, которые не стремятся контролировать словарный запас или синтаксис. Особенностью систем, поддерживающих двунаправленное отображение между английским языком и логикой, а также непосредственное выполнение логики, является возможность объяснять свои результаты на английском языке на уровне бизнеса или науки.

Формальные методы и обозначения

Существует множество формальных методов и нотаций.

Решающие и конкурсы

Многие задачи в формальных методах являются NP-трудными, но могут быть решены для случаев, возникающих на практике. Например, задача булевой выполнимости является NP-полной согласно теореме Кука — Левина, но решатели SAT способны решать множество больших экземпляров. Существуют "решатели" для различных задач, возникающих в формальных методах, и регулярно проводятся соревнования для оценки современного уровня развития методов решения таких задач. Конкурс SAT — это ежегодное соревнование, сравнивающее решатели SAT. Решатели SAT используются в инструментах формальных методов, таких как Alloy. CASC — это ежегодный конкурс автоматических доказателей теорем. SMT COMP — это ежегодный конкурс решателей SMT, применяемых для формальной верификации. CHC COMP — это ежегодный конкурс решателей для ограниченных клауз Хорна, которые находят применение в формальной верификации. QBFEVAL — это двухгодичный конкурс решателей для квантифицированных булевых формул, которые применяются при проверке моделей. SV COMP — это ежегодный конкурс инструментов верификации программного обеспечения. SyGuS COMP — это ежегодный конкурс инструментов синтеза программ.