juan_gandhi: (Default)
[personal profile] juan_gandhi
Тут в разговоре про очередного, имхо, шарлатана, профессора Шалыто, выяснилось, что есть такая идея, будто для верификации программ достаточно FSM, конечного автомата.

Вот скажите мне, возьмём такой пример: даден алфавит, {a, b}, и две программы, одна генерирует все палиндромы в этом алфавите, вторая проверяет, что данная строка является палиндромом.

Скажите, какой конечный автомат может верифицировать эти программы?
Page 1 of 3 << [1] [2] [3] >>

Date: 2010-05-08 11:00 pm (UTC)
From: [identity profile] panchul.livejournal.com
А что, формальная верификация софтверных программ имеет реальное применение? В какой области? Я знаком только с формальной верификацией хардвера (поверхностно), и с динамической верификацией хардвера (coverage-driven constraint-random verification, SystemVerilog/VMM).

Date: 2010-05-08 11:15 pm (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Это мой следующий вопрос: а что, собственно, это за штука такая, верификация программ? Верификация хардвера, для меня по крайней мере, имеет какой-то смысл, потому что хардвер конечен.

Date: 2010-05-09 12:07 am (UTC)
From: [identity profile] vit-r.livejournal.com
"Нет такой буквы в этом слове."

Практически, задача у верификации - доказать, что система не выдаст ошибочного значения. Правда, самая надёжная система - та, которая выключена. Но это тоже удовлетворяет условию задачи, хоть мало кто об этом любит говорить.

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

Date: 2010-05-09 12:23 am (UTC)
From: [identity profile] panchul.livejournal.com
Хардвер не совсем конечен. Хотя пространство состояний принципиально меньше, чем у софтвера, перебрать все пространство состояний и переходов даже простого устройства нереально. Именно для этого изобретены методологии с комбинацией динамической симуляции, формальной верификации, coverage и constraint random. Кроме этого в хардвере везде параллельность, что усложняет дело.

То, что верификация хардвера существует (как распостраненное занятие), а верификация софтвера - нет, объясняется не только "конечностью" хардвера, но и более высокими требованиями к качеству, чем у софтвера (после отправления дизайна на фабрику его не поменяешь (за исключением FPGA)). Верификация софтвера (I guess) наверное имеет практический смысл только для RTOS, которые маленькие, сильно параллельные, и имеют четко определенные абстракции (threads, mailbox, semaphore) и т.д.

Date: 2010-05-09 12:29 am (UTC)
From: [identity profile] vit-r.livejournal.com
и выдаст правильное значение

Ну я ж русским языком пишу "практически"

В большинстве случаев она выдаёт правильное значение. В остальных - падает кверху лапками и производит перезапуск. Если может.

Date: 2010-05-09 12:32 am (UTC)
From: [identity profile] vit-r.livejournal.com
Грубо говоря, по стандартам весь mission critical софт должен верифицироваться. В большинстве случаев, правда, это некий ручной процесс, близкое знакомство с которым лишает всяческих светлых иллюзий.

Date: 2010-05-09 12:39 am (UTC)
From: [identity profile] mr-aleph.livejournal.com
м, непонятно что значит верифицировать программу конечным автоматом.

Date: 2010-05-09 12:41 am (UTC)
From: [identity profile] panchul.livejournal.com
По ссылке написано в основном про хардвер (combinational circuits, digital circuits with internal memory) и специальные случаи софтвера (cryptographic protocols, ..., and software expressed as source code.) Программные продукты для верификации хардвера на рынке существуют (например программы, которые доказывают те или иные свойства для RTL (register-transfer-level) дизайнов на Verilog, или которые определяют эквивалентность двух дизайнов, или верификация с помощью симуляции с хитрыми методами генерации случайных транзакций, подсчета покрытия и state space exploration. См. http://pikibook.com/electrical-engineering/digital-electronics/verilog-hdl/advanced-verification-techniques-summary

А вот программные продукты для верификации софтвера я не знаю, поэтому и спрашиваю. Я предполагаю, что они должны существовать для RTOS, которые маленькие, сильно параллельные, и имеют четко определенные абстракции (threads, mailbox, semaphore) и т.д. Но тогда встает вопрос - что для таких программ верификации является входным языком, который они парсируют? С/C++/Java? Эти языки труднее верифицировать, чем RTL-подмножество верилога ИМХО, ибо в них главную роль играют всякие динамические структуры (деревья с поинтерами), семантика которые на уровне языка не особенно видна (в то время как из кода на верилоге можно извлечь state machine).

Date: 2010-05-09 12:43 am (UTC)
From: [identity profile] vit-r.livejournal.com
В принципе, у оператора есть кнопка горячего перезапуска. Ну, или детонатор для автономной системы.

Date: 2010-05-09 12:53 am (UTC)
From: [identity profile] panchul.livejournal.com
О, спасибо, это я и спрашивал

Date: 2010-05-09 01:00 am (UTC)
From: [identity profile] vit-r.livejournal.com
Уважаемый, писать что-то для такого софта можно не на языке С, С++ или Паскале, а только на строго ограниченном подмножестве.
Тут в каждой строчке нарушены базовые требования любого стандарта на кодирование.

Date: 2010-05-09 01:05 am (UTC)
From: [identity profile] huzhepidarasa.livejournal.com
Хм. Вот есть программа
ispal x = x == reverse x
Можно ли верифицировать ее правильность конечным автоматом? Это же практически определение палиндрома, доказывать нечего. Может ли конечный автомат проверить, правильно ли записано определение? Хрен его знает, почему бы и нет? Во всяком случае, к какому классу относится язык, принимаемый программой, здесь вроде бы не играет роли. Нам больше интересен язык, на котором она написана.

Date: 2010-05-09 01:12 am (UTC)
From: [identity profile] vit-r.livejournal.com
Первым делом, в приличных системах не одна программа, а минимум две, работающих параллельно.

Вторым, обычно идёт бесконечный цикл чтения входных значений и выдача выходных. Если программа в том же самолёте остановится, то пилотам придётся очень туго. А Арианы, те просто взрываются.

Весёлым же местом в таких системах являются не зацикливания, а дидлоки. Беда в том, что о существовании асинхронных не все специалисты подозревают. А оттестировать такое дело очень и очень сложно.

Date: 2010-05-09 01:13 am (UTC)
From: [identity profile] vit-r.livejournal.com
На всякий случай:
Любой тезис можно доказать, приведя левый, не относящийся к делу аргумент.

Date: 2010-05-09 01:31 am (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Второй линк особенно прикольный. Сейчас, 14 лет спустя, было бы интересно вернуться к этому вопросу, действительно ли они что-то доказали в системе предотвращения наводнений в Голландии.

Date: 2010-05-09 01:32 am (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Вот и у меня такое же впечатление. :)

Date: 2010-05-09 01:42 am (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
О! Вы переводите разговор на совершенно несущественные рельсы. Этот пример, выше - прекрасный пример, очень содержательный. И разговаривать о нём надо по существу.

Date: 2010-05-09 01:43 am (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
У меня такое ощущение, что собеседник немножко поплыл.

Date: 2010-05-09 01:44 am (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Мне тоже, на самом деле.

Date: 2010-05-09 01:44 am (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Да. Хороший вопрос. Можно?

Date: 2010-05-09 02:04 am (UTC)
From: [identity profile] vit-r.livejournal.com
совершенно несущественные рельсы

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

Короче говоря, если мы говорим о поезде, то он ездит по рельсам. Если не по рельсам, то это уже не поезд.

А так, да. Разговор идёт мимо.

Date: 2010-05-09 02:06 am (UTC)
From: [identity profile] vit-r.livejournal.com
Я не поплыл. Тут просто четыре часа ночи и мне очень влом.

Date: 2010-05-09 02:13 am (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Ну можно же и не спешить вступать в бой в 4-то часа ночи, а? :)

Date: 2010-05-09 02:27 am (UTC)
From: [identity profile] vit-r.livejournal.com
Мы говорим о верифицированном компиляторе или о верифицированной системе управления?

1) если заменять на полностью систему, то туда придётся включать железо. Так что кнопка "рестарт" входит.

2) в общем случае верификация является утверждением, а не доказательством.
Теоретическое доказательство я видел только в очень редких случаях. Точнее, не видел, а читал отчёты об успешном проведении. Судя по тому, что делал в одном проекте математик, у меня в успешности большие сомнения.

3) работает фактор ответственности. То есть, выдача неправильного ответа - это провал. Невыдача ответа - срабатывание защиты.

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

Про лайвлоки - да. Но, подозреваю, условия в реальности для них возникают очень редко.

Date: 2010-05-09 02:28 am (UTC)
From: [identity profile] huzhepidarasa.livejournal.com
Да вот непонятно. С одной стороны вроде нельзя, надо хотя бы уметь имена переменных запоминать и потом сравнивать. С другой стороны, это тривиальная надстройка над конечным автоматом. Может, можно препроцессинг какой запустить и избавиться от таких переменных, а потом уже верифицировать. Содержательная часть — это доказательство некоторого утверждения о программе. Доказательства каких-то тривиальных утверждений можно породить конечным автоматом. Может быть, можно придумать язык, на котором легко писать так, чтобы большинство интересных нам утверждений были в нужном смысле тривиальными (типа «определение записано правильно»). Я не знаю.
Page 1 of 3 << [1] [2] [3] >>

Profile

juan_gandhi: (Default)
Juan-Carlos Gandhi

December 2025

S M T W T F S
  1 2 3 4 56
7 89101112 13
14 151617 181920
21 222324252627
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 24th, 2025 06:40 am
Powered by Dreamwidth Studios