คอมไพเลอร์สำหรับประเภทที่ขึ้นต่อกันนั้นหนักกว่าผู้บุกรุกหรือไม่?


12

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

ดังนั้น

  • ความไร้เดียงสาของฉันถูกไหม
  • หากถูกต้องตัวอย่าง / แหล่งข้อมูลเกี่ยวกับการใช้ภาษาที่ตรวจสอบแบบสแตติกสนับสนุนประเภทที่ขึ้นกับอะไรบ้าง

ไม่ได้เนื่องจากคุณสามารถลดปัญหาการคอมไพล์ประเภทพึ่งพาเป็นปัญหาที่ทราบ: (1) ตรวจสอบชนิดโปรแกรมโดยใช้ล่าม; (2) แตกโปรแกรมออกเป็น OCaml / Haskell / อะไรก็ตาม (3) คอมไพล์โดยใช้ocamloptหรือ GHC :-) (นี่คือวิธี Coq และ Agda โดยวิธี.)
xrq

คำตอบ:


13

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

นี่คือวิธีการที่ดำเนินการโดย Edwin Brady ทีนี้นี่เป็นแนวคิดที่ง่ายขึ้น แต่มันจะเสียข้อได้เปรียบด้านความเร็วของการรวบรวมเมื่อทำการตรวจสอบประเภท สิ่งนี้ได้รับการกล่าวถึงในหลาย ๆ มารยาท

ก่อนอื่นเราสามารถนำเครื่องเสมือนจริงมาใช้ซึ่งจะรวบรวมเงื่อนไขต่าง ๆ เป็นรหัสไบต์ทันทีเพื่อทำการตรวจสอบการแปลง นี้เป็นผู้อยู่เบื้องหลังความคิดที่vm_computeนำมาใช้ใน Coq โดยเบนจามิน Gregoire เห็นได้ชัดว่ามีวิทยานิพนธ์นี้โดย Dirk Kleeblatt ในเรื่องที่แน่นอนนี้ แต่ลงรหัสเครื่องจริงมากกว่าเครื่องเสมือน

สองหนึ่งอาจสร้างรหัสในภาษาธรรมดามากขึ้นซึ่งเมื่อดำเนินการตรวจสอบการแปลงทั้งหมดที่จำเป็นในการพิมพ์ - ตรวจสอบโปรแกรมพิมพ์ขึ้นอยู่กับ ซึ่งหมายความว่าเราสามารถใช้ Haskell พูดเพื่อตรวจสอบโมดูล Agda รหัสสามารถรวบรวมและเรียกใช้และถ้ายอมรับรหัสในภาษาประเภทพึ่งพาสามารถสันนิษฐานว่าเป็นประเภทที่ดี (ยกเว้นการใช้งานและข้อผิดพลาดคอมไพเลอร์) ผมเคยได้ยินวิธีนี้แนะนำโดยครั้งแรกMathieu Boesflug

* * * *


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

2
โซลูชัน 2 และ 3 แก้ไขปัญหานี้: คุณรวบรวมรหัสที่ตรวจสอบความพิมพ์ดีดได้ดี (และโดยเฉพาะอย่างยิ่งทำการแปลงประเภท) ข้อสังเกตที่สองของฉันคือคุณต้องการเรียกใช้โค้ดที่พิมพ์ได้จริงในบางสถานการณ์ (ดู Idris, Ur / Web)
ดี้

1
อีกทั้งในระดับหนึ่งโซลูชัน 1 ก็จัดการกับมันเช่นกันโดยการทำให้เส้นแบ่งระหว่างล่ามและคอมไพเลอร์เบลอ
ดี้

1
ฉันสงสัยว่าเทคนิคการฉายภาพอนาคตสามารถใช้เพื่อเร่งล่ามได้หรือไม่
สตีเวนชอว์

1
สิ่งเดียวที่ฉันเห็นคือ Unison unisonweb.org/2017-10-13/scala-world.html
Steven Shaw

10

วิทยานิพนธ์ปริญญาเอกของ Edwin Brady สรุปวิธีสร้างคอมไพเลอร์สำหรับภาษาการเขียนโปรแกรมที่พึ่งพาได้ ฉันไม่ใช่ผู้เชี่ยวชาญ แต่ฉันว่ามันไม่ยากกว่าการใช้คอมไพเลอร์อย่าง System F หลักการหลายข้อนั้นค่อนข้างคล้ายกันและบางส่วนก็เหมือนกัน (เช่นการคอมไพล์ Supercombinator) วิทยานิพนธ์ครอบคลุมประเด็นอื่น ๆ อีกมากมาย

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