อัลกอริทึมการตรวจสอบประเภท


19

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

ฉันสนใจอัลกอริทึมการตรวจสอบประเภทที่ซับซ้อนโดยเฉพาะอย่างยิ่งในภาษาที่พิมพ์แบบคงที่ที่รู้จักกันอย่างกว้างขวางเช่น C ++, Java 5+, Scala หรืออื่น ๆ IE, อัลกอริทึมการตรวจสอบประเภทที่ไม่ง่ายมากเนื่องจากการพิมพ์ภาษาพื้นฐานง่าย ๆ (เช่น Java 1.4 และต่ำกว่า)

ฉันไม่สนใจภาษาที่เฉพาะเจาะจง X, Y หรือ Z ฉันสนใจในการตรวจสอบอัลกอริทึมโดยไม่คำนึงถึงภาษาที่พวกเขากำหนดเป้าหมาย หากคุณให้คำตอบเช่น "ภาษา L ที่คุณไม่เคยได้ยินเกี่ยวกับสิ่งที่พิมพ์อย่างยิ่งและการพิมพ์มีความซับซ้อนมีอัลกอริทึมการตรวจสอบประเภทที่ A, B และ C โดยการตรวจสอบ X และ Y โดยใช้อัลกอริทึม Z" หรือ " กลยุทธ์ X และ Y ที่ใช้สำหรับ Scala และตัวแปร Z ของ A ที่ใช้สำหรับ C # นั้นยอดเยี่ยมเพราะคุณสมบัติ R, S และ T ที่ทำงานในลักษณะนั้น "แล้วคำตอบก็ดี


3
บางทีคุณควรแก้ไขคำถามนี้เพื่อถามเกี่ยวกับการตรวจสอบประเภทของภาษาใดภาษาหนึ่งโดยเฉพาะ คำถามสไตล์ลิสต์แบบปลายเปิดนั้นไม่น่าเป็นไปได้สำหรับ SE (แม้ว่าเว็บไซต์นี้จะไม่มีนโยบายเกี่ยวกับเรื่องนั้น) นอกจากนี้: <type-system-elitist> ระบบชนิดของ Java นั้นไม่ซับซ้อน </type-system-elitist>
sepp2k

3
บางทีคำถามอาจได้รับการเรียบเรียงใหม่ให้มีความเฉพาะเจาะจงมากขึ้น แต่ฉันไม่คิดว่าควรปิด
Dave Clarke

1
@ sepp2k: ฉันรู้ว่ามันค่อนข้างกว้าง แต่จบด้วยวิธีนี้เพราะฉันไม่ต้องการ จำกัด ประโยชน์ของคำตอบ BTW ฉันไม่เข้าใจสิ่งที่คุณต้องการพูดด้วย "<type-system-elitist> ระบบประเภทของ Java นั้นไม่ซับซ้อน </type-system-elitist>" อันที่จริงแล้วระบบประเภท 1.4 และต่ำกว่าของ Java นั้นเรียบง่ายแต่ทว่า generics เล็กน้อยใน Java 5 นั้นมีความซับซ้อนมากขึ้น
Victor Stafusa

2
การขอหนึ่งภาษาใดภาษาหนึ่งจะทำให้คำถามไม่เหมาะสมสำหรับเว็บไซต์นี้มากขึ้น imho คำถามควรถามเทคนิคทั่วไป
กราฟิลส์

1
@Victor พื้นฐานเครื่องมือที่มีไวยากรณ์แอตทริบิวต์ คุณอาจจะไม่สามารถทำทุกสิ่งที่ชั่วร้ายที่คุณสามารถจินตนาการกับพวกเขา แต่พวกเขาเป็นจุดเริ่มต้นที่ดี
Raphael

คำตอบ:


13

การวิจัยส่วนใหญ่ไม่ได้เผยแพร่อัลกอริทึมการตรวจสอบประเภทจริงสำหรับภาษาการเขียนโปรแกรมแบบเต็มเป่า คุณจะพบ formalisations ของส่วนใหญ่ของระบบการพิมพ์สำหรับการเขียนโปรแกรมภาษาเต็มรูปแบบเช่นงานที่ทำโดยบางDrossopoulou และ Eisenbach สำหรับ Javaหรือทำงาน Nipkov et al, ใน c บ่อยขึ้นแม้ว่าคุณจะพบว่าระบบการพิมพ์สำหรับส่วนหลักบางส่วนของภาษา (เฟเธอร์เวท Java เป็นตัวอย่างหนึ่ง) หรือแนวคิดหลักของภาษาเช่นวิธีการอนุมานชนิดในท้องถิ่นของสกาล่า

ในการประชุมเช่น POPL และ ICFP คุณจะพบอัลกอริธึมการตรวจสอบหลายประเภทสำหรับระบบประเภทเฉพาะและแนวทางใหม่ ๆ เช่นการตรวจสอบประเภทสองทิศทางและสามทิศทาง

โดยทั่วไปคุณอาจจำเป็นต้องรู้เกี่ยวกับอัลกอริทึม Damas-Milner การอนุมานประเภทโลคอลการตรวจสอบประเภทสองทิศทางและสามทิศทางและขยายจากที่นั่นโดยทำตามการอ้างอิงในเอกสารและโดยใช้ Google scholar เพื่อค้นหาเอกสารที่อ้างถึง วิธีการอธิบาย นอกจากนี้ตามที่แนะนำข้างต้นการประชุมเช่น POPL, ICPF, ESOP และแม้แต่ ECOOP และ OOPSLA ก็จะมีเอกสารที่เกี่ยวข้องกับภารกิจของคุณ


Afaik ระบบชนิดของ Scala ได้รับการพัฒนาในโครงการวิจัยและได้รับการตีพิมพ์ดังนั้น คอมไพเลอร์ก็มีที่มาเปิดเช่นกัน ยังไม่ได้ดูอย่างใดอย่างหนึ่งแม้ว่า
กราฟิลส์

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

2

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

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

ค้นหาคำอธิบายและตัวอย่างในสไลด์ที่นี่ (บทที่ 5)


ใครบางคนมีการอ้างอิงที่ดีกว่า? ฉันเดาว่าฉันต้องซื้อ Dragonbook หรือ Wilhelm / Maurer สักวันหนึ่ง ...
Raphael

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