ฉันมักจะมองว่ามันเป็นเรื่องของความสะดวกสบายมากกว่าที่เกี่ยวกับว่าอัลกอริทึมสามารถหรือไม่สามารถแสดงได้ทั้งหมด ถ้าฉันต้องการเรียกใช้โปรแกรมเช่นโปรแกรมที่ประดิษฐ์โดยมิทเชลฉันจะเขียนโปรแกรมจำลองเครื่องทัวริงที่เหมาะสมในภาษาที่พิมพ์แบบคงที่
เคล็ดลับกับระบบแบบสแตติกคือให้ความยืดหยุ่นที่เหมาะสมสำหรับกรณีที่ความยืดหยุ่นช่วยให้คุณสามารถเขียนโค้ดที่สามารถบำรุงรักษาได้ง่ายขึ้น
ต่อไปนี้เป็นตัวอย่างของเทคนิคการจัดโครงสร้างโปรแกรมที่บางครั้งคิดว่าง่ายต่อการจัดการในแบบไดนามิกมากกว่าภาษาที่พิมพ์แบบคงที่
ยาสามัญและภาชนะบรรจุ
ในภาษาที่พิมพ์แบบสแตติกก่อนML (c. 1973) และCLU (c. 1974) มันไม่ยากที่จะสร้างสายอักขระสีแดง - ดำต้นไม้ต้นแดง - ดำจำนวนเต็มต้นไม้สีแดง - ดำลอยหรือ Foo
ต้นไม้แดงดำขององค์ประกอบของประเภทที่เฉพาะเจาะจง อย่างไรก็ตามมันเป็นเรื่องยาก (อาจเป็นไปไม่ได้) ในการสร้างการใช้งานครั้งเดียวของต้นไม้สีแดงดำที่ถูกตรวจสอบทั้งแบบคงที่และสามารถจัดการกับชนิดข้อมูลใด ๆ เหล่านี้ได้ วิธีแก้ไขปัญหาคือ (1) แยกระบบประเภทออกมาอย่างสมบูรณ์ (ตัวอย่างเช่น: โดยใช้void *
ใน C), (2) เขียนตัวประมวลผลมาโครตัวเองก่อนแล้วจึงเขียนมาโครที่สร้างรหัสสำหรับแต่ละประเภทที่คุณต้องการหรือ (3) ใช้วิธี Lisp / Smalltalk (และ Java) ในการตรวจสอบชนิดของสารสกัด วัตถุแบบไดนามิก
ML และ CLU แนะนำแนวคิดของประเภทพารามิเตอร์ตามลำดับ (แบบคงที่) ที่สรุปและประกาศอย่างชัดเจนซึ่งช่วยให้คุณสามารถเขียนประเภทคอนเทนเนอร์แบบทั่วไป
ความหลากหลายย่อย
ในภาษาที่พิมพ์แบบสแตติกก่อนSimula67 (c. 1967) และHope (c. 1977) มันเป็นไปไม่ได้ที่ทั้งสองจะทำการส่งข้อมูลแบบไดนามิกและตรวจสอบแบบคงที่ว่าคุณครอบคลุมทุกประเภทย่อย หลายภาษามีรูปแบบของสหภาพที่ติดแท็กบางรูปแบบแต่เป็นความรับผิดชอบของโปรแกรมเมอร์ที่จะต้องตรวจสอบให้แน่ใจว่าข้อความcase
หรือswitch
ข้อความหรือตารางการข้ามของพวกเขาครอบคลุมทุกแท็กที่เป็นไปได้
ภาษาตามโมเดล Simula (C ++, Java, C #, Eiffel) ให้คลาสนามธรรมพร้อมคลาสย่อยที่คอมไพเลอร์สามารถตรวจสอบว่าคลาสย่อยแต่ละคลาสใช้วิธีการทั้งหมดที่ประกาศโดยคลาสพาเรนต์ ภาษาที่ตามหลังโมเดลหวัง (ตัวแปร ML ทั้งหมดจาก SML / NJ ถึง Haskell) มีชนิดย่อยเชิงพีชคณิตที่คอมไพเลอร์สามารถตรวจสอบว่าทุกtypecase
คำสั่งครอบคลุมประเภทย่อยทั้งหมด
การปะแก้ของลิงและการเขียนโปรแกรมเชิงแนว
ระบบประเภทไดนามิกทำให้เทคนิคการสร้างต้นแบบที่หลากหลายง่ายขึ้นมาก ในภาษาที่ประเภทถูกแสดงด้วยแผนที่แฮชจากสตริงไปยังฟังก์ชั่น (เช่น Python, Javascript, Ruby) มันค่อนข้างง่ายที่จะเปลี่ยนพฤติกรรมของทุกโมดูลทั่วโลกที่อาศัยประเภทเฉพาะเพียงแค่ปรับเปลี่ยนแผนที่แบบไดนามิกที่แสดงว่า ชนิด
ในขณะที่มีวิธีการที่ชัดเจนในการใช้การปะแก้ลิงเพื่อทำให้โปรแกรมยากต่อการบำรุงรักษา แต่ก็มีวิธีที่มันสามารถใช้สำหรับ "ดี" จริง ๆ แทนที่จะเป็น "ความชั่วร้าย" โดยเฉพาะอย่างยิ่งกับการเขียนโปรแกรมที่มุ่งเน้นด้านหนึ่งสามารถใช้การปะของลิงเช่นเทคนิคในการทำสิ่งต่าง ๆ เช่นปรับเปลี่ยนชนิดไฟล์ให้ชี้ไปที่ระบบไฟล์เสมือนจริงอนุญาตให้สร้างโครงสร้างพื้นฐานการทดสอบหน่วยสำหรับ "ฟรี" หรือแก้ไขข้อยกเว้นแบบง่าย ๆ พิมพ์ข้อความบันทึกทุกครั้งที่ตรวจพบว่ามีการดีบั๊กได้ดีขึ้น
แตกต่างจาก Generics และ Subtype Polymorphism ที่แนวคิดการตรวจสอบแบบสแตติกที่สำคัญมีอยู่ในปี 1970 การตรวจสอบแบบคงที่สำหรับการเขียนโปรแกรมเชิงลักษณะคือ (ฉันคิดว่า) พื้นที่การวิจัยเชิงรุก ฉันไม่รู้อะไรมากเกี่ยวกับเรื่องนี้ยกเว้นว่ามีภาษาที่เรียกว่าAspectJมาตั้งแต่ปี 2544