Coq / Agda의 인증 된 컴파일러 및 최적화


9

Martin-Löf 형식 이론, 즉 Coq / Agda로 공식화 된 검증 된 컴파일러에 관심이 있습니다. 현재 나는 작은 장난감 예제를 작성했습니다. 이를 통해 최적화가 올바른지 확인할 수 있습니다. 예를 들어, 0을 사용한 추가는 제거 할 수 있습니다 (예 : "x + 0"과 같은 표현식).

일반적인 컴파일러로는 수행하기 어려운 최적화가 있습니까? 일반 컴파일러로는 수행 할 수없는 최적화를 허용하는 프로그램의 특정 속성을 증명할 수 있습니까? (즉 정리 정리로 가능한 추론없이)

아이디어 나 예제에 관심이 있고 주제에 대한 참조도 있습니다.

관련 질문 : 컴파일러 정확성 증명

편집 : 쓰요시 (Tsuyoshi)는 주석에 멋지게 넣었습니다. 컴파일러가 C로 작성된 경우 구현하기는 어렵지만 컴파일러가 Coq로 작성된 경우 구현하기 쉬운 최적화 기술을 찾고 있습니다. Agda가 C로 컴파일 할 때 (haskell을 통해) C에서도 Agda에서 가능한 모든 작업을 수행 할 수 있습니다. Coq / Agda와 같은 정리 프로 바이더의 유일한 이점은 컴파일러와 최적화를 확인할 수 있다는 것입니다.

edit2 : Vijay DI가 제안한대로 지금까지 읽은 내용을 작성하십시오. 저는 주로 INRIA의 Xavier Leroy와 CompCert 프로젝트에 중점을 두었습니다 (80 페이지의 좋은 논문이 있습니다). 두 번째 관심사는 대화식 프로그램에 대한 Anton Setzer의 작업에있었습니다. 나는 아마도 그의 작품이 IO 프로그램과 IO 프로그램의 bisimulation에 대한 속성을 증명하는 데 사용될 수 있습니다. Sewell을 언급 해 주셔서 감사합니다. ICFP에서 그의 이야기 "정글에서 이야기"를 듣고 아마 그의 논문 중 2-3을 읽었습니다. 그러나 나는 그의 작품과 그의 공동 저자의 작품을 구체적으로 보지 않았습니다.
아직 컴파일러 최적화에 대한 논문을 어디서 찾거나 찾아야하는지 찾지 못했습니다. 예를 들어, 검증 된 컴파일러의 설정에서 살펴볼 수있는 최적화는 무엇입니까?


1
“일반 컴파일러로는 수행하기 어려운 최적화가 있습니까?”: 불가능하지 않습니까? 확인 된 컴파일러에서 정확성의 증거를 제거하면 일반 컴파일러가 제공됩니다. 따라서 검증 된 컴파일러가 수행 할 수있는 모든 작업은 일반 컴파일러에서도 수행 할 수 있습니다. 확인 된 컴파일러의 요점 은 잘못된 최적화를 수행 할 수 없다는 것 입니다. (컴파일러 및 프로그램 검증에 대한 나의 지식은 최소한입니다. 요점을 놓친 경우 실례합니다.)
Tsuyoshi Ito

의견을 보내 주셔서 감사합니다. 나는 의미한다 : 일반적으로 불가능한 최적화를 수행 할 수있는 프로그램 (예를 들어, 서브 루틴은 비 진입이며 절대 호출 할 수 없음)에 대한 특정 속성 (보유 보장)을 증명할 수 있는가? 일부 변형은 프로그램을 확인하기 어려울 수 있으며 일반적으로 사용되는 컴파일러가 이러한 최적화를 수행하지 않을 수 있습니다. 그러나 아마도 나는 완전히 틀렸다.
mrsteve

1
당신은 컴파일러에 대해 얘기 로 작성 COQ / AGDA 또는 컴파일러 에 대한 COQ / AGDA? 나는 여러분의 질문이 Coq / Agda로 작성된 컴파일러에 관한 것이라고 생각했지만, Coq / Agda로 작성된 컴파일러가 C로 작성된 컴파일러보다 대상 프로그램에 대해 더 많은 속성을 입증 할 수 있다고 생각하지 않습니다.
Tsuyoshi Ito

2
읽은 내용을 질문에 추가하는 것이 좋습니다. 예를 들어 Xavier Leroy의 검증 된 편집 작업에 대해 잘 알고 있습니까? 아니면 Peter Sewell과 공동 작업자의 것입니까?
Vijay D

1
질문을 더 제한하지 않는 한 이러한 최적화는 없습니다. 극단적 인 경우 C 컴파일러는 창자에서 정리 증명을 비밀리에 구현할 수 있습니다 (대부분 실제로는 제한된 방식으로 수행함). "정규 컴파일러"가 무슨 뜻인지 잘 모르겠습니다.
Andrej Bauer

답변:


5

Yves Bertot, Benjamin Gr'egoire 및 Xavier Leroy가 작성한이 논문은 순전히 Coq 사양을 기반으로 C와 유사한 언어를위한 최적화 컴파일러를 빌드합니다. 이 기술 중 일부는 CompCert C 컴파일러 에서 사용됩니다 .

데이터 흐름 분석을 기반으로 컴파일러 최적화를 입증하기위한 구조적 접근

CP (constant propagation)와 CSE (common subexpression elimination), 섹션 4의 두 가지 최적화의 정확성을 고려합니다. 이러한 최적화는 동일한 언어에 대해 Coq 기반이 아닌 컴파일러와 관련된 것보다 더 고급입니다. gcc와 비교 한이 벤치 마크 차트를 참조하십시오 . ( 이것은 거의 언급되지 않지만 Coq 기반 컴파일러는 아마도 컴파일 속도느릴 것입니다 !)

ConCert의 원래 측면은 대부분의 컴파일러가 순전히 기능적인 스타일로 Coq 사양 언어로 직접 작성된다는 것입니다. 실행 가능한 컴파일러는이 사양에서 Caml 코드를 자동 추출하여 얻습니다.

그러나 논문의 마지막 부분에서는 실제 컴파일러에는 프레임 워크에서 모델링 할 수없는 일부 컴파일러 최적화가 있음에 주목합니다.

개선 된 최적화는 여기서 고려해야 할 유일한 요소가 아니며, 또 다른 측면은 컴파일러 최적화 로직이 복잡한 특성으로 인해 미묘한 결함을 겪을 수 있다는 것입니다. 수년 동안 gcc는 수많은 최적화 로직 루틴에 버그가있는 것으로 밝혀졌습니다. 예를 들어 gcc 버그?


3

일반적으로 불가능한 최적화를 수행 할 수있는 프로그램 (예 : 서브 루틴은 입력 할 수 없으며 자체 호출 할 수 없음)에 대해 특정 속성 (보유가 보장됨)을 증명할 수 있습니까?

유형 검사기를 확장하여 프로그램의 일부 속성을 최적화 프로그램에 제공하는 것과 같습니다. 나는 이토 츠요시가 옳다고 믿고 당신은 Coq에 대해 약간의 오도를받을 수 있습니다. 버그가없는 컴파일러를 제공하는 데 유용한 도구이지만 설명하는 경우 정적 분석에 더 많은 기능을 제공하지 않습니다.

Coq을 사용하여 정적 분석을 강화할 때 생각할 수있는 유일한 것은 사용자 작성 증거가 포함 된 어설 션을 언어에 갖추는 것입니다. -컴파일러 자체가 동적 유형 검사를위한 페더를 포함하는 언어로 번역되고 사용자 작성 증명이 함수로 변환 될 수있는 경우 해당 함수를 일부 서브 타이핑 또는 최적화를위한 필수 특성으로 적용 할 수 있습니다. -이것은 실제로 컴파일러에게 더 많은 힘을 제공 할 것입니다.

그러나 내가 알 수 있듯이 하위 유형을 강화하는 데 다소 유용합니다. -프로그래머가 어떤 위치에서 옵티 마이저에 도움이 될지 알기 어렵습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.