Trình biên dịch được chứng nhận và tối ưu hóa trong Coq / Agda


9

Tôi quan tâm đến các trình biên dịch được xác minh được chính thức hóa trong lý thuyết loại Martin-Löf, tức là Coq / Agda. Hiện tại tôi đã viết một ví dụ đồ chơi nhỏ. Do đó tôi có thể chứng minh rằng tối ưu hóa của tôi là chính xác. Ví dụ: bổ sung bằng 0 có thể được loại bỏ, tức là các biểu thức như "x + 0".

Có tối ưu hóa khó thực hiện với một trình biên dịch thông thường, đó sẽ là một ví dụ tốt? Có thể chứng minh các thuộc tính nhất định của chương trình cho phép tối ưu hóa mà không thể thực hiện với trình biên dịch thông thường không? (tức là không có suy luận có thể với một người hoạt động theo định lý)

Tôi sẽ quan tâm đến ý tưởng hoặc ví dụ và cả tài liệu tham khảo về chủ đề này.

Một câu hỏi liên quan: Bằng chứng chính xác của trình biên dịch

chỉnh sửa: Như Tsuyoshi đã đưa nó vào phần bình luận: Tôi đang tìm kiếm các kỹ thuật tối ưu hóa khó thực hiện nếu trình biên dịch được viết bằng (nói) C nhưng dễ thực hiện hơn nếu trình biên dịch được viết bằng (giả sử) Coq. Khi Agda biên dịch thành C (thông qua haskell), có thể làm mọi thứ có thể có trong Agda cũng ở C. Có lẽ lợi ích duy nhất của các trình duyệt định lý như Coq / Agda là trình biên dịch và tối ưu hóa có thể được xác minh.

edit2: Theo đề xuất của Vijay DI hãy viết những gì tôi đã đọc cho đến nay. Tôi chủ yếu tập trung vào Xavier Leroy và dự án CompCert tại INRIA (tôi có một bài báo dài 80 trang là một bài đọc tốt, tôi nghĩ vậy). Mối quan tâm thứ hai là công việc của Anton Setzer trên các chương trình tương tác. Tôi nghĩ rằng có lẽ công việc của anh ta có thể được sử dụng để chứng minh các thuộc tính về các chương trình IO và sự chia nhỏ các chương trình IO. Cảm ơn đã đề cập đến Sewell. Tôi đã nghe bài nói chuyện của anh ấy "Những câu chuyện từ rừng rậm" tại ICFP và đọc khoảng 2-3 bài báo của anh ấy. Nhưng tôi không đặc biệt nhìn vào công việc của anh ấy và của các đồng tác giả.
Tôi chưa tìm ra nơi để bắt đầu hoặc tìm kiếm các bài viết về tối ưu hóa trình biên dịch; ví dụ, tối ưu hóa nào sẽ rất thú vị khi xem xét trong cài đặt của trình biên dịch đã được xác minh.


1
Có tối ưu hóa khó thực hiện với trình biên dịch thông thường không: Điều đó là không thể? Nếu tôi loại bỏ bằng chứng về tính chính xác khỏi trình biên dịch đã được xác minh, tôi sẽ nhận được trình biên dịch thông thường. Do đó, bất cứ điều gì mà trình biên dịch đã xác minh có thể làm cũng có thể được thực hiện bởi trình biên dịch thông thường. Điểm của trình biên dịch được xác minh là nó không thể thực hiện tối ưu hóa không chính xác. (Kiến thức của tôi về trình biên dịch và xác minh chương trình là tối thiểu. Xin lỗi nếu tôi thiếu điểm.)
Tsuyoshi Ito

@Tsuyoshi cảm ơn bạn đã bình luận. Ý tôi là: Tôi có thể chứng minh một số thuộc tính nhất định (được bảo đảm để giữ) cho một chương trình (ví dụ: chương trình con không được ủy quyền và không bao giờ có thể tự gọi) cho phép thực hiện tối ưu hóa thường không thể thực hiện được. Một số bất biến có thể khó xác minh cho một chương trình và có lẽ những tối ưu hóa này không được thực hiện bởi các trình biên dịch thường được sử dụng. Nhưng có lẽ tôi hoàn toàn sai.
mrsteve

1
Bạn đang nói về một trình biên dịch được viết bằng Coq / Agda hay một trình biên dịch cho Coq / Agda? Tôi nghĩ rằng câu hỏi của bạn là về trình biên dịch được viết bằng Coq / Agda, nhưng sau đó tôi không nghĩ rằng trình biên dịch được viết bằng Coq / Agda có thể chứng minh bất kỳ thuộc tính nào về chương trình đích hơn trình biên dịch được viết trong C.
Tsuyoshi Ito

2
Nó sẽ là tốt để thêm những gì bạn đã đọc vào câu hỏi. Bạn có quen thuộc với công việc biên dịch đã được xác minh - chẳng hạn như của Xavier Leroy không? Hay đó là của Peter Sewell và cộng tác viên?
Vijay D

1
Không có tối ưu hóa như vậy, trừ khi bạn tiếp tục hạn chế câu hỏi của bạn. Trong trường hợp cực đoan, trình biên dịch C có thể bí mật thực hiện một định lý định lý trong ruột của nó (và hầu hết thực sự làm điều đó theo một cách hạn chế). Tôi nghĩ không rõ ý của bạn là "trình biên dịch thông thường".
Andrej Bauer

Câu trả lời:


5

bài báo này của Yves Bertot, Benjamin Gr Phụegoire và Xavier Leroy xây dựng trình biên dịch tối ưu hóa cho ngôn ngữ giống như C hoàn toàn dựa trên đặc tả Coq. một số công nghệ này dường như được sử dụng trong các trình biên dịch C CompCert .

Một cách tiếp cận có cấu trúc để chứng minh tối ưu hóa trình biên dịch dựa trên phân tích dataflow

nó xem xét tính chính xác của hai tối ưu hóa, lan truyền không đổi (CP) và loại bỏ biểu hiện phụ chung (CSE), phần 4. những tối ưu hóa này tiên tiến hơn so với các tối ưu hóa được liên kết với (các) trình biên dịch không dựa trên Coq cho cùng một ngôn ngữ. xem ví dụ biểu đồ điểm chuẩn này so với gcc. (trình biên dịch dựa trên Coq có lẽ được biên dịch chậm hơn mặc dù điều này hiếm khi được đề cập!)

Một khía cạnh ban đầu của ConCert là hầu hết các trình biên dịch được viết trực tiếp bằng ngôn ngữ đặc tả Coq, theo kiểu hoàn toàn chức năng. Trình biên dịch thực thi có được bằng cách trích xuất tự động mã Caml từ đặc tả này.

tuy nhiên ở phần cuối của bài báo họ lưu ý rằng có một số tối ưu hóa trình biên dịch trong các trình biên dịch thực không thể được mô hình hóa trong khung của chúng.

tối ưu hóa được cải thiện không phải là yếu tố duy nhất được xem xét ở đây, một khía cạnh khác là logic tối ưu hóa trình biên dịch có thể bị khiếm khuyết tinh vi do tính chất phức tạp của nó. Trong những năm qua, gcc đã được phát hiện có lỗi trong nhiều thói quen logic tối ưu hóa. vd: lỗi gcc?


3

Tôi có thể chứng minh một số thuộc tính nhất định (được bảo đảm để giữ) cho một chương trình (ví dụ: chương trình con không được ủy quyền và không bao giờ có thể tự gọi) cho phép thực hiện tối ưu hóa thường không thể thực hiện được.

Nó tương đương với việc mở rộng trình đánh máy để cung cấp một số thuộc tính của chương trình cho trình tối ưu hóa. Tôi tin rằng Tsuyoshi Ito đã đúng và bạn có thể hơi sai lầm về Coq. Nó là công cụ tuyệt vời để cung cấp trình biên dịch không có lỗi, nhưng trong trường hợp bạn mô tả, nó không cung cấp nhiều năng lượng hơn cho các phân tích tĩnh.

Điều duy nhất tôi có thể nghĩ về việc tăng cường phân tích tĩnh với Coq, là trang bị cho ngôn ngữ của bạn các xác nhận có chứa một số bằng chứng do người dùng viết. - Nếu bản thân trình biên dịch sẽ được dịch sang ngôn ngữ bao gồm một bộ lông để đánh máy động và nếu bằng chứng do người dùng viết có thể chuyển đổi thành các hàm, thì có thể áp dụng các hàm đó làm thuộc tính được yêu cầu trước cho một số kiểu con hoặc tối ưu hóa. - Điều này thực sự, sẽ cung cấp nhiều năng lượng hơn cho trình biên dịch.

Tuy nhiên, theo như tôi có thể thấy, nó sẽ khá hữu ích cho việc tăng cường phân nhóm. - Thật khó để làm cho một lập trình viên biết, thuộc tính nào ở nơi nào sẽ hữu ích cho trình tối ưu hóa.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.