มีใครใช้ Pottier และ Gauthier ของ polymorphic defunctionalization ในโมดูลคอมไพเลอร์หรือไม่?


15

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

อย่างไรก็ตามPottier และ Gauthierได้กำหนดอัลกอริทึม defunctionalization พิมพ์ polymorphic โดยใช้การพิมพ์ที่ซับซ้อนมากขึ้นที่เกี่ยวข้องกับ GADT ตอนนี้เมื่อได้รับการเข้ารหัสแล้วก็เป็นไปได้ที่จะเพิ่มเคส catch-all ให้เป็นประเภทข้อมูลแลมบ์ดาที่ไม่ใช่แท็ก แต่มีฟังก์ชั่นการสั่งซื้อที่สูงกว่า ซึ่งหมายความว่าเป็นไปได้ที่จะใช้การเข้ารหัสเพื่อทำหน้าที่เป็นโมดุลย์ต่อโมดูล

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

คำตอบ:


6

วิธีการหนึ่งอธิบายโดย

Georgios Fourtounis และ Nikolaos S. Papaspyrou 2013. สนับสนุนการรวบรวมแยกในคอมไพเลอร์ Defunctionalizing SLATE 2013

ตามที่ @ gasche กล่าวถึง:

วิธีการที่แตกต่างกันของปัญหาคือการพิจารณาว่าแต่ละโมดูลสามารถกำหนดประเภท "ฟังก์ชั่นการทำงานผิดปกติ" ของตัวเองและตัวกระจาย / ตัวจัดการ

nผม0<ผม<nn-ผม


4

ตอนนี้เมื่อได้รับการเข้ารหัสแล้วก็เป็นไปได้ที่จะเพิ่มเคส catch-all ให้เป็นประเภทข้อมูลแลมบ์ดาที่ไม่ใช่แท็ก แต่มีฟังก์ชั่นการสั่งซื้อที่สูงกว่า ซึ่งหมายความว่าเป็นไปได้ที่จะใช้การเข้ารหัสเพื่อทำหน้าที่เป็นโมดุลย์ต่อโมดูล

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

ฉันสามารถจินตนาการได้ว่ามีการใช้ "base case" ภายในโมดูล / โปรแกรมที่กำหนดสำหรับการเลือก defunctionalization: คุณจะมี Constructor เพิ่มเติมสำหรับประเภทฟังก์ชั่นการตรวจสอบที่ไม่ใช่แท็ก แต่ฝัง'a -> 'bฟังก์ชั่นทั้งหมดเท่านั้น ในตัวสร้างนี้แทนที่จะให้แท็ก reified จะป้องกันการทำงานของมัน

วิธีการที่แตกต่างกันของปัญหาคือการพิจารณาว่าแต่ละโมดูลสามารถกำหนดประเภท "ฟังก์ชั่นการทำงานผิดปกติ" ของตัวเองและตัวกระจาย / ตัวจัดการ ฟังก์ชั่นจากโมดูลM1จะมีประเภทM1.arrowและนำไปใช้โดยใช้M1.applyฯลฯ ในขณะที่ใช้งานได้ดีสำหรับการใช้งานครั้งแรกของฟังก์ชั่นฉันไม่ค่อยเห็นว่าคุณจะขยายไปยังฟังก์ชันลำดับสูงกว่าได้อย่างไร (ซึ่งไม่ควร ทราบว่าข้อโต้แย้งการทำงานของพวกเขามาจากที่ใด): หากคุณรวมฟังก์ชันกับโปรแกรมเลือกจ่ายงานคุณจะเข้าสู่ขอบเขตของการเรียกใช้ฟังก์ชันทางอ้อมอีกครั้ง

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

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