Программирование на основе инвариантов: методология и перспективы
Invariant-based programming
Программирование на основе инвариантов: методология разработки с предварительным определением спецификаций и свойств. Повышает надежность и позволяет формальную верификацию кода.
Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Введение
Инвариантное программирование — это методология программирования, в которой спецификации и инварианты записываются до фактических операторов программы. Запись инвариантов в процессе программирования имеет ряд преимуществ: она требует от программиста четко сформулировать свои намерения относительно поведения программы до её реализации, а инварианты могут динамически проверяться во время выполнения для выявления распространенных ошибок программирования. Более того, если инварианты достаточно сильны, они могут быть использованы для доказательства корректности программы на основе формальной семантики операторов программы. Для полной верификации нетривиальных программ обычно требуется комбинированный язык программирования и спецификаций, подключенный к мощной системе формального доказательства. В этом случае возможна и высокая степень автоматизации доказательств. В большинстве существующих языков программирования основными структурами организации кода являются блоки управления потоком, такие как циклы for, циклы while и операторы if. Такие языки могут быть не оптимальны для программирования, основанного на инвариантах, поскольку они вынуждают программиста принимать решения о потоке управления до записи инвариантов. Кроме того, большинство языков программирования не обеспечивают хорошей поддержки для записи спецификаций и инвариантов, поскольку в них отсутствуют кванторы и обычно невозможно выразить свойства высшего порядка. Идея разработки программы вместе с её доказательством принадлежит Э. В. Дейкстре. Фактическое написание инвариантов перед операторами программы в различных формах рассматривалось М. Х. ван Эмденом, Дж. К. Рейнольдсом и Р. Дж. Бэком.
Invariant based programming is a programming methodology where specifications and invariants are written before the actual program statements. Writing down the invariants during the programming process has a number of advantages: it requires the programmer to make their intentions about the program behavior explicit before actually implementing it, and invariants can be evaluated dynamically during execution to catch common programming errors. Furthermore, if strong enough, invariants can be used to prove the correctness of the program based on the formal semantics of program statements. A combined programming and specification language, connected to a powerful formal proof system, will generally be required for full verification of non trivial programs. In this case a high degree of automation of proofs is also possible. In most existing programming languages the main organizing structures are control flow blocks such as for loops, while loops and if statements. Such languages may not be ideal for invariants first programming, since they force the programmer to make decisions about control flow before writing the invariants. Furthermore, most programming languages do not have good support for writing specifications and invariants, since they lack quantifier operators and one can typically not express higher order properties. The idea of developing the program together with its proof originated from E. W. Dijkstra. Actually writing invariants before program statements has been considered in a number of different forms by M. H. van Emden, J. C. Reynolds and R J Back.