계약에 따라 설계를 체크인하는 시간을 컴파일 하시겠습니까?

StackOverflow https://stackoverflow.com/questions/418588

  •  03-07-2019
  •  | 
  •  

문제

컴파일러가 컴파일 타임에 DBC를 시행 할 수 있다는 것을 읽었습니다. 어떻게합니까?

도움이 되었습니까?

해결책

내가 아는 한, 가장 강력한 정적 DBC 언어는 지금까지 Microsoft Research의 사양#. 강력한 정적 분석 도구를 사용합니다 부기 차례로 강력한 정리 속담 / 제약 솔버를 사용합니다. Z3 설계 시간에 계약의 이행 또는 위반을 증명합니다.

정리 전기가 계약이 언제나 위반되면 컴파일 오류입니다. 정리 전기가 계약이 절대 위반하십시오. 최적화입니다. 계약 수표는 최종 DLL에서 제거됩니다.

Charlie Martin이 지적했듯이, 일반적으로 계약을 증명하는 것은 중단 문제를 해결하는 것과 동일하므로 불가능합니다. 따라서 정리 전기가 계약을 증명하거나 반증 할 수없는 많은 사례가있을 것입니다. 이 경우 다른 덜 강력한 계약 시스템과 마찬가지로 런타임 확인이 방출됩니다.

사양#이 더 이상 개발되지 않습니다. 계약 엔진은 라이브러리로 추출되었습니다. .NET에 대한 코드 계약, .NET 4.0 / Visual Studio 2010의 일부가 될 것입니다. 그러나 계약에 대한 언어 지원은 없습니다.

다른 팁

컴파일러는 사용할 수 있습니다 정적 분석 프로그램을보고 프로그램이 올바른 일을하는지 결정합니다. 간단한 예로, 다음 코드는 음수 (C ++)의 제곱근을 취하려고 시도 할 수 있습니다.

double x;
cin >> x;
cout << sqrt(x) << endl;

컴파일러가 그것을 알고 있다면 sqrt 음수로 호출해서는 안되며, 사용자 입력에서 읽는 것을 알고 있기 때문에 문제가 될 수 있습니다. ~할 수 있었다 음수를 반환하십시오. 반면에, 당신이 이것을한다면 :

double x;
cin >> x;
if (x >= 0) {
    cout << sqrt(x) << endl;
} else {
    cout << "Can't take square root of negative number" << endl;
}

그러면 컴파일러는이 코드가 호출하지 않는다고 말할 수 있습니다. sqrt 음수로.

계약에 의한 설계는 매우 추상적 인 용어입니다. 표현의 힘을 가진 많은 사양 형식이있을 수 있기 때문입니다. 또한 현재 정적 분석의 능력에 대한 한계가 있으며 사양을 확인하고 시행합니다. 컴퓨터 과학에서 가장 활발한 학업 및 산업 연구 분야 중 하나입니다.

실제로, 계약 및 확인의 일부 하위 집합을 사용하고 사용중인 언어와 설치하는 플러그인 또는 프로그램에 따라 다를 수 있습니다.

일반적으로 정적 분석은 계약 모델과 실제 프로그램 모델을 구축하고 비교하려고합니다. 예를 들어, 계약이 객체가 상태 S에있을 때 함수를 호출 할 수없는 경우, 호출 시퀀스에서 상태 S에서 끝날 수 있는지 여부를 결정하려고합니다.

어떤 컴파일러와 어떤 언어? 에펠은 어느 정도까지 그것을 할 수 있습니다. 그러나 계약별로 완전히 시행하는 것은 중단 문제를 해결할 수 있다는 것을 의미합니다 (증거 :이를 수행 할 수있는 컴파일러가 있다고 가정합니다. 그러면 컴파일러는 실제 종료 조건으로 임의의 기능을 식별 할 수 있어야합니다. 그것은 무한 루프 또는 무한 재귀로 인해 출구 조건을 달성 할 수 없습니다. 따라서 중단으로 감소합니다.)

일반적으로 의미는 전화가있는 경우

  foo(a);

그리고 다른 곳은 정의합니다

  function foo(a:int) is
     assert 0 < a && a < 128
     ...
  end

그런 다음 컴파일러는 실제로 A가 열린 간격 (0..128)인지 확인할 수 있습니다.

일부 언어는 같은 언어입니다 합리적으로 강력한 컴파일 타임 상수 접이식 및 컴파일 시간 조건 확인 (D의 경우 static assert(boolCond, msg);, IIRC C/C ++는 사용할 수 있습니다 #if 그리고 pragma 또는 #error)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top