คอมไพเลอร์ที่ผ่านการรับรองและการเพิ่มประสิทธิภาพใน Coq / Agda


9

ฉันสนใจคอมไพเลอร์ที่ผ่านการตรวจสอบอย่างเป็นทางการในทฤษฎีประเภทมาร์ติน - โลฟเช่น Coq / Agda ในขณะนี้ฉันได้เขียนตัวอย่างของเล่นเล็ก ๆ ฉันสามารถพิสูจน์ได้ว่าการเพิ่มประสิทธิภาพของฉันถูกต้อง ตัวอย่างเช่นสามารถลบส่วนที่มีศูนย์ได้เช่นนิพจน์เช่น "x + 0"

มีการปรับให้เหมาะสมที่ยากที่จะดำเนินการกับคอมไพเลอร์ปกติซึ่งจะเป็นตัวอย่างที่ดีหรือไม่? เป็นไปได้หรือไม่ที่จะพิสูจน์คุณสมบัติบางอย่างของโปรแกรมที่อนุญาตการเพิ่มประสิทธิภาพที่ไม่สามารถทำได้ด้วยคอมไพเลอร์ปกติ? (เช่นไม่มีข้อสรุปที่เป็นไปได้กับนักทฤษฎีบท)

ฉันจะสนใจในความคิดหรือตัวอย่างและอ้างอิงในหัวข้อ

คำถามที่เกี่ยวข้อง: การ พิสูจน์ความถูกต้องของคอมไพเลอร์

แก้ไข: ตามที่ Tsuyoshi ใส่ไว้ในข้อคิดเห็น: ฉันกำลังมองหาเทคนิคการปรับให้เหมาะสมซึ่งยากที่จะนำไปใช้ถ้าคอมไพเลอร์เขียนด้วย (พูด) C แต่ง่ายต่อการนำไปใช้ถ้าคอมไพเลอร์เขียนด้วย (พูด) Coq เมื่อ Agda รวบรวมไปยัง C (ผ่าน Haskell) มันเป็นไปได้ที่จะทำทุกอย่างที่เป็นไปได้ใน Agda เช่นกันใน C อาจเป็นประโยชน์เพียงอย่างเดียวของผู้พิสูจน์ทฤษฎีบทเช่น Coq / Agda คือคอมไพเลอร์และการปรับให้เหมาะสมสามารถตรวจสอบได้

edit2: ตามคำแนะนำของ Vijay DI เขียนสิ่งที่ฉันอ่านมา ฉันมุ่งเน้นไปที่ Xavier Leroy และโครงการ CompCert ที่ INRIA (มีกระดาษ 80 แผ่นที่อ่านได้ดีฉันคิดว่า) ความสนใจที่สองคืองานของ Anton Setzer ในรายการแบบโต้ตอบ ฉันคิดว่าบางทีงานของเขาอาจถูกใช้เพื่อพิสูจน์คุณสมบัติเกี่ยวกับโปรแกรม IO และ bisimulation ของโปรแกรม IO ขอบคุณที่พูดถึงซีเวลล์ ฉันเคยได้ยินคำพูดของเขาที่ว่า "นิทานจากป่า" ที่ ICFP และอ่านหนังสือพิมพ์ 2-3 เรื่องของเขา แต่ฉันไม่ได้ดูงานของเขาและเพื่อนร่วมงานของเขาโดยเฉพาะ
ฉันยังไม่ทราบว่าจะเริ่มหรือหาเอกสารเกี่ยวกับการปรับแต่งคอมไพเลอร์ให้เหมาะสม เช่นการเพิ่มประสิทธิภาพที่น่าสนใจที่จะดูในการตั้งค่าคอมไพเลอร์ที่ตรวจสอบแล้ว


1
“ มีการปรับแต่งที่ทำได้ยากด้วยคอมไพเลอร์ปกติ”: นั่นเป็นไปไม่ได้เหรอ? หากฉันลบหลักฐานความถูกต้องออกจากคอมไพเลอร์ที่ผ่านการตรวจสอบแล้วฉันจะได้รับคอมไพเลอร์ปกติ ดังนั้นสิ่งใดก็ตามที่คอมไพเลอร์ที่ตรวจสอบแล้วสามารถทำได้โดยคอมไพเลอร์ปกติ จุดสำคัญของคอมไพเลอร์ที่ผ่านการตรวจสอบแล้วคือไม่สามารถทำการปรับให้เหมาะสมซึ่งไม่ถูกต้อง (ความรู้ของฉันเกี่ยวกับคอมไพเลอร์และการตรวจสอบโปรแกรมมีน้อยมากขอโทษถ้าฉันไม่มีจุด)
Tsuyoshi Ito

@Tsuyoshi ขอบคุณสำหรับความคิดเห็นของคุณ ฉันหมายถึง: ฉันสามารถพิสูจน์คุณสมบัติบางอย่าง (ที่รับประกันว่าจะเก็บไว้) สำหรับโปรแกรม (เช่นรูทีนย่อยนั้นไม่ใช่ผู้เข้าร่วมและไม่สามารถเรียกตัวเองได้) ที่อนุญาตให้ทำการปรับให้เหมาะสมที่ไม่สามารถทำได้ ค่าคงที่บางค่าอาจตรวจสอบโปรแกรมได้ยากและบางทีการเพิ่มประสิทธิภาพเหล่านี้ไม่ได้ทำโดยคอมไพเลอร์ที่ใช้กันทั่วไป แต่บางทีฉันผิดอย่างสมบูรณ์
mrsteve

1
คุณกำลังพูดถึงคอมไพเลอร์ที่เขียนด้วย Coq / Agda หรือคอมไพเลอร์สำหรับ Coq / Agda หรือไม่? ฉันคิดว่าคำถามของคุณเกี่ยวกับคอมไพเลอร์ที่เขียนใน Coq / Agda แต่ฉันไม่คิดว่าคอมไพเลอร์ที่เขียนใน Coq / Agda สามารถพิสูจน์คุณสมบัติเพิ่มเติมเกี่ยวกับโปรแกรมเป้าหมายได้มากกว่าคอมไพเลอร์ที่เขียนใน C.
Tsuyoshi Ito

2
มันเป็นการดีที่จะเพิ่มสิ่งที่คุณได้อ่านในคำถาม คุณคุ้นเคยกับการทำงานเกี่ยวกับการคอมไพล์ที่ผ่านการตรวจสอบแล้ว - ของ Xavier Leroy หรือไม่? หรือว่าของ Peter Sewell และผู้ทำงานร่วมกัน?
วีเจย์ D

1
ไม่มีการเพิ่มประสิทธิภาพดังกล่าวเว้นแต่ว่าคุณจะ จำกัด คำถามของคุณ ในกรณีที่รุนแรงที่สุดคอมไพเลอร์ C สามารถนำทฤษฎีบทมาใช้อย่างลับๆในลำไส้ได้ ฉันคิดว่ามันไม่ชัดเจนว่าคุณหมายถึงอะไรโดย "คอมไพเลอร์ปกติ"
Andrej Bauer

คำตอบ:


5

บทความนี้โดย Yves Bertot, Benjamin Gr´egoire และ Xavier Leroy สร้างคอมไพเลอร์ที่ได้รับการปรับให้เหมาะสมที่สุดสำหรับภาษา C-like โดยยึดตามข้อกำหนด Coq บางส่วนของเทคโนโลยีนี้ถูกนำมาใช้เห็นได้ชัดในคอมไพเลอร์ C CompCert

วิธีการแบบมีโครงสร้างเพื่อพิสูจน์การเพิ่มประสิทธิภาพคอมไพเลอร์จากการวิเคราะห์ดาต้าโฟลว์

จะพิจารณาความถูกต้องของการเพิ่มประสิทธิภาพสองครั้งการแพร่กระจายอย่างต่อเนื่อง (CP) และการกำจัด subexpression ทั่วไป (CSE), ส่วนที่ 4 การเพิ่มประสิทธิภาพเหล่านี้มีความก้าวหน้ามากกว่าที่จะเชื่อมโยงกับคอมไพเลอร์ที่ไม่ใช่ Coq สำหรับภาษาเดียวกัน ดูเช่นแผนภูมิเปรียบเทียบนี้เมื่อเปรียบเทียบกับ gcc (คอมไพเลอร์ที่ใช้ Coq นั้นน่าจะช้ากว่าในการรวบรวมแม้ว่าจะไม่ค่อยมีการกล่าวถึง!)

มุมมองดั้งเดิมของ ConCert คือคอมไพเลอร์ส่วนใหญ่เขียนโดยตรงในภาษาสเปค Coq ในรูปแบบการทำงานอย่างหมดจด คอมไพเลอร์ที่สามารถเรียกใช้งานได้โดยการดึงรหัส Caml จากสเปคนี้โดยอัตโนมัติ

อย่างไรก็ตามในตอนท้ายของกระดาษพวกเขาทราบว่ามีการปรับแต่งคอมไพเลอร์ในคอมไพเลอร์จริงที่ไม่สามารถจำลองในกรอบของพวกเขา

การเพิ่มประสิทธิภาพที่ได้รับการปรับปรุงไม่ได้เป็นเพียงองค์ประกอบเดียวของการพิจารณาที่นี่อีกแง่มุมหนึ่งก็คือตรรกะการปรับให้เหมาะสมของคอมไพเลอร์สามารถอยู่ภายใต้ข้อบกพร่องที่ลึกซึ้งเนื่องจากลักษณะที่ซับซ้อน ในช่วงหลายปีที่ผ่านมาพบว่า gcc มีข้อผิดพลาดในการเพิ่มประสิทธิภาพเชิงตรรกะจำนวนมาก เช่นข้อผิดพลาด gcc?


3

ฉันสามารถพิสูจน์คุณสมบัติบางอย่าง (ที่รับประกันว่าจะเก็บไว้) สำหรับโปรแกรม (เช่นรูทีนย่อยนั้นไม่ใช่ผู้เข้าร่วมและไม่สามารถเรียกตัวเองได้) ที่อนุญาตให้ทำการปรับให้เหมาะสมที่มักไม่สามารถทำได้

มันเทียบเท่ากับการขยายเครื่องพิมพ์ดีดเพื่อให้คุณสมบัติบางอย่างของโปรแกรมไปยังเครื่องมือเพิ่มประสิทธิภาพ ฉันเชื่อว่า Tsuyoshi Ito นั้นถูกต้องและคุณอาจเข้าใจผิดเล็กน้อยเกี่ยวกับ Coq มันเป็นเครื่องมือที่ยอดเยี่ยมสำหรับการให้คอมไพเลอร์ที่ไม่มีข้อบกพร่อง แต่ในกรณีที่คุณอธิบายมันไม่ได้ให้พลังงานมากขึ้นสำหรับการวิเคราะห์แบบคงที่

สิ่งเดียวที่ฉันสามารถคิดได้เกี่ยวกับการเสริมสร้างการวิเคราะห์แบบคงที่ด้วย Coq คือการจัดเตรียมภาษาของคุณด้วยการยืนยันที่มีหลักฐานพิสูจน์ที่ผู้ใช้เขียน - หากคอมไพเลอร์เองจะถูกแปลเป็นภาษารวมถึงขนนกสำหรับการพิมพ์แบบไดนามิกและหากหลักฐานที่ผู้ใช้เขียนจะสามารถแปลงเป็นฟังก์ชันได้ก็จะเป็นไปได้ที่จะใช้ฟังก์ชั่นเหล่านั้นเป็นคุณสมบัติที่จำเป็นสำหรับบางประเภทย่อย - สิ่งนี้จะให้พลังงานแก่คอมไพเลอร์มากกว่า

อย่างไรก็ตามเท่าที่ฉันเห็นมันจะค่อนข้างมีประโยชน์สำหรับการเสริมสร้าง subtyping - เป็นการยากที่จะทำให้โปรแกรมเมอร์รู้ว่าคุณสมบัติใดในสถานที่ที่จะเป็นประโยชน์สำหรับเครื่องมือเพิ่มประสิทธิภาพ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.