ทำไมภาษาที่พิมพ์อย่างอ่อนยังถูกพัฒนาอย่างแข็งขัน?


17

ฉันสงสัยว่าทำไมภาษาที่พิมพ์อย่างอ่อนยังคงได้รับการพัฒนาอย่างแข็งขัน ตัวอย่างเช่นผลประโยชน์อย่างใดอย่างหนึ่งสามารถดึงออกมาจากความสามารถในการเขียน

$someVar = 1;
(...)  // Some piece of code
$someVar = 'SomeText';

แทนที่จะใช้เวอร์ชั่นที่แตกต่างและพิมพ์ได้อย่างหนักแน่น

int someInt = 1;
(...)
string SomeString = 'SomeText';

เป็นความจริงที่คุณต้องประกาศตัวแปร aditional ในตัวอย่างที่สอง แต่มันเจ็บจริงหรือ ภาษาทุกภาษาไม่ควรพยายามพิมพ์ดีดอย่างแรงเพราะบังคับให้พิมพ์ปลอดภัยในเวลารวบรวมจึงหลีกเลี่ยงข้อผิดพลาดบางประการในการคัดเลือกพิมพ์?


9
"พิมพ์อย่างรุนแรง" ไม่ใช่คำที่กำหนดชัดเจน ส่วนใหญ่หมายถึง "คุณไม่สามารถล้มล้างระบบประเภท" มันเป็นฉากกับสิ่งที่คุณอธิบายข้างต้นซึ่งอาจแฝงกับการพิมพ์รายการหรือคงที่เมื่อเทียบกับการพิมพ์แบบไดนามิก
Frank Shearar

10
สิ่งที่ฉันหายไปที่ย้ายสิ่งนี้จากเหยื่อล่อด้วยคำถามที่เกี่ยวข้องอย่างใกล้ชิดหลายคำถามซ้ำกัน (เพียงค้นหา SackOverflow สำหรับคำถามที่กล่าวถึงการพิมพ์แบบคงที่และไดนามิกในแท็ก) เป็นคำถามที่ถูกกฎหมาย

1
มีข้อดีและข้อเสียของภาษาที่พิมพ์ทั้งแบบคงที่และแบบไดนามิก ภาษาที่พิมพ์แบบไดนามิกนั้นให้การพัฒนาหรือสร้างต้นแบบอย่างรวดเร็ว (ด้วยเหตุนี้ "ภาษาสคริปต์" มักจะถูกพิมพ์แบบไดนามิก) ในขณะที่ภาษาที่พิมพ์แบบคงที่ (arguably) นั้นง่ายต่อการบำรุงรักษาและขยายเมื่อเติบโตเป็นโครงการขนาดใหญ่และซับซ้อน
Charles Salvia

6
ตัวอย่างแรกเป็นบิตเช่น Python โดยที่ตัวแปรไม่มีชนิดที่ประกาศไว้ อย่างไรก็ตาม Python เป็นภาษาที่มีการพิมพ์อย่างมากเนื่องจากวัตถุ - ตัวเอง - มีประเภทที่แทบจะเป็นไปไม่ได้ที่จะเปลี่ยนหรือบีบบังคับ ฉันคิดว่าการใช้คำศัพท์ในทางที่ผิดทำให้คำถามนี้ยากที่จะตอบ
S.Lott

1
@delnan ความจริงที่ว่าคำถามนี้ไปสองคำตอบที่สมเหตุสมผลและไม่ได้ตกอยู่ในสงครามเปลวไฟช่วย
อดัมเลียร์

คำตอบ:


25

การพิมพ์ที่แข็งแกร่ง / อ่อนแอและการพิมพ์แบบสแตติก / ไดนามิกเป็นมุมฉาก

Strong / อ่อนแอนั้นเกี่ยวกับว่าชนิดของค่าสำคัญหรือไม่ ในภาษาที่มีการพิมพ์น้อยคุณสามารถใช้สองสายที่เต็มไปด้วยตัวเลขและทำการเพิ่มจำนวนเต็ม ในภาษาที่พิมพ์อย่างรุนแรงนี้เป็นข้อผิดพลาด (เว้นแต่คุณจะแปลงหรือแปลงค่าเป็นประเภทที่ถูกต้องก่อน) การพิมพ์ที่เข้ม / อ่อนไม่ได้เป็นแบบขาวดำ ภาษาส่วนใหญ่ไม่เข้มงวด 100% หรืออ่อนแอ 100%

การพิมพ์สแตติก / ไดนามิกนั้นเกี่ยวกับว่าชนิดจะเชื่อมโยงกับค่าหรือตัวระบุ ในภาษาที่พิมพ์แบบไดนามิกคุณสามารถกำหนดค่าให้กับตัวแปรใด ๆ โดยไม่คำนึงถึงชนิด การพิมพ์แบบสแตติกกำหนดประเภทสำหรับตัวระบุทุกตัวและการกำหนดจากประเภทที่แตกต่างกันอาจเป็นข้อผิดพลาดหรือส่งผลให้เกิดการส่งโดยนัย บางภาษาใช้วิธีไฮบริดเพื่อให้สามารถประกาศประเภทแบบคงที่เช่นเดียวกับตัวระบุที่ไม่พิมพ์ ('ตัวแปร') นอกจากนี้ยังมีการอนุมานประเภทซึ่งเป็นกลไกที่เป็นไปได้ในการพิมพ์แบบคงที่โดยไม่ต้องประกาศประเภทของทุกอย่างชัดเจนโดยการรวบรวมคอมไพเลอร์คิดประเภท (Haskell ใช้สิ่งนี้อย่างกว้างขวาง C # เปิดเผยผ่านvarคำหลัก)

การเขียนโปรแกรมแบบไดนามิกที่อ่อนแอช่วยให้แนวทางปฏิบัติ; ภาษาไม่ได้อยู่ในแนวทางของคุณตลอดเวลา แต่มันจะไม่ก้าวเข้ามาเมื่อคุณถ่ายภาพด้วยตัวเอง ในทางตรงกันข้ามการพิมพ์แบบสเตติกที่แข็งแกร่งจะผลักดันโปรแกรมเมอร์ให้แสดงความคาดหวังบางอย่างเกี่ยวกับค่าในโค้ดอย่างชัดเจนในวิธีที่ทำให้คอมไพเลอร์หรือล่ามตรวจจับข้อผิดพลาดได้ ด้วยระบบการพิมพ์ที่ดีโปรแกรมเมอร์สามารถกำหนดสิ่งที่สามารถและไม่สามารถทำสิ่งที่มีคุณค่าได้และหากเกิดอุบัติเหตุคนบางคนพยายามที่จะไม่พึงประสงค์บางอย่างระบบการพิมพ์ก็มักจะสามารถป้องกันมันได้


ในภาษาที่พิมพ์อย่างอ่อนแออย่างเช่น HyperTalk ที่มีโอเปอเรเตอร์แยกต่างหากสำหรับการต่อสตริงและนอกจากนี้ (เช่นสมมติว่ามี&การต่อกัน) การดำเนินการ"12"+3หรือ45 & "6"ไม่มีความคลุมเครือ (พวกเขาคำนวณ 15 และ "456" ตามลำดับ) ในภาษาที่มีการพิมพ์มากขึ้นตัวดำเนินการ "+" สามารถโอเวอร์โหลดอย่างปลอดภัยสำหรับการต่อสตริงและการเพิ่มตัวเลขโดยไม่ทำให้เกิดความกำกวมเนื่องจากการดำเนินการกับสตริงและตัวเลขจะถูกห้าม ปัญหาเกิดขึ้นเมื่อภาษาระบุเล็บไม่ลงทั้งประเภทและการดำเนินการที่ต้องดำเนินการ
supercat

4

1 == "TRUE"พิมพ์อ่อนแอมากขึ้นตามสายของ ส่วนนี้ในวิกิพีเดียแสดงให้เห็นถึงความแตกต่างอย่างชัดเจน

โปรดทราบว่าไม่มีตัวอย่างจากวิกิพีเดียที่พิมพ์แบบคงที่ซึ่งเป็นสิ่งที่คุณอ้างถึงในตัวอย่างที่สองของคุณ

ดังนั้นหากคำถามคือทำไมคนใช้ภาษาที่พิมพ์แบบไดนามิกแล้วคำตอบคือ: ระบบประเภทคงที่ทำให้คุณมีข้อ จำกัด หลายคนไม่เคยทำงานกับระบบพิมพ์แบบคงที่ซึ่งทำให้พวกเขาสรุปได้ว่าข้อเสียของการพิมพ์แบบคงที่มีมากกว่าผลประโยชน์


0

ภาษาประเภทที่อ่อนแอยังคงพัฒนาอยู่เพราะผู้คนใช้พวกเขาและชอบพวกเขา หากคุณไม่ชอบการพิมพ์ที่ไม่อ่อนอย่าใช้ภาษาที่พิมพ์ง่าย ประกาศว่าบางสิ่งเป็นหนทางเดียวที่แท้จริงและทุกคนควรทำในหนทางเดียวที่ไม่สนใจความซับซ้อนของโลก


0

ภาษาทุกภาษาไม่ควรพยายามพิมพ์ดีดอย่างแรงเพราะบังคับให้พิมพ์ปลอดภัยในเวลารวบรวมจึงหลีกเลี่ยงข้อผิดพลาดบางประการในการคัดเลือกพิมพ์?

ไม่จำเป็น. Learning Objective-C: Primerตอบคำถามนั้นโดยตรงในบริบทของ Objective-C:

ตัวแปรที่พิมพ์น้อยจะใช้บ่อยสำหรับสิ่งต่าง ๆ เช่นคลาสของคอลเลกชันซึ่งอาจไม่ทราบประเภทของวัตถุในคอลเลกชันที่แน่นอน หากคุณคุ้นเคยกับการใช้ภาษาที่พิมพ์อย่างรุนแรงคุณอาจคิดว่าการใช้ตัวแปรที่พิมพ์อย่างอ่อนจะทำให้เกิดปัญหา แต่จริง ๆ แล้วพวกเขาให้ความยืดหยุ่นอย่างมากและให้ความยืดหยุ่นมากขึ้นในโปรแกรม Objective-C

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.