ระบบพิมพ์ป้องกันข้อผิดพลาด
ระบบประเภทกำจัดโปรแกรมที่ผิดกฎหมาย พิจารณารหัสไพ ธ อนต่อไปนี้
a = 'foo'
b = True
c = a / b
ใน Python โปรแกรมนี้ล้มเหลว มันส่งข้อยกเว้น ในภาษาอย่าง Java, C #, Haskellไม่ว่าจะเป็นโปรแกรมทางกฎหมายก็ตาม คุณหลีกเลี่ยงข้อผิดพลาดทั้งหมดเนื่องจากไม่สามารถทำได้ในชุดโปรแกรมอินพุต
ในทำนองเดียวกันระบบประเภทที่ดีกว่าจะออกกฎข้อผิดพลาดเพิ่มเติม ถ้าเรากระโดดขึ้นไปสู่ระบบขั้นสูงแบบพิเศษเราสามารถพูดสิ่งนี้:
Definition divide x (y : {x : integer | x /= 0}) = x / y
ขณะนี้ระบบพิมพ์รับประกันว่าไม่มีข้อผิดพลาดหารด้วย 0
ข้อผิดพลาดประเภทใด
นี่คือรายการสั้น ๆ ของข้อผิดพลาดที่ระบบพิมพ์สามารถป้องกันได้
- ข้อผิดพลาดนอกช่วง
- การฉีด SQL
- ข้อสรุปทั่วไปเกี่ยวกับความปลอดภัย 2 ประการ (การตรวจสอบเรื่องมลทินคืออะไรในPerl )
- ข้อผิดพลาดนอกลำดับ (การลืมเรียก init)
- การบังคับให้ใช้ชุดย่อยของค่า (ตัวอย่างเช่นจำนวนเต็มมากกว่า 0 เท่านั้น)
ลูกแมวชั่วร้าย (ใช่มันเป็นเรื่องตลก)
- ข้อผิดพลาดการสูญเสียความแม่นยำ
- ข้อผิดพลาดของซอฟต์แวร์ transactional memory (STM) (ต้องมีความบริสุทธิ์ซึ่งต้องใช้ชนิดด้วย)
- generalizing 8 ควบคุมผลข้างเคียง
- ค่าคงที่ของโครงสร้างข้อมูล (ต้นไม้ไบนารีมีความสมดุลหรือไม่)
- ลืมข้อยกเว้นหรือโยนผิด
และจำไว้ว่านี่เป็นเวลารวบรวม ไม่จำเป็นต้องเขียนการทดสอบที่มีรหัสครอบคลุม 100% เพียงแค่ตรวจสอบข้อผิดพลาดในการพิมพ์คอมไพเลอร์ก็ทำเพื่อคุณ :)
กรณีศึกษา: แคลคูลัสแลมบ์ดาที่พิมพ์
Alright ให้ตรวจสอบที่ง่ายที่สุดของระบบการพิมพ์ทั้งหมดเพียงแค่พิมพ์แลมบ์ดาแคลคูลัส
โดยทั่วไปมีสองประเภทคือ
Type = Unit | Type -> Type
และเงื่อนไขทั้งหมดเป็นตัวแปรแลมบ์ดาหรือแอปพลิเคชัน จากสิ่งนี้เราสามารถพิสูจน์ได้ว่าโปรแกรมที่พิมพ์ออกมานั้นถูกยกเลิก ไม่เคยมีสถานการณ์ที่โปรแกรมจะค้างหรือวนซ้ำตลอดไป นี่ไม่สามารถพิสูจน์ได้ในแคลคูลัสแลมบ์ดาปกติเพราะมันไม่เป็นความจริง
ลองคิดดูสิเราสามารถใช้ระบบพิมพ์เพื่อรับประกันว่าโปรแกรมของเราจะไม่วนซ้ำตลอดไปใช่ไหม?
ทางอ้อมเป็นแบบไดนามิก
ระบบประเภทไดนามิกสามารถให้การรับประกันเหมือนกันกับระบบประเภทสแตติก แต่ในขณะรันไทม์แทนที่จะเป็นเวลารวบรวม จริงๆแล้วเนื่องจากเป็น runtime คุณจึงสามารถให้ข้อมูลเพิ่มเติมได้ คุณสูญเสียการรับประกันบางส่วนโดยเฉพาะอย่างยิ่งเกี่ยวกับคุณสมบัติคงที่เช่นการยกเลิก
ดังนั้นประเภทไดนามิกไม่ได้ออกกฎบางโปรแกรม แต่จะกำหนดเส้นทางโปรแกรมที่ผิดรูปแบบไปสู่การกระทำที่กำหนดไว้อย่างดีเช่นการโยนข้อยกเว้น
TLDR
ดังนั้นความยาวและความสั้นของมันก็คือระบบประเภทนั้นจะออกกฎบางโปรแกรม หลายโปรแกรมแตกในทางใดทางหนึ่งด้วยระบบประเภทเราหลีกเลี่ยงโปรแกรมที่เสียหายเหล่านี้