compiler – ตอนที่ 3 Phases of Compile สเต็ปของการคอมไพล์ภาษา

อ่านตอนก่อนหน้านี้ได้ที่ #Compiler

Phases of Compile

ขอเรียกว่า "สเต็ปของการคอมไพล์" ละกันนะ

ใน บทนี้เราจะมาดูกันว่ากว่าเจ้าคอมไพเลอร์มันจะแปลสิ่งที่เราเขียนๆ เข้าไป (หมายถึง Computer Language น่ะนะ) ออกมาได้ แล้วสร้างโค้ดภาษาเครื่องหรือระดับภาษา Assembly ออกมาให้เราได้นั้น มันต้องผ่านอะไรเยอะแยะ

สำหรับขั้นตอนหลักๆ เราจะแบ่งเป็น 3 ส่วนดังนี้

  1. Syntactic Analysis จะได้ AST (Abstract Syntax Tree) ออกมาก
  2. Contextual Analysis จะได้ AST ที่ "Decorated" เรียบร้อย
  3. 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 

ดูยุ่งยาก? ใช่ มันค่อนข้างจะยุ่งยาก เพราะการจะทำให้คอมอ่านภาษาแบบคนได้ ต้องใช้อัลกอริทึมหนักๆ สักหน่อย

แล้วในบล๊อกต่อไป เราจะมาเจาะลึกกันว่าในแต่ละสเต็ปมันทำงานกันยังไง

 

528 Total Views 3 Views Today
Ta

Ta

สิ่งมีชีวิตตัวอ้วนๆ กลมๆ เคลื่อนที่ไปไหนโดยการกลิ้ง .. ถนัดการดำรงชีวิตโดยไม่โดนแสงแดด
ปัจจุบันเป็น Senior Software Engineer อยู่ที่ Centrillion Technology
งานอดิเรกคือ เขียนโปรแกรม อ่านหนังสือ เขียนบทความ วาดรูป และ เล่นแบดมินตัน

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องที่ต้องการถูกทำเครื่องหมาย *