อ่านตอนก่อนหน้านี้ได้ที่ #Compiler
Phases of Compile
ขอเรียกว่า "สเต็ปของการคอมไพล์" ละกันนะ
ใน บทนี้เราจะมาดูกันว่ากว่าเจ้าคอมไพเลอร์มันจะแปลสิ่งที่เราเขียนๆ เข้าไป (หมายถึง Computer Language น่ะนะ) ออกมาได้ แล้วสร้างโค้ดภาษาเครื่องหรือระดับภาษา Assembly ออกมาให้เราได้นั้น มันต้องผ่านอะไรเยอะแยะ
สำหรับขั้นตอนหลักๆ เราจะแบ่งเป็น 3 ส่วนดังนี้
- Syntactic Analysis จะได้ AST (Abstract Syntax Tree) ออกมาก
- Contextual Analysis จะได้ AST ที่ "Decorated" เรียบร้อย
- Code Generation จะได้ Object Code ซึ่งคือโค้ดที่เอาไปรันได้
แบบรูป diagram ข้างล่างนี่เลย
Syntactic Analysis มันเขียนมาถูกโครงสร้างมั้ย?
สเต็ปแรกเป็นการเช็กว่าโค้ดที่เราเขียนเข้ามานั้น เขียนถูกต้องตรงตามหลัก Grammar ของภาษารึเปล่า
เช่นภาษาที่เราใช่กำหนดไว้ว่าการประกาศค่าตัวแปรต้องเขียนแบบนี้
var n: int
ถ้าเราไปเขียนแบบ
int n;
มันก็ไม่ได้ ใช่มั้ยล่ะ
แต่สำหรับภาษาที่แกรมม่าง่ายๆ หรือโค้ดที่เขียนมาไม่ซับซ้อน การเช็กว่ามันเขียนถูกไหมคงจะไม่ยากนัก
แต่ถ้าโค้ดเขียนมาเยอะๆ ล่ะ
เราจะแปลออกได้ยังไงว่าโค้ดส่วนนี้ทำอะไรอยู่
คำตอบก็คือต้องทำการ "parse" (หรือแปลว่า"จับมันแปลงร่าง") ให้กลายเป็นโครงสร้างแบบ AST
ป.ล.เจ้าคนที่ทำหน้าที่แปลงเนี่ย เราเรียกมันว่า Parser
Abstract Syntax Tree
แปลงโค้ดที่เข้ามาแบบเป็น String พวกนั้นให้เป็น Tree ก่อน (อ่านเรื่อง Tree ได้ใน #DataStructure&Algorithm) เพราะมันจะทำให้เรามองออกว่าโครงสร้างแต่ละส่วน อันไหนอยู่ในส่วนไหน จะได้รู้ไงล่ะ ว่าโค้ดส่วนไหนต้อง process ก่อนและมันเขียนไม่ผิดใช่ไหม
Contextual Analysis มันเขียนมาแบบรายละเอียดเนื้อหาผ่านมั้ย?
หลัง จากสเต็ปที่แล้วเราได้ AST มาแล้ว แต่ก็ยังไม่จบเท่านั้น เพราะบางครั้งการที่เขาเขียนๆ โค้ดมาน่ะ ถึงจะถูกแกรมม่าก็ยังไม่ใช่ว่ามันจะผ่านทั้งหมดอยู่ดี
เช่นการเขียนว่า
Car is pencil. รถยนต์เป็นดินสอ
มันถูกหลักภาษาแต่ความหมายมันไม่ได้ไง!
ซึ่งในมุมมองของคอมไพเลอร์มันต้องเช็กอะไรบ้างล่ะ
- ใช้ตัวแปร ประกาศมาแล้วหรือยัง
- สั่งให้เก็บ 'A' ลงไปในตัวแปรประเภท integer ได้ไหม
- มีการตั้งชื่อซ้ำหรือไม่
คร่าวๆ ก็ประมาณนี้ (แต่มันมีที่ต้องเช็กมากกว่านี้นะ)
Code Generation แปลงทีละส่วนเป็นโค้ดใหม่
สเต็ปสุดท้ายคือส่วนที่เราต้องการทำจริงๆ แต่จะทำได้หลังจากเราได้ "Decorated" AST จากสเต็ปที่แล้วมาแล้วเท่านั้น
ในสเต็ปนี้เราชัวร์ได้เลย ว่าโค้ดมันเขียนมาถูกต้องทุกอย่างแล้ว
เราก็จะทำการแปลงโค้ดทีละคำสั่งให้กลายเป็นภาษาเครื่อง โดยการใช้ Code Template
ดูยุ่งยาก? ใช่ มันค่อนข้างจะยุ่งยาก เพราะการจะทำให้คอมอ่านภาษาแบบคนได้ ต้องใช้อัลกอริทึมหนักๆ สักหน่อย
แล้วในบล๊อกต่อไป เราจะมาเจาะลึกกันว่าในแต่ละสเต็ปมันทำงานกันยังไง