코드의 정확성 증명이 주류가 될까요? [닫은]


14

가장 사소한 프로그램을 제외하고는 모두 버그로 가득 차 있으므로 제거 할 것을 약속하는 것은 매우 매혹적입니다. 현재, 정확성 증명은 코드가 매우 난해한데, 주로 배우기가 어렵고 프로그램을 증명하는 데 추가 노력이 필요하기 때문입니다. 코드 증명이 시작될 것이라고 생각하십니까?

답변:


8

실제로 그런 의미에서가 아니라 순수한 기능 프로그래밍이이 영역에서 좋습니다. Haskell을 사용하면 코드가 컴파일되면 프로그램이 올바른 것일 수 있습니다. IO를 제외하고 좋은 유형의 시스템이 도움이됩니다.

계약 프로그래밍도 도움이 될 수 있습니다. Microsoft 코드 계약 참조


6
죄송합니다. "실제"Haskell을 많이하지는 않았지만 여러 평생 동안 충분한 자습서 연습을했습니다. 컴파일한다고해서 그것이 효과가 있다는 것을 의미하지는 않습니다. 예를 들어 Ada (엄격히 정적으로 유형이 지정된 명령 언어이기 때문에 선택됨)와 비교할 때 Haskell이 조금 더 쉽지만 대부분 더 간결하기 때문에 (순환 복잡성이 낮음). IO 모나드를 다룰 때, Haskell 을 올바르게 맞추기가 어려워 지는 성가심이 있습니다 . 자연스럽게 할 수없는 일이 있다는 것은 명령형과는 완전히 다릅니다.
Steve314

"자연스럽게 할 수 없습니다"에서 "while"루프를 고려하십시오. 그렇습니다. 롤링 할 수는 있지만 while 조건은 루프 바디의 부작용에 반응해야하므로 모나드 내에 있어야합니다. 이것은 while 조건 내에서 부작용을 유발할 수있는 권한을 부여 받았을뿐만 아니라 while 루프를 사용하는 것이 어색합니다. 최종 결과-IO 모나드 코드에서도 재귀를 사용하는 것이 일반적으로 더 쉽습니다. 즉, 특정 방식으로 구조를 구성해야합니다.
Steve314

14

가장 사소한 프로그램을 제외한 모두

합리적인 노력으로 옳다는 것을 완전히 증명할 수는 없습니다. 공식적인 정확성 증명을 위해서는 최소한 공식적인 사양이 필요하며 해당 사양은 완전하고 정확해야합니다. 일반적으로 대부분의 실제 프로그램에서 쉽게 만들 수있는 것은 아닙니다. 예를 들어,이 토론 사이트의 사용자 인터페이스와 같은 사양을 작성하면 무슨 의미인지 알 수 있습니다.

여기서 나는 주제에 관한 좋은 기사를 찾았습니다.

http://www.encyclopedia.com/doc/1O11-programcorrectnessproof.html


모든 프로그래밍 프로젝트의 경우 문제에 대한 비공식적 인 설명에서 공식적인 문제 (일반적으로 오늘날 프로그램 형태)로 전환되고 사라지지는 않습니다.
David Thornley

astree.ens.fr 여기에서 Astrée의 산업 응용 프로그램 참조
zw324

@ZiyaoWei : 이러한 도구는 도움이되지만 공식적인 오류 만 발견합니다. 이러한 한 줄짜리 프로그램 printf("1")이 정확하거나 그렇지 않은 경우 (예를 들어, 요구 사항이 "1에서 6까지 균등하게 분포 된 난수를 인쇄하기 때문에") 이러한 정적 분석기로 결정할 수 없습니다.
Doc Brown

10

공식적인 증거의 문제는 단지 문제를 한 단계 뒤로 이동 시킨다는 것입니다.

프로그램이 올바르다는 것은 프로그램이해야 할 일을하는 것과 같습니다. 프로그램이 어떻게해야하는지 어떻게 정의합니까? 지정하십시오. 그리고 스펙이 다루지 않는 엣지 케이스에서 프로그램이 어떻게해야하는지 어떻게 정의합니까? 그렇다면 스펙을 더 자세하게 만들어야합니다.

따라서 전체 프로그램의 모든 측면에 대한 올바른 동작을 설명 할 수있을 정도로 사양이 상세 해집니다. 이제 증명 도구를 이해하는 방법이 필요합니다. 따라서 사양을 교정 도구가 이해할 수있는 일종의 공식 언어로 변환해야합니다. 잠시만 기다려주십시오!


2
또한 .. "위의 코드에서 버그에주의하십시오; 나는 단지 그것을 시도한 것이 아니라, 그것을 증명 한 것입니다." -Donald Knuth
Brendan

8

공식 검증은 먼 길을 갔지만 일반적으로 업계 / 일반적으로 사용되는 도구는 최신 연구보다 뒤떨어져 있습니다. 이 방향으로 최근 몇 가지 노력이 있습니다.

Spec # http://research.microsoft.com/en-us/projects/specsharp/ 코드 계약 (사전 / 사후 조건 및 불변)을 지원하는 C #의 확장이며이 계약을 사용하여 다양한 유형의 정적 분석을 수행 할 수 있습니다. .

Java 용 JML과 같은 다른 언어에서도 이와 유사한 프로젝트가 존재하며 Eiffel에는 거의 내장되어 있습니다.

더 나아가서, 슬램블래스트 와 같은 프로젝트 는 최소한의 프로그래머 주석 / 중재로 특정 행동 속성을 검증하는 데 사용될 수 있지만, 현대 언어의 전체 일반성을 처리 할 수는 없습니다 (정수 오버플로 / 포인터 산술과 같은 것은 모델링되지 않음).

앞으로이 기술들이 훨씬 더 많이 사용될 것으로 믿습니다. 주된 장벽은 프로그램 불변이 수동 주석없이 추론하기가 어렵다는 점이며, 프로그래머는 이러한 주석을 제공하는 것이 너무 지루하고 시간이 많이 걸리기 때문에 일반적으로 이러한 주석을 제공하지 않습니다.


4

광범위한 개발자 작업없이 코드를 자동으로 증명하는 방법이 없다면 그렇지 않습니다.


경제적 인 주장을 생각해보십시오. 소프트웨어 오류로 인해 돈을 잃는 것보다 개발자가 정확한 증거로 시간을 낭비하는 것이 더 낫습니다.
Andres F.

나는 많은 자원을 덜 소비하게되지 않는 한, 많은 양의 정규 비즈니스 소프트웨어가 그 수준의 정확성을 지원하기위한 비용 / 혜택을 갖지 않는 한, 피쉬 토스터에 동의합니다. LOB 앱에서 포로 대상 사용자에게 버그 보고서와 관련하여 비용에 대한 가장 큰 비즈니스 이점은 문서에 "그렇게하지 마십시오"라는 문구를 추가하는 것입니다.
Bill

3

일부 공식적인 방법 도구 (예 : 중요한 임베디드 C 소프트웨어의 경우 Frama-C )는 주어진 소프트웨어의 (정확한) 증거를 제공하거나 (정렬) 확인하는 것으로 볼 수 있습니다. (Frama-C는 어떤 방식 으로든 프로그램이 공식화 된 사양을 준수하고 프로그램에서 명시 적으로 주석이 달린 불변량을 존중하는지 확인합니다).

일부 부문에서는 민간 항공기의 중요 소프트웨어에 대한 DO-178C 와 같은 공식적인 방법이 가능합니다 . 따라서 어떤 경우에는 그러한 접근법이 가능하고 도움이됩니다.

물론 버그가 적은 소프트웨어를 개발하는 것은 비용이 많이 듭니다. 그러나 공식적인 방법론은 어떤 종류의 소프트웨어에 적합합니다. 비관적 인 경우 버그가 코드에서 공식 사양으로 이동했다고 생각할 수 있습니다 (소프트웨어의 의도 된 동작을 공식화하는 것이 어렵고 오류가 발생하기 때문에 일부 "버그"가있을 수 있음).


3

나는이 질문에 걸려 넘어 졌고이 링크가 흥미로울 것이라고 생각합니다.

Astrée의 산업 응용

Airbus에서 2003 년에 130K 이상의 코드 라인을 사용하는 시스템에 RTE가 없음을 증명하는 것은 나쁘지 않은 것으로 보이며 이것이 현실이 아니라고 말하는 사람이 있을지 궁금합니다.


2

아닙니다. 이것에 대한 일반적인 속담은 "이론에서 이론과 실제는 동일합니다. 실제로는 아닙니다."

하나의 매우 간단한 예 : 오타.

실제로 단위 테스트를 통해 코드를 실행하면 거의 즉시 그러한 것들을 발견 할 수 있으며, 일련의 테스트를 통해 공식적인 증거가 필요하지 않습니다. 모든 유스 케이스 (좋은, 나쁜, 오류 및 엣지 케이스)는 단위 테스트에서 열거되어야하며, 이는 코드와 분리 된 그러한 증거보다 코드의 정확성이 더 우수하다는 결과를 낳습니다.

특히 요구 사항이 변경되거나 버그를 수정하기 위해 알고리즘이 업데이트되는 경우 코드 주석이 자주 얻는 것과 같이 공식적인 증거가 만료 될 가능성이 높습니다.


3
잘못된. 단위 테스트는 가능한 모든 범위의 매개 변수를 다룰 수 없습니다. 패스 변경 의미가 없는지 확인하면서 컴파일러를 이런 방식으로 "유닛 테스트"한다고 상상해보십시오.
SK-logic

3
단위 테스트는 성배가 아닙니다 ...
Ryathal

1
@Winston Ewert에는 검증 된 컴파일러 (및 더 많은 검증 된 어셈블러)가 있습니다. 그리고 하드웨어는 소프트웨어보다 훨씬 더 공식적으로 검증됩니다. 여기 참조 : gallium.inria.fr/~xleroy/publi/compiler-certif.pdf
SK-logic

1
@ SK-logic, 예. 학업 목적에 맞는 것으로 입증 된 장난감 컴파일러가 있습니다. 그러나 사람들이 실제로 사용하는 컴파일러는 어떻습니까? 나는 대부분의 컴파일러가 다양한 형태의 자동 테스트를 사용하여 검사되며 공식적인 올바른 증거는 거의 없다고 생각합니다.
Winston Ewert

1
@Winston Ewert, 정확성 증명 은 실용 적이고 실생활에서 널리 사용됩니다. 실용적이지 않은 것은 대부분의 현대 주류 언어입니다. 나는 그들이 모두 죽기를 바랍니다. 따라서 정확성 증거의 가치는 앞으로 증가 할 것입니다.
SK-logic

1

중지 문제로 인해 정확성 증명에 부과되는 한계 는 정확성 증명이 주류가되는 가장 큰 장벽이 될 수 있다고 생각합니다 .


8
중지 문제는 임의의 프로그램이 중지되었는지 확인할 수 없다고 말합니다. 이 프로그램은 모든 정수를 테스트하여 Mersenne 소수인지 확인하는 것과 같은 이상한 일을 할 수 있습니다. 우리는 정상적인 프로그램에서는 이것을하지 않습니다!
Casebash

1
@Casebash, 문제는 중지 문제를 해결할 수있는 유용한 프로그램 하위 집합이 있는지 여부입니다. 그것은 결코 어느 쪽도 분명하지 않습니다. 즉, 유용한 작업을 수행하는 능력을 손상시키지 않으면 서 모든 정수를 테스트하는 것과 같은 일을 할 수 없도록 프로그램을 제한 할 수 있습니까?
Winston Ewert

1

이미 모든 사람이 사용하고 있습니다. 프로그래밍 언어의 유형 검사를 사용할 때마다 기본적으로 프로그램의 정확성을 수학적으로 증명합니다. 이것은 이미 잘 작동합니다. 사용하는 모든 함수와 데이터 구조에 맞는 유형을 선택하면됩니다. 유형이 정확할수록 더 잘 확인할 수 있습니다. 프로그래밍 언어로 제공되는 기존 유형에는 이미 거의 모든 동작을 설명 할 수있는 강력한 도구가 있습니다. 이것은 사용 가능한 모든 언어로 작동합니다. C ++과 정적 언어는 컴파일 타임에 검사를 수행하는 반면, 파이썬과 같은 더 동적 인 언어는 프로그램이 실행될 때 수행합니다. 수표는 여전히 모든 언어로 존재합니다. (예를 들어, C ++는 이미 haskell과 동일한 방식으로 부작용 검사를 지원합니다.


C ++의 부작용에 관한 내용으로 const 정확성을 언급하고 있습니까?
Winston Ewert

예, const + const 멤버 함수. 모든 멤버 함수가 const 인 경우 객체의 모든 데이터를 수정할 수 없습니다.
tp1

그들은 당신이 사용하는 경우 여전히 수정할 수 있습니다 mutable또는 const_cast. 나는 확실히 당신이 거기에 연결을보고 있지만, 두 가지 접근법의 맛은 나에게 다소 다르게 보입니다.
Winston Ewert

글쎄, 그것이 당신이 그것을 사용하도록 선택 해야하는 이유입니다. 항상 갈 수있는 방법이 있습니다. 그러나 중요한 점은 컴파일러가 해당 영역의 문제를 확인하도록하는 방법입니다.
tp1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.