วลีเช่น "การพิมพ์แบบคงที่" และ "การพิมพ์แบบไดนามิก" ถูกขว้างไปรอบ ๆ และผู้คนมักจะใช้คำจำกัดความที่แตกต่างกันอย่างละเอียดดังนั้นเรามาเริ่มต้นด้วยการชี้แจงสิ่งที่เราหมายถึง
พิจารณาภาษาที่มีประเภทสแตติกที่ตรวจสอบ ณ เวลารวบรวม แต่บอกว่าข้อผิดพลาดประเภทสร้างเพียงคำเตือนที่ไม่ร้ายแรงและที่รันไทม์ทุกอย่างจะพิมพ์เป็ด ประเภทสแตติกเหล่านี้มีไว้เพื่อความสะดวกของโปรแกรมเมอร์เท่านั้นและไม่ส่งผลกระทบต่อ codegen นี่แสดงให้เห็นว่าการพิมพ์แบบสแตติกไม่ได้กำหนดข้อ จำกัด ไว้ด้วยตัวเองและไม่ได้เกิดขึ้นพร้อมกันกับการพิมพ์แบบไดนามิก (Objective-C เป็นจำนวนมากเช่นนี้)
แต่ระบบแบบสแตติกส่วนใหญ่จะไม่ทำงานในลักษณะนี้ มีคุณสมบัติทั่วไปสองอย่างของระบบชนิดสแตติกที่สามารถกำหนดข้อ จำกัด ได้:
คอมไพเลอร์อาจปฏิเสธโปรแกรมที่มีข้อผิดพลาดประเภทคงที่
นี่เป็นข้อ จำกัด เนื่องจากโปรแกรมที่ปลอดภัยหลายประเภทจำเป็นต้องมีข้อผิดพลาดประเภทคงที่
ตัวอย่างเช่นฉันมีสคริปต์ Python ที่ต้องการเรียกใช้เป็นทั้ง Python 2 และ Python 3 บางฟังก์ชันเปลี่ยนประเภทพารามิเตอร์ระหว่าง Python 2 และ 3 ดังนั้นฉันจึงมีรหัสดังนี้:
if sys.version_info[0] == 2:
wfile.write(txt)
else:
wfile.write(bytes(txt, 'utf-8'))
ตัวตรวจสอบชนิดคงที่ Python 2 จะปฏิเสธรหัส Python 3 (และในทางกลับกัน) แม้ว่ามันจะไม่ถูกดำเนินการ โปรแกรมประเภทปลอดภัยของฉันมีข้อผิดพลาดประเภทคงที่
อีกตัวอย่างพิจารณาโปรแกรม Mac ที่ต้องการทำงานบน OS X 10.6 แต่ใช้ประโยชน์จากฟีเจอร์ใหม่ใน 10.7 วิธี 10.7 นั้นอาจจะมีหรือไม่มีอยู่ตอนรันไทม์และสำหรับฉันมันเป็นโปรแกรมเมอร์ที่จะตรวจจับพวกมัน ตัวตรวจสอบชนิดแบบคงที่ถูกบังคับให้ปฏิเสธโปรแกรมของฉันเพื่อรับรองความปลอดภัยประเภทหรือยอมรับโปรแกรมพร้อมกับความเป็นไปได้ในการสร้างข้อผิดพลาดประเภท (ฟังก์ชันขาดหายไป) ที่รันไทม์
การตรวจสอบชนิดสแตติกสันนิษฐานว่าสภาพแวดล้อมรันไทม์มีการอธิบายอย่างเพียงพอโดยข้อมูลเวลารวบรวม แต่การทำนายอนาคตนั้นเต็มไปด้วยอันตราย!
นี่คือข้อ จำกัด อีกหนึ่งข้อ:
คอมไพเลอร์อาจสร้างรหัสที่ถือว่าเป็นประเภทรันไทม์เป็นประเภทคงที่
สมมติว่าประเภทคงที่คือ "ถูกต้อง" ให้โอกาสมากมายสำหรับการเพิ่มประสิทธิภาพ แต่การเพิ่มประสิทธิภาพเหล่านี้สามารถ จำกัด ตัวอย่างที่ดีคือวัตถุ proxy เช่น remoting สมมติว่าคุณต้องการให้วัตถุพร็อกซีในพื้นที่ที่ส่งต่อวิธีการร้องขอไปยังวัตถุจริงในกระบวนการอื่น มันจะดีถ้าพร็อกซี่เป็นแบบทั่วไป (เพื่อให้สามารถปลอมแปลงเป็นวัตถุใด ๆ ) และแบบโปร่งใส (เพื่อให้โค้ดที่มีอยู่ไม่จำเป็นต้องรู้ว่ามันกำลังคุยกับพร็อกซี) แต่เมื่อต้องการทำเช่นนี้คอมไพเลอร์ไม่สามารถสร้างรหัสที่ถือว่าสแตติกชนิดนั้นถูกต้องเช่นโดยการเรียกเมธอดแบบสแตติกแบบคงที่เนื่องจากจะล้มเหลวหากวัตถุนั้นเป็นพร็อกซีจริง ๆ
ตัวอย่างของการใช้งานในระยะไกลเช่นNSXPCConnectionหรือObjic TransparentProxyของ ObjC (ซึ่งการติดตั้งจำเป็นต้องมีการเปลี่ยนแปลงเล็กน้อยในรันไทม์ - ดูที่นี่สำหรับการอภิปราย)
เมื่อ codegen ไม่ได้ขึ้นอยู่กับประเภทคงที่และคุณมีสิ่งอำนวยความสะดวกเช่นการส่งต่อข้อความคุณสามารถทำสิ่งดีๆมากมายกับวัตถุพร็อกซีการดีบักและอื่น ๆ
ดังนั้นนี่คือตัวอย่างบางส่วนของสิ่งที่คุณสามารถทำได้หากคุณไม่จำเป็นต้องใช้ตัวตรวจสอบชนิด ข้อ จำกัด ไม่ได้ถูกกำหนดโดยชนิดสแตติก แต่โดยการตรวจสอบชนิดสแตติกที่บังคับใช้