ทำไมในภาษาการเขียนโปรแกรมสมัยใหม่เกือบทุกภาษา (Go, Rust, Kotlin, Swift, Scala, Nim, Python เวอร์ชันล่าสุด) มักจะเกิดขึ้นหลังจากการประกาศตัวแปรเสมอและไม่ใช่มาก่อน?
หลักฐานของคุณมีข้อบกพร่องสองมุมมอง:
- มีภาษาโปรแกรมใหม่ ish ที่มีชนิดอยู่ข้างหน้าตัวระบุ ยกตัวอย่างเช่นC♯, D หรือ Ceylon
- การมีชนิดหลังจากตัวระบุไม่ใช่ปรากฏการณ์ใหม่มันกลับไปอย่างน้อย Pascal (ออกแบบในปี 1968–1969 ที่วางจำหน่ายในปี 1970) แต่จริงๆแล้วถูกใช้ในทฤษฎีประเภทคณิตศาสตร์ซึ่งเริ่มต้น ~ 1902 มันยังใช้ใน ML (1973), CLU (1974), Hope (1970s), Modula-2 (2520-2528), Ada (1980), Miranda (1985), Mirl (1985), Caml (1985), Eiffel (1985), Oberon (1986), Modula-3 (1986–1988) และ Haskell (1989)
Pascal, ML, CLU, Modula-2 และ Miranda ทั้งหมดเป็นภาษาที่มีอิทธิพลมากดังนั้นจึงไม่น่าแปลกใจที่รูปแบบการประกาศประเภทนี้ยังคงเป็นที่นิยม
ทำไมx: int = 42
ไม่int x = 42
? สิ่งหลังไม่สามารถอ่านได้มากกว่าในอดีตหรือไม่
การอ่านเป็นเรื่องของความคุ้นเคย โดยส่วนตัวแล้วฉันคิดว่าคนจีนไม่สามารถอ่านได้ แต่เห็นได้ชัดว่าคนจีนไม่ได้ ต้องเรียนปาสคาลในโรงเรียนขลุกอยู่กับไอเฟลF♯แฮสเค็ลล์และสกาล่าและเมื่อดูที่ TypeScript, Fortress, Go, Rust, Kotlin, Idris, Frege, Agda, ML, Ocaml, ... มันดูเป็นธรรมชาติอย่างสมบูรณ์สำหรับฉัน .
มันเป็นเพียงเทรนด์หรือมีเหตุผลที่มีความหมายจริงๆที่อยู่เบื้องหลังโซลูชันดังกล่าวหรือไม่?
ถ้ามันเป็นเทรนด์มันคงไม่เปลี่ยนแปลง: อย่างที่ฉันพูดไปมันย้อนกลับไปเป็นร้อยปีในวิชาคณิตศาสตร์
หนึ่งในข้อดีหลักของการมีประเภทหลังจากตัวระบุคือมันเป็นเรื่องง่ายที่จะออกจากประเภทถ้าคุณต้องการที่จะอนุมาน หากการประกาศของคุณมีลักษณะเช่นนี้:
val i: Int = 10
จากนั้นมันก็ไม่สำคัญที่จะละทิ้งประเภทและอนุมานได้ดังนี้:
val i = 10
โดยที่ถ้าประเภทมาก่อนตัวระบุเช่นนี้:
Int i = 10
จากนั้นจะเริ่มยากสำหรับ parser เพื่อแยกความแตกต่างนิพจน์จากการประกาศ:
i = 10
วิธีแก้ปัญหาที่นักออกแบบภาษามักจะเกิดขึ้นคือการแนะนำคำหลัก "ฉันไม่ต้องการเขียนประเภท" ที่จะต้องเขียนแทนประเภท:
var i = 10; // C♯
auto i = 10; // C++
แต่สิ่งนี้ไม่สมเหตุสมผลนัก: โดยทั่วไปคุณต้องเขียนประเภทที่ระบุว่าคุณไม่ได้เขียนประเภท ฮะ? มันจะง่ายกว่าและมีเหตุผลมากกว่าที่จะทิ้งมันไว้ แต่นั่นทำให้ไวยากรณ์ซับซ้อนขึ้นมาก
(และอย่าพูดถึงประเภทของฟังก์ชั่นตัวชี้ในซีด้วย)
นักออกแบบของหลายภาษาดังกล่าวได้ชั่งน้ำหนักในเรื่องนี้:
หมายเหตุ: นักออกแบบของ Ceylon บันทึกไว้ด้วยว่าทำไมพวกเขาจึงใช้ไวยากรณ์ประเภทคำนำหน้า :
คำนำหน้าแทนที่จะเป็นคำอธิบายประกอบประเภท postfix
ทำไมคุณถึงทำตาม C และ Java ในการใส่คำอธิบายประกอบประเภทก่อนแทนที่จะ Pascal และ ML ในการวางพวกเขาหลังจากชื่อประกาศ?
เพราะเราคิดแบบนี้:
shared Float e = ....
shared Float log(Float b, Float x) { ... }
อ่านง่ายกว่านี้มาก:
shared value e: Float = ....
shared function log(b: Float, x: Float): Float { ... }
และเราก็ไม่เข้าใจว่าใครจะคิดอย่างอื่นได้!
โดยส่วนตัวแล้วฉันพบว่า "การโต้เถียง" ของพวกเขามีความน่าเชื่อถือน้อยกว่าคนอื่นมาก