ถาม: ฉันมักจะได้ยินคำกล่าวอ้างว่าภาษาที่พิมพ์แบบไดนามิกนั้นมีประสิทธิภาพมากกว่าภาษาที่พิมพ์แบบคงที่ อะไรคือสาเหตุของการเรียกร้องนี้? "
นี่คือเหตุผลทางประวัติศาสตร์ หากคุณย้อนกลับไปสองสามทศวรรษภาษาแบบไดนามิกนั้นมีประสิทธิภาพมากกว่าภาษาแบบคงที่อย่างไม่ต้องสงสัย (ในขณะที่ช้ากว่ามาก) Perl เห็นได้ชัดว่ามีประสิทธิผลมากกว่า C มากถ้าคุณรู้ทั้งสองอย่าง แต่เมื่อเวลาผ่านไปภาษาต่างก็ยืมมามากจากกันและภาษาที่ใหม่กว่านั้นก็ลดช่องว่าง (ทั้งในด้านประสิทธิภาพและประสิทธิภาพ)
นี่คือบางจุดที่ควรพิจารณา:
การรวบรวมขยะ : การรวบรวมขยะเป็นการเพิ่มผลผลิตอย่างมาก ฉันเชื่อว่า Java เป็นภาษาแบบคงที่หลักแรกกับ GC ก่อนหน้านี้สแตติกหมายถึงการจัดการหน่วยความจำด้วยตนเองโดยทั่วไป (หมายเหตุ: ที่นี่และในต่อไปนี้ฉันกำลังพิจารณาเฉพาะภาษากระแสหลักมีภาษาทดลองและภาษาเฉพาะจำนวนมากซึ่งจะให้ตัวอย่างตอบโต้ทุกจุดที่ฉันทำ)
ความปลอดภัยของหน่วยความจำ : เป็นการปรับปรุงประสิทธิภาพการผลิตที่คุณไม่ต้องกังวลเกี่ยวกับการถ่ายภาพด้วยตัวคุณเอง ก่อนที่ภาษาสแตติก "ที่มีการจัดการ" เช่น Java โดยทั่วไปหมายถึงการเข้าถึงหน่วยความจำโดยตรง การดีบักยังเป็นส่วนหนึ่งของประสิทธิภาพการทำงานและการเข้าถึงหน่วยความจำที่ไม่ปลอดภัยอาจทำให้เกิดข้อบกพร่องที่ไม่ชัดเจน
ระบบประเภทที่ยุ่งยาก ก่อนที่จะมีการแนะนำประเภทพารามิเตอร์ (เช่นแม่แบบหรือชื่อสามัญ) ในภาษาคงที่ข้อ จำกัด ของระบบประเภทคงที่มักจะเป็นภาระ ตัวอย่างเช่นใน Java คุณต้องดาวน์สตรีมอย่างชัดเจนทุกครั้งที่คุณเลือกรายการจากคอลเล็กชัน ดังนั้นคุณจะได้รับค่าโสหุ้ยของนักแสดงและไม่มีความปลอดภัยประเภท พิจารณาว่าคอลเลกชันที่แพร่หลายอยู่ในการเขียนโปรแกรมนี้เป็นข้อเสียเปรียบที่สำคัญ
การประกาศประเภทของทุกอย่างเป็นการพิมพ์ซ้ำซ้อนจำนวนมาก แต่ด้วยการอนุมานแบบสมัยใหม่สิ่งนี้สามารถลดลงได้อย่างมาก
ห้องสมุดมาตรฐานขนาดใหญ่ Python โฆษณาอย่างมีชื่อเสียงในชื่อ "รวมแบตเตอรี่" เนื่องจากห้องสมุดมาตรฐานขนาดใหญ่ นี่เทียบกับ C ซึ่งมีไลบรารี่มาตรฐานที่เรียบง่ายมาก แต่ด้วยแพลตฟอร์มเช่น Java และ. net ไลบรารีมาตรฐานที่กว้างใหญ่กำลังกลายเป็นมาตรฐานและภาษาที่ใหม่กว่าอย่าง Scala และ F # กำลังสืบทอดสิ่งนี้ "ฟรี"
โครงสร้างข้อมูลชั้นหนึ่ง ภาษาไดนามิกเช่น Perl และ Python มีโครงสร้างข้อมูลชั้นหนึ่งในตัวเช่นรายการและแผนที่พร้อมทางลัดที่สะดวกสบายสำหรับการใช้งานทั่วไป เมื่อเทียบกับสิ่งนี้ C ไม่มีคอลเลกชันในตัวยกเว้นอาร์เรย์ขนาดคงที่
การปิดล้อมและแลมบ์ดา - โดยทั่วไปภาษาไดนามิกจะมีสิ่งนี้ตั้งแต่เริ่มต้น แต่ภาษาแบบสแตติกได้นำสิ่งนี้ไปใช้ Java ล่าสุด
REPLความสามารถในการทดสอบตัวอย่างโค้ดแบบโต้ตอบได้อย่างรวดเร็วนั้นเป็นประโยชน์อย่างมาก แต่ถึงแม้ว่าเครื่องมือ IDE เช่นหน้าต่าง "ทันที" ใน Visual Studio ภาษาคงที่สามารถเลียนแบบสิ่งนี้ได้ในระดับหนึ่ง
การใช้เครื่องมือขั้นสูง - นอกเหนือจากจุดข้างต้นที่ภาษาแบบคงที่ได้ใกล้ชิดกับความสะดวกสบายของภาษาแบบไดนามิกแล้วบรรณาธิการสมัยใหม่กำลังใช้ประโยชน์จากการวิเคราะห์แบบคงที่ในลักษณะที่ภาษาแบบไดนามิกมีการจับคู่ที่ยากลำบาก ตัวอย่างเช่นผู้แก้ไขสามารถจัดเตรียมการรีแฟคเตอร์อัตโนมัติที่ปลอดภัยสิ่งที่พูดไม่ได้อย่างเคร่งครัดเป็นภาษาไดนามิก
Bottom line: ในอดีตมันเป็นความจริง แต่วันนี้คำตอบคือการตัดที่ชัดเจนน้อยกว่า
ถาม: ดังนั้นสิ่งใดที่จะกล่าวถึงความสามารถในการผลิตด้วยการพิมพ์แบบไดนามิกที่เป็นข้อได้เปรียบของแบบจำลองประเภทเอง?
มันค่อนข้างยากที่จะแยกรูปแบบการพิมพ์แบบไดนามิกออกจากภาษาแบบไดนามิก แต่เป็นตัวอย่าง C # ได้นำคุณสมบัติแบบไดนามิกมากขึ้นเมื่อเวลาผ่านไปแม้ว่ามันจะเป็นแกนหลักของมันเป็นภาษาแบบคงที่ นี่เป็นข้อพิสูจน์ถึงประโยชน์ของแบบจำลองประเภทไดนามิก ตัวอย่าง:
Reflection
Reflection เป็นพื้นฐานของคุณสมบัติการพิมพ์แบบไดนามิก คุณตรวจสอบประเภทวัตถุที่ rater รันไทม์กว่าเวลารวบรวม เมื่อมันถูกนำมาใช้มันเป็นเรื่องขมวดคิ้ว แต่ใน C # การใช้งานของการสะท้อนจะแพร่หลายมากขึ้นตัวอย่างเช่น ASP.Net MVC ใช้การสะท้อนอย่างหนัก
คุณสมบัติ
แอตทริบิวต์เป็นตัวอย่างของการพิมพ์แบบไดนามิก คุณสามารถเพิ่มแอ็ตทริบิวต์โดยพลการให้กับคลาสในเวลาคอมไพล์แล้วตรวจสอบ ณ รันไทม์ (ผ่านการสะท้อนกลับ) และจัดการกับออบเจกต์ตาม บางอย่างเช่น MEP นั้นเป็นส่วนขยายของเฟรมเวิร์กที่ยึดตามโมเดลชนิดไดนามิก
Linq เป็น SQL, EF mv
หม้อแปลง Linq ต่างๆตรวจสอบคำสั่งเป็นวัตถุรันไทม์และสร้าง sql ได้ทันที มันไม่ได้มีพลังมากกว่าการตรวจสอบโค้ดตอนรันไทม์ CodeDom เป็นอีกด้านหนึ่งของเหรียญซึ่งสามารถสร้างรหัสที่รันไทม์
โรสลิน
โรสลินโดยทั่วไปดำเนินการeval
ซึ่งได้รับการพิจารณาเมื่อกำหนดคุณลักษณะของภาษาแบบไดนามิกอย่างแท้จริง
แบบไดนามิกdynamic
ชนิดเป็นคุณลักษณะแบบไดนามิกอย่างชัดเจนมากที่สุดใน C # และมีการโฆษณาที่จะทำให้การมีปฏิสัมพันธ์กับวัตถุภายนอกและภาษาที่เรียบง่ายและมีประสิทธิภาพมากขึ้น แต่มันยังใช้ใน Asp.net MVC เพื่อความสะดวก
ประโยชน์ของคุณสมบัติข้างต้นทั้งหมดแสดงให้เห็นว่าแบบจำลองแบบไดนามิกมีข้อได้เปรียบที่ชัดเจนแม้ในภาษาแบบคงที่ด้วยพารามิเตอร์ชนิดประเภทโครงสร้างและการอนุมานประเภท