정적 인증은이 작업의 시작점이 아닙니다. 이는 프로그램의 정확성을 자동으로 검증 할 수 있다는 전제에 기반합니다. 현실 세계에서는 실현 가능하지 않으며, 프로그램이 어떤 힌트없이 임의로 복잡한 코드를 검사 할 것으로 기대하는 것은 단순한 바보입니다. 일반적으로 정적 검증을위한 소프트웨어는 결국 소스 코드 전체에 힌트를 필요로하며 결국에는 오 탐지 (false positive) 및 위음성 (false negative)을 많이 생성합니다. 그것은 틈새 시장을 가지고 있지만 그게 전부입니다. (Pierce의 "Types and programming languages"에 대한 소개 참조)
이러한 종류의 도구는 엔지니어가 단순한 목적으로 개발 한 것이지만 실제 솔루션은 아카데미에서 베이킹되었습니다. 정적으로 타입이 지정된 프로그래밍 언어의 유형은 모든 것이 원활하게 진행되고 언어에 어떤 종류의 나쁜 동작이없는 것으로 가정하면 논리 문장과 동일하다는 것을 알 수 있습니다. 이것을 "Curry-Howard correspondence"이라고 부르며 유형에 논리를 삽입하는 것은 "Brouwer-Heyting-Kolmogorov logic"입니다. 가장 강력한 증명은 강력한 유형의 언어 인 dependent types에서만 가능합니다. 이 용어를 모두 잊어 버리면, programs that carry proofs의 정확성을 기록 할 수 있으며, 프로그램이 컴파일되는 동안 이러한 증명이 검사되며, 실패한 경우 실행 파일이 제공되지 않습니다.
이 접근 방식의 긍정적 인 측면은 사용자가 절대로 false negatives을 얻지 못한다는 것입니다. 즉, 컴파일 된 프로그램은 사양에 따라 올바르게 작동한다는 보장이 있습니다. 명세에 대한 추가적인 증거가 없다하더라도, 의존형 언어로 된 프로그램은 오류가 발생하기 쉽지 않습니다. 왜냐하면 실행 가능 프로그램에서 처리되지 않는 예외, 처리되지 않은 예외 및 오버 플로우가 절대로 발생하지 않기 때문입니다.
항상 손으로 그러한 교정본을 작성하는 것은 지루합니다. 이를 위해 "tactics"즉 정확성의 교정본을 생성하는 프로그램이 있습니다. 이것들은 정적 검증을위한 프로그램과 거의 동일하지만, 그것들과 달리 공식적인 증명을 생성해야합니다. Coq, Agda, Idris, Epigram, Cayenne 등
전술이 COQ에서 구현 아마도 몇 가지 더 많은 언어됩니다
는 서로 다른 목적을 위해 의존적-으로 입력 된 언어의 범위가있다. 또한 Coq는 가장 성숙했으며, Bedrock과 같은 라이브러리를 포함한 인프라가 있습니다. COQ의 경우 C 코드를 추출에서
는 C.
Haskell의 성능에 파에 ATS를 사용할 수 있습니다, 귀하의 요구 사항에 충분하지 않다 카레 - 하워드 대응의 약한 양식을 사용 : 잘 작동, 실패하거나 영원히 루핑하는 프로그램을 작성하지 않는 한. 요구 사항이 공식 증명을 작성하는 것이 어렵지 않은 경우 Haskell 사용을 고려하십시오.
정적 분석을하거나 도구를 통해 더 쉽게 분석 할 수 있도록 고안된 언어를 의미합니까? 내 대답은 다른 사람들이 의미하는 것과는 다른 것처럼 보입니다. 아마도 나는 틀 렸습니다. 그러나 질문을 다시 읽음으로써이 모호성의 여지가 있습니다. – jdehaan
@jdehaan을 사용하면 도구를 쉽게 사용할 수 있습니다. 즉, 해당 언어로 구현 된보다 쉬운 분석 프로그램 *을 만들 수 있습니다. "정적 검증 도구를 구현하는 언어"가 아닙니다. –
고마워요, 그럼 내 대답을 무시해 주셔서 감사합니다, 당신을 위해 유용하지 않으며, 또한 내가 인용 언어는 매우 실험적이며 이론적 인 작업 이외의 것들에 유용하지 않습니다. 나는 누군가가 그것을 흥미로워 할지도 모른다 :-) – jdehaan