Вопрос

Меня учили о формальные системы В университете, но я был разочарован, как они, кажется, не использовались в реальном словом.

Мне нравится идея быть в состоянии узнать, что какой-то код (объект, функция, что угодно) работает, а не тестированием, а доказательство.

Я уверен, что мы все знакомы с параллелями, которые не существуют между физической инженерной и программной техникой (сталь ведет себя предсказуемо, программное обеспечение может сделать что угодно - кто знает!), И я хотел бы знать, есть ли какие-либо языки, которые можно использовать в реальном слове (просит веб-каркас слишком много, чтобы спросить?)

Я слышал интересные вещи о постижимости функциональных языков, таких как Scala.

Как программное обеспечение инженеры Какие варианты у нас есть?

Это было полезно?

Решение

Да, есть языки, предназначенные для написания, добыточное правильное программное обеспечение. Некоторые даже используются в промышленности. Spark Ada. Вероятно, самый выдающийся пример. Я разговаривал с несколькими людьми в критических системах Praxis Critics Systems, которые использовали его для кода, работающего на досках (для мониторинга двигателя), и это кажется довольно хорошим. (Вот отличный Резюме / описание языка,) Этот язык и сопроводительная система доказательства используют вторую технику, описанную ниже. Это даже не поддерживает динамическое распределение памяти!


Мое впечатление и опыт заключается в том, что есть два метода для написания правильного программного обеспечения:

  • Техника 1: Напишите программное обеспечение на языке, на котором вам удобно (C, C ++ или Java). Примите официальную спецификацию такого языка и подтвердите свою программу.

    Если ваши амбиции должны быть правильными на 100% (что чаще всего является требованием в автомобильной / аэрокосмической промышленности), вы будете проводить небольшое время программирования и более времени.

  • Техника 2: Напишите программное обеспечение в немного более неловковом языке (некоторое подмножество ADA или настраиваемая версия OCAML) и напишите корректность доказательства по пути. Здесь программирование и доказывание идет рука об руку. Программирование в коке даже полностью приравнивает их! (См. Керри-Говарская переписка)

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

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

Вот несколько дополнительных примеров официальных подходов. Если это «реальный мир» или нет, зависит от того, кто вы спрашиваете :-)

Я знаю только один "доказанный правильный" Язык веб-приложения: Ур. Отказ УР-программа, которую «проходит через компилятор», гарантируется не:

  • Страдать от любых видов атак для инъекций кода
  • Вернуть неверный HTML
  • Содержать мертвые внутрисвязки
  • Иметь несоответствия между формами HTML и полями, ожидаемыми их обработчиками
  • Включите клиентский код, который делает неверные предположения о службах «AJAX», которые обеспечивает удаленный веб-сервер
  • Попытка недействительных запросов SQL
  • Используйте неправильное маршалирование или немонтирование в связи с базами данных SQL или между браузерами и веб-серверами

Другие советы

Чтобы ответить на этот вопрос, вам действительно нужно определить, что вы подразумеваете под «доказанным». Как отметил Рики, любой язык с системой типа является языком со встроенной системой доказательства, которая запускается каждый раз, когда вы собираете свою программу. Эти доказательственные системы почти всегда к сожалению, импотент - отвечая на такие вопросы String против Int и избегать таких вопросов, как «это список отсортирован?» - Но они являются недобросовестными системами не менее.

К сожалению, тем более сложные ваши доказывают цели, тем труднее работать с системой, которая может проверить ваши доказательства. Это сконструирует довольно быстро в неразрешемо, когда вы рассматриваете чистый размер класса проблем, которые неразрешимыми на Turging Machines. Конечно, вы можете теоретически делать основные вещи, такие как доказывая правильность своего сортировки алгоритма, но все большее, что будет наступить на очень тонкий лед.

Даже доказать что-то простое, как правильность сортировки алгоритма требует сравнительно сложной системы доказательства. (Примечание: поскольку мы уже установили, что системы типа - это система доказательства, встроенная на язык, я собираюсь поговорить о вещах с точки зрения теории типа, а не размахивая руками еще более энергично), я довольно уверен, что Полная корректность доказательства в сортировке списка потребуется некоторая форма зависимых типов, в противном случае у вас нет способа ссылаться на относительные значения на уровне типа. Это немедленно начинает взрываться в царствам теории типа, которые были показаны неразрешены. Итак, хотя вы сможете доказать правильность в своем списке алгоритм сортировки, единственный способ сделать это, чтобы использовать систему, которая также позволит вам выразить доказательства, которые он не может проверить. Лично я нахожу это очень смущению.

Также есть аспект, который я ссылался на ранее. Чем более сложная система вашего типа, тем менее приятной это использовать. Это не твердое и быстрое правило, но я думаю, что это верно по большей части. И, как и в случае любой формальной системы, вы часто найдете, что выражение доказательства - это больше работы (и более ошибок), чем создание реализации в первую очередь.

Со всеми той из них, стоит отметить, что система типа Скалы (например, haskell's) завершена полной, что означает, что вы можете теоретически Используйте его, чтобы доказать любую удаленное свойство о вашем коде, при условии, что вы записали свой код таким образом, что оно поддается таким доказательствам. Haskell почти наверняка, конечно, лучший язык для этого, чем Java (поскольку программирование уровня типа в Haskell аналогично продоброванию, а программирование уровня типа в Scala более похоже на SML). Я не советую, чтобы вы использовали системы типа Scala или Haskell таким образом (формальные доказательства алгоритмической правильности), но опция теоретически доступна.

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

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

Для доказательства того, что целая программа работает, да, вы наступаете за пределы границ обычных языков, где математика и программирование встречаются друг с другом, пожать друг другу руки, а затем приступить к разговору с помощью греческих символов о том, как программисты не могут обрабатывать греческие символы. Это о σ это в любом случае.

Вы задаете вопрос, многие из нас спросили за эти годы. Я не знаю, что у меня хороший ответ, но вот несколько штук:

  • Есть хорошо понятые языки с возможностью доказательства в использовании сегодня; Lisp через ACL2 - это один, и, конечно, схема имеет хорошо понятое формальное определение.

  • Ряд систем пытались использовать чистые функциональные языки или почти чистые, такие как haskell. В Haskell есть справедливый бит формальных методов.

  • Идущая еще 20 лет, была недолговечная вещь для использования вручную доказательства формального языка, который затем был строго переведен на скомпилированный язык. Некоторые примеры были программным обеспечением IBM Clean Software, ACL, цыган и выросли из вычислительной логики, John MCHUGH и мою работу над надежной компиляцией C, и мою собственную работу под руководством для программирования системного программирования C. Все эти уделяли некоторое внимание, но никто из них не привел его на практике.

Думаю, интересный вопрос, который, я думаю, это то, что было бы достаточным условиям, чтобы получить официальные подходы к практике? Я хотел бы услышать некоторые предложения.

Вы можете расследовать Чисто функциональные языки как haskell, которые используются, когда один из ваших требований доказательство.

Этот Является ли забавным читать, если вы заинтересованы в отношении функциональных языков программирования и чистые функциональные языки программирования.

Реальное использование таких доказанных языков было бы невероятно трудно писать и понимать последующие. Бизнес мира нуждается в работе программного обеспечения, быстро.

«Доказанные» языки просто не шкалы для написания / чтения базы кодовой базы крупных проектов и, кажется, работают только в небольших и изолированных случаях использования.

Я участвует в двух добрасных языках. Первый - это язык, поддерживаемый идеальным разработчиком, системой указания SOTFWARE, уточнения IT и генерирующей код. Он использовался для некоторых крупных систем, в том числе самого PD, и он преподается в ряде университетов. Второй доказанный язык, которого я вовлечен, является добрательным подмножеством Misra-C, см. Блог C / C ++ для большего.

Проверить Омега.

Этот введение Содержит относительно безболезненную реализацию деревьев AVL с включенной корректностью.

SCALA предназначена для того, чтобы быть «реальным миром», поэтому никакие усилия не были сделаны, чтобы сделать его доказанным. Что вы можете сделать в Scala, - это создать функциональный код. Функциональный код гораздо проще проверить, что является хорошим компромиссом между «реальным миром» и доработанностью.

Редактировать ===== Удалены мои неверные идеи о ML «доказательны».

Мое (противоречивое) определение «реального мира» в контексте докорренно-правильного кода является:

  • Это должно включать в себя определенную степень автоматизация, в противном случае вы собираетесь потратить слишком много времени, доказывая и имеющие дело с грязными подробностями, и это будет совершенно непрактично (за исключением, возможно, для программного обеспечения для контроля космического корабля и такого рода вещей, для которой вы могли бы потратить Megabucks Доточные проверки).
  • Это должно поддерживать некоторую степень Функциональное программирование, что помогает вам написать код, который очень модульный, многоразовый и легче для рассуждения. Очевидно, что функциональное программирование не требуется для написания или доказательств Hello World или различных простых программ, но в определенной точке функциональное программирование становится очень полезным.
  • Хотя вы не обязательно должны быть в состоянии написать свой код в основной язык программирования, в качестве альтернативы, вы должны, по крайней мере, быть в состоянии машины переводить свой код в достаточно эффективный код, написанный на основном языке программирования, в надежном виде. способ.

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

Ввиду этих точек многие из инструментов, перечисленных в Этот блог пост моего Может быть полезен - хотя они почти все новые, так и экспериментальные, либо незнакомые подавляющим большинству промышленных программистов. Там есть несколько очень зрелых инструментов, хотя.

Как насчет Idris. а также АГДА? Реальный мир достаточно?

В качестве хорошего примера реальной жизни есть проект, который стремится предоставить проверенную библиотеку LEMMACHINE, написанную в Agda https://github.com/larrytheliquid/lemmachine.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top