หลายคนน่าจะรู้จักภาษามากมาย เช่น Javascript, PHP, Python, Go, C และ Rust แล้วภาษาพวกนี้รันใน computer เรากันได้ยังไง ข้อแตกต่างคืออะไร ? วันนี้ผมจะมาอธิบายเรื่องนี้แบบง่ายๆให้ฟัง
Table of contents
Open Table of contents
Intro
เวลาที่เราเขียน Code(ชุดคำสั่ง) ในภาษาโปรแกรมมิ่งจริงๆแล้วคอมพิวเตอร์ไม่สามารถเข้าใจได้ แต่จะมีตัวแปลภาษาอยู่ 2 ชนิด นั่นคือ Interpreter และ Compiler
Interpreter
Interpreter คือตัวแปลภาษาชนิดหนึ่ง ซึ่งใช้วิธีการแปลแบบ บรรทัดต่อบรรทัด
จะใช้กับภาษาที่เป็น High Level หรือภาษาที่มนุษย์สามารถอ่านค่อนข้างรู้เรื่องมากที่สุด
ส่วนประกอบอีกส่วนที่จำเป็นคือต้องลงตัวแปล เช่น Nodejs ต้องไปโหลด node มาลงในคอมพิวเตอร์ก่อน หรือ python ก็เป็นแบบเดียวกัน
Compiler
Compiler คือตัวแปลของภาษานั้นให้เป็น binary code หรือ code ที่สามารถนำไปใช้กับคอมพิวเตอร์ได้โดยไม่ต้องลงตัวแปลเพิ่มเติม โดยที่ภาษาใน Low level จะใช้เป็นส่วนมาก
Binary File ถ้าอ่านไฟล์มาจะเจอแต่ตัวเลขที่คอยแสดงลำดับว่าคอมพิวเตอร์จะต้องทำอะไรบ้าง ในกรณีนี้เรียกว่า sequence of the byte
หลักการของ Binary file จากตัวอย่างที่เห็นความจริงแล้วเป็น byte อยู่ซึ่งวิธีการอ่านแบบ Binary ที่แท้จริงควรเป็น 01
คอมพิวเตอร์จะอ่านแบบนี้ครับ
29
11
40
c9
a6
24
29
-> 00101001
11
-> 00010001
40
-> 01000000
c9
-> 11001001
a6
-> 10100110
24
-> 00100100
Pros and Cons
Interpreter
Pros
- เป็นภาษาที่มนุษย์จะอ่านเข้าใจได้ง่ายกว่า เพราะมีตัวแปลภาษามาแล้ว
- มี Dynamic typing เช่น Typescript อาจจะมอง
number
เป็น primitive (แลกมากับการจอง memory ที่มากขึ้น) - การจัดการ Memory มีตัวช่วย เช่น Garbage Collector
Cons
- resource/memory ที่ใช้จะเยอะกว่า compiler
- ความไวเมื่อเทียบกับภาษาที่ใช้ compiler ตัวโปรแกรมจะทำงานช้ากว่าโดยทั่วไป
- ในแง่ของความปลอดภัยจะแย่กว่า compiler เพราะ code ถูกอ่านทีละบรรทัด หมายความว่าถ้ามีคนแอบมาแก้โค้ดบางส่วนตอนที่อ่านไปก็เป็นอันตรายได้เช่นเดียวกัน
Compiler
Pros
- ความเร็วเมื่อเทียบกับ Interpreter โปรแกรมที่ผ่าน Compiler มาควรจะทำงานได้ไวกว่า (ตามนิยาม)
- สามารถตรวจจับข้อผิดพลาดได้ก่อนที่โปรแกรมจะถูกเรียกใช้งานเพราะ compiler จะอ่านทุกไฟล์ ทุกบรรทัด
- การแก้ไขระหว่างทางจะเกิดขึ้นได้ยากกว่า หากไม่มี source code ต้นฉบับ
Cons
- ภาษาค่อนข้างอ่านยากกว่าเมื่อเทียบกับ High Level
- การจัดการ Data type จะมีความซับซ้อนมากกว่าเพราะต้องกำหนดว่าใช้ memory เท่าไหร่ จึงมี type เช่น i8, i32
- การจัดการ Memory ต้องจัดการจากผู้เขียนเป็นหลักหรือบางภาษาจะมีกฏพิเศษ
Conclusion from writer
ผู้เขียนเองก็เคยเขียนทั้งภาษาที่เป็นแบบ Interpreter และ Compiler มาแล้ว ปัญหาที่เจอกับ Interpreter คือกรณีที่ต้องทำ Performance ให้ดีสุดจะมีความยากกว่าปกติ ปัจจุบันผู้เขียนได้เริ่มมาเขียน Rust ซึ่งในเนื้อหาตอนต่อๆไปอาจจะเกี่ยวกับภาษา Rust ด้วยครับ