คำตอบสั้น ๆ : ไม่เพราะทัวริงเทียบเท่า
คำตอบที่ยาวนาน: ผู้ชายคนนี้กำลังหมุนรอบ ในขณะที่มันเป็นความจริงที่ระบบประเภท "จำกัด คุณให้กับชุดย่อย" สิ่งที่อยู่นอกชุดย่อยนั้นคือโดยนิยามสิ่งที่ไม่ทำงาน
ทุกสิ่งที่คุณสามารถทำได้ในภาษาการเขียนโปรแกรมทัวริงที่สมบูรณ์ (ซึ่งเป็นภาษาที่ออกแบบมาสำหรับการเขียนโปรแกรมวัตถุประสงค์ทั่วไปรวมถึงสิ่งอื่น ๆ ที่ไม่ได้เป็นแถบต่ำที่ค่อนข้างชัดเจนในการล้างและมีหลายตัวอย่างของระบบที่กลายเป็นทัวริง สมบูรณ์โดยไม่ตั้งใจ) คุณสามารถทำในภาษาโปรแกรมทัวริงที่สมบูรณ์อื่น ๆ สิ่งนี้เรียกว่า "ทัวริงเทียบเท่า" และมันหมายถึงสิ่งที่มันพูดเท่านั้น ที่สำคัญไม่ได้หมายความว่าคุณสามารถทำสิ่งอื่น ๆ ได้อย่างง่ายดายในภาษาอื่น - บางคนอาจแย้งว่านั่นเป็นจุดเริ่มต้นในการสร้างภาษาโปรแกรมใหม่ในตอนแรก: เพื่อให้คุณมีวิธีการที่ดีขึ้น สิ่งที่ภาษาที่มีอยู่ดูด
ยกตัวอย่างเช่นระบบพิมพ์แบบไดนามิกสามารถเลียนแบบที่ด้านบนของระบบประเภท OO แบบคงที่เพียงแค่ประกาศตัวแปรพารามิเตอร์และค่าส่งคืนทั้งหมดเป็นObject
ประเภทฐานแล้วใช้การสะท้อนเพื่อเข้าถึงข้อมูลเฉพาะภายในดังนั้นเมื่อคุณตระหนักถึงสิ่งนี้ คุณเห็นว่าไม่มีอะไรที่คุณสามารถทำได้ในภาษาไดนามิกที่คุณไม่สามารถทำได้ในภาษาคงที่ แต่การทำอย่างนั้นจะเป็นเรื่องใหญ่แน่นอน
ผู้ชายจากเครื่องหมายคำพูดนั้นถูกต้องว่าประเภทคงที่จะ จำกัด สิ่งที่คุณทำได้ แต่นั่นเป็นคุณสมบัติที่สำคัญไม่ใช่ปัญหา บรรทัดบนถนน จำกัด สิ่งที่คุณสามารถทำได้ในรถของคุณ แต่คุณคิดว่ามันเข้มงวดหรือมีประโยชน์หรือไม่? (ฉันรู้ว่าฉันไม่ต้องการขับรถบนถนนที่วุ่นวายและซับซ้อนซึ่งไม่มีอะไรบอกให้รถวิ่งไปในทิศทางตรงกันข้ามเพื่อไปทางด้านข้างและไม่มาที่ที่ฉันขับรถ!) โดยการตั้งค่ากฎที่อธิบายสิ่งที่ชัดเจน ถือว่าเป็นพฤติกรรมที่ไม่ถูกต้องและทำให้มั่นใจได้ว่ามันจะไม่เกิดขึ้นคุณลดโอกาสที่จะเกิดความผิดพลาดอย่างมาก
นอกจากนี้เขายังเปลี่ยนลักษณะของอีกด้านหนึ่งไปอย่างผิด ๆ ไม่ใช่ว่า "โปรแกรมที่น่าสนใจทั้งหมดที่คุณต้องการเขียนจะทำงานเป็นประเภท" แต่ "โปรแกรมที่น่าสนใจทั้งหมดที่คุณต้องการเขียนจะต้องมีประเภท" เมื่อคุณมีระดับความซับซ้อนเกินกว่าระดับที่กำหนดแล้วจะเป็นการยากมากที่จะรักษา codebase โดยไม่ต้องใช้ระบบพิมพ์เพื่อให้คุณเข้าแถวด้วยเหตุผลสองประการ
ก่อนอื่นเพราะรหัสที่ไม่มีคำอธิบายประกอบประเภทอ่านยาก พิจารณา Python ต่อไปนี้:
def sendData(self, value):
self.connection.send(serialize(value.someProperty))
คุณคาดหวังว่าข้อมูลจะดูเหมือนว่าระบบที่ปลายอีกด้านหนึ่งของการเชื่อมต่อได้รับอะไร และถ้ามันได้รับบางสิ่งที่ดูผิดปกติคุณจะรู้ได้อย่างไรว่าเกิดอะไรขึ้น?
value.someProperty
ทั้งหมดขึ้นอยู่กับโครงสร้างของ แต่มันดูเหมือนอะไร? คำถามที่ดี! สิ่งที่เรียกเป็นsendData()
? มันกำลังผ่านอะไร ตัวแปรนั้นมีลักษณะอย่างไร มันมาจากไหน ถ้าไม่ใช่ในพื้นที่คุณต้องติดตามประวัติทั้งหมดของvalue
การติดตามสิ่งที่เกิดขึ้น บางทีคุณกำลังส่งผ่านสิ่งอื่นที่มีsomeProperty
คุณสมบัติ แต่มันไม่ได้ทำในสิ่งที่คุณคิด
ตอนนี้เรามาดูด้วยคำอธิบายประกอบแบบที่คุณอาจเห็นในภาษา Boo ซึ่งใช้ไวยากรณ์ที่คล้ายกันมาก แต่พิมพ์แบบคงที่:
def SendData(value as MyDataType):
self.Connection.Send(Serialize(value.SomeProperty))
หากมีบางอย่างผิดปกติคุณก็จะสามารถแก้ไขข้อบกพร่องได้ง่ายขึ้น: ค้นหาคำจำกัดความของMyDataType
! นอกจากนี้โอกาสที่จะได้รับพฤติกรรมที่ไม่ดีเนื่องจากคุณผ่านประเภทที่เข้ากันไม่ได้บางอย่างที่มีคุณสมบัติที่ชื่อเดียวกันเปลี่ยนเป็นศูนย์โดยทันทีเพราะระบบประเภทจะไม่ยอมให้คุณทำผิดพลาด
เหตุผลที่สองสร้างขึ้นในครั้งแรก: ในโครงการขนาดใหญ่และซับซ้อนคุณน่าจะมีผู้สนับสนุนหลายคน (และถ้าไม่คุณกำลังสร้างมันขึ้นมาเองเป็นเวลานานซึ่งเป็นสิ่งเดียวกันลองอ่านโค้ดที่คุณเขียนเมื่อ 3 ปีก่อนถ้าคุณไม่เชื่อฉัน!) ซึ่งหมายความว่าคุณไม่รู้ว่าเกิดอะไรขึ้น ผ่านหัวของบุคคลที่เขียนเกือบทุกส่วนของรหัสในเวลาที่พวกเขาเขียนเพราะคุณไม่ได้อยู่ที่นั่นหรือจำไม่ได้ว่ามันเป็นรหัสของคุณเมื่อนานมาแล้ว การมีการประกาศประเภทจริงๆช่วยให้คุณเข้าใจว่าเจตนาของรหัสคืออะไร!
คนที่ชอบผู้ชายในคำพูดมักจะใช้ประโยชน์จากการพิมพ์แบบคงที่บ่อยๆว่า "ช่วยคอมไพเลอร์" หรือ "หมดประสิทธิภาพ" ในโลกที่ทรัพยากรฮาร์ดแวร์แทบไม่ จำกัด ทำให้สิ่งนี้มีความเกี่ยวข้องน้อยลงในแต่ละปีที่ผ่านมา แต่อย่างที่ฉันได้แสดงให้เห็นในขณะที่ประโยชน์เหล่านั้นมีอยู่จริงประโยชน์หลักอยู่ในปัจจัยมนุษย์โดยเฉพาะอย่างยิ่งการอ่านรหัสและการบำรุงรักษา (ประสิทธิภาพที่เพิ่มขึ้นเป็นโบนัสที่ดีอย่างแน่นอน!)