I Finally Understand Static vs. Dynamic Typing and You Will Too!
19-Dec-17
คัมภีร์เทพ IT
See the original english version Click here!
บทความนี้เป็นบทความของคุณ JBallin ที่ได้เขียนไว้เกี่ยวกับเรื่องของ “Type” ทั้งแบบ Static และ Dynamic สำหรับใครที่ยังไม่เข้าใจหรืออยากรู้ ลองอ่านบทความนี้ได้ครับ เพราะเขาบอกว่าขนาดตัวเขาเองยังสามารถทำความเข้าใจได้เลย เชื่อว่า คนอื่นๆ ก็น่าจะเข้าใจด้วยเช่นกัน
Compiled กับ Interpreted
เมื่อ Source Code ถูกแปล
- Source Code: Code ที่ถูกกำหนด Type ลงในคอมพิวเตอร์โดยมนุษย์
- Translation: การแปลง Source Code ไปเป็นสิ่งที่คอมพิวเตอร์สามารถเข้าใจได้ (เช่น machine code)
- Run-Time: ระยะเวลาที่โปรแกรม Run คำสั่ง (หลังจากการ Compile ในกรณีมีการ Compile)
- Compiled Language: Code จะถูกแปลก่อน Run-Time
- Interpreted Language: Code จะถูกแปลในระหว่างการ Execute
Type
เมื่อ Type ถูกตรวจสอบ
สมมติใช้ “3” + 5 ซึ่งถือว่าเป็น Type ที่เป็นคนละประเภทกัน หากเป็นพวกภาษา Programming แบบ Strongly Typed (อย่างเช่น Python และ Go) ก็จะเกิด Error เนื่องจากภาษาเหล่านั้นไม่อนุญาตให้เกิด “type coercion” (คือความสามารถในการเปลี่ยนค่าใน Context อย่างเช่น การรวม Type ที่ต่างกัน 2 ประเภทด้วยการใช้ +) ส่วนภาษา Programming แบบ Weakly typed (อย่างพวก JavaScript) จะไม่แสดง Error ออกมา (ผลลัพธ์ที่ได้คือ '35')
- Static: Type จะถูกตรวจสอบก่อน Run-Time
- Dynamic: Type จะถูกตรวจสอบในระหว่างการ Execute
คำจำกัดความของ “Static & Compiled” และ “Dynamic & Interpreted” ดูจะมีความคล้ายคลึงกันมาก แต่อยากให้จำว่า “เมื่อ Types ถูกตรวจสอบ” กับ “เมื่อ Source Code ถูกแปล”
การตรวจสอบ Types จะไม่ต้องทำในภาษาที่ compiled หรือ interpreted คุณต้องแยกคำเหล่านี้ออกด้วยแนวคิดดังนี้
ตัวอย่างในภาษา Python
ในแง่ของ Dynamic, Interpreted
|
เนื่องจาก Python เป็นทั้งแบบ Interpreted และ Dynamic Type ซึ่งมันจะแปลและตรวจสอบ Type ของ Code ในขณะที่กำลัง Execute ดังนั้นจากในตัวอย่าง จะพบว่าตรงที่คำสั่ง “else” จะไม่มีทางถูก Execute ดังนั้น “3” + 5 ก็จะไม่ถูกแสดงค่าออกมาเลย
แล้วจะเกิดอะไรขึ้น หากมันเป็น Static Type ล่ะ?
มันก็จะเกิด Error ทันที เนื่องจากมีการตรวจสอบ Type ก่อนที่จะ Run แม้ว่ามันจะเป็นแบบ Interpreted ก็ตาม
แล้วถ้ามันเป็นแบบ Compiled ล่ะ?
ในส่วนของคำสั่ง “else” ก็จะถูกแปลหรือถูกมองก่อนช่วง Run-Time แต่ด้วยเพราะเป็น Dynamic Type จึงทำให้ไม่แสดง Error ออกมา ซึ่งภาษาที่เป็นแบบ Dynamic จะไม่ตรวจสอบ Type จนกว่าจะมีการ Execute ทำให้บรรทัดนั้น จะไม่มีการ Execute ด้วย
ตัวอย่างในภาษา GO
ในแง่ของ Static, Compiled
|
Type จะถูกตรวจสอบก่อนที่จะ Run (Static) และแน่นอนว่าจะจับ Error ได้ทันที สำหรับ Type จะถูกตรวจสอบก่อน Run-Time ถึงแม้จะเป็นแบบ Interpreted แต่ผลก็ยังคงเป็นเหมือนเดิม แต่ถ้าเป็นแบบ Dynamic ก็จะไม่เกิด Error ใดๆ แม้ว่า Code จะถูกมองในระหว่างการ Compile ก็ตาม
ในแง่ของประสิทธิภาพ (Performance)
สำหรับ Compiled Language จะมี Performance ที่ดีกว่าในขณะที่ Run-Time กรณีที่เป็นแบบ Static Type เนื่องจาก Knowledge เกี่ยวกับ Type ช่วยให้สามารถทำการ Optimize ตัว Machine Code ได้
ส่วนภาษาที่เป็น Static Type มี Performance ที่ดีกว่าในขณะที่ Run-Time เนื่องจากไม่จำเป็นต้องตรวจสอบ Type ในขณะที่ Execute (เพราะตรวจสอบเรียบร้อยแล้วก่อนที่จะ Run)
ในทำนองเดียวกัน Compiled Language จะทำได้เร็วกว่าในขณะที่ Run-Time เนื่องจาก Code ได้รับการแปลมาหมดแล้ว แทนที่จะต้องมาแปลในระหว่างการ Execute
แต่ควรทราบไว้ว่า ทั้ง Compiled Language และ Static Type Language จะมีการ Delay ก่อนที่จะ Run เพื่อการแปลและตรวจสอบ Type (ตามลำดับ)
ในแง่ของความแตกต่าง
Static Type จะมีการจับ Error ที่เกิดจาก Type ตั้งแต่ต้นก่อน แทนที่จะค้นหา Error ในระหว่างการ Execute (ซึ่งมีประโยชน์อย่างยิ่งสำหรับโปรแกรมที่มี Code ยาวๆ) ซึ่งถือว่ามีความเข้มงวด เนื่องจากมันจะไม่ยอมให้เกิด Error ในเรื่องของ Type เลยไม่ว่าในส่วนหนึ่งส่วนใดของโปรแกรม และถือเป็นการป้องกันการเปลี่ยนแปลงค่าของตัวแปร จากสาเหตุการเปลี่ยนแปลง Type ซึ่งถือเป็นการป้องกัน Error ที่อาจเกิดขึ้นได้
ส่วน Dynamic Type ดูจะมีความยืดหยุ่นมากกว่าซึ่งหลายคนอาจจะชอบ แต่ด้วยเหตุที่มันอนุญาตให้ตัวแปรสามารถมีการเปลี่ยนแปลง Type ได้ จึงอาจทำให้เกิด Error โดยที่ไม่คาดคิดได้ง่ายๆ เช่นกัน
ที่มา: hackernoon.com
อัพเดทบทความจากคนวงในสายไอทีทาง LINE ก่อนใคร
อย่าลืมแอดไลน์ @techstarth เป็นเพื่อนนะคะ
|
บทความที่เกี่ยวข้อง