compiler – ตอนที่ 1 คอมไพเลอร์คืออะไร?

ก่อนจะพูดถึงว่าคอมไพเลอร์คืออะไร จะขอย้อนกลับไปเรื่องภาษาโปรแกรมกันสักหน่อย

การทำงานต่างๆ ของคอมพิวเตอร์ล้วนแต่มาจากการทำงานตามสิ่งที่เราโปรแกรมเข้าไปให้มัน ซึ่งเจ้าคอมพิวเตอร์เนี่ยก็รู้จักแค่ 0 และ 1 …ซึ่งเราเรียกชุดคำสั่งที่เป็น machine code หรือภาษาเครื่อง

ดังนั้นคำสั่งที่คอมพิวเตอร์อ่านรู้เรื่องอาจจะเป็น

000111010111101010000010111111010000001101111011010111111110011010

ศูนย์และหนึ่งเพียบเลย

ซึ่งแน่นอน!

แน่นอนว่าคนเราอ่านอะไรแบบนี้ไม่รู้เรื่องอยู่แล้ว แต่จะทำยังไงได้ล่ะ ในเมื่อคอมพิวเตอร์มันไม่ฉลาดพอที่จะเรียนรู้ภาษาอื่น คนเราอยากจะสั่งงานคอมพิวเตอร์ก็ต้องทนเขียน 0 และ 1 เป็นลำดับชวนสับสนกันแบบนี้ต่อไป

 

ในโลกนี้มีคนอยู่10ประเภท คือคนที่รู้เลขฐานสอง และ ไม่รู้เลขฐานสอง

แล้วเมื่อมาถึงจุดหนึ่งที่คนเริ่มทนไม่ไหว คนสมัยก่อนก็เลยคิดวิธีที่จะไม่ต้องมานั่งพิมพ์ 0 และ 1 เองแบบนี้ขึ้นมาโดยใช้ รหัสซึ่งเป็นตัวอักษรมาแทนที่หรือที่เราเรียกกันว่า Mnemonic (นีโมนิค)

ตัวอย่างเช่น

ต้องการเพิ่มค่าให้ตัวแปร X อีก 5 หน่วย จากที่ต้องสั่งงานตรงๆ โดย

000111010111101010000010111111010000001101111011010111111110011010

ก็จะเปลี่ยนเป็น…

LOAD Register, X
ADD 5
STORE X, Register

อืม…พอจะอ่านรู้เรื่องมากขึ้น??

แล้วถ้าอย่างนี้ล่ะ

X = X + 5;

อืม อันนี้ค่อยดีขึ้นหน่อย จริงมั้ย?


เรื่อง นี้ทำให้โปรแกรมเมอร์สมัยก่อนมีความสุขขึ้นมาเล็กน้อย แต่การจะทำอย่างนั้นได้ก็ต้องมีบางสิ่งที่มาช่วยแปลรหัส Mnemonic พวกนี้ให้กลายเป็น machine code อยู่ดี

เรื่องนี้จึงเป็นสิ่งที่ทำให้ Compiler เกิดขึ้นมา

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

เช่น แปลงจาก C/C++ หรือ Java หรือ VB ให้กลายเป็น assembly และ machine code

ดังนั้น การที่จะสร้าง Compiler ขึ้นมาได้ก็จำเป็นที่จะต้องมีความรู้ในเรื่อง Programming Language เป็นอย่างดี

กว่าจะเป็นภาษาโปรแกรมขึ้นมาได้ มันต้องผ่านอะไรบ้าง?

จะ ว่าไป การเขียนคอมไพเลอร์มันก็เหมือนกับการเขียนโปรแกรมพวก Text-Processing ละนะ (สำหรับคนที่ไม่รู้จัก ก็คือโปรแกรมที่ทำงานประมวลผล อ่านๆ คิดๆ เกี่ยวกับตัวอักษรว่าถ้าผู้ใช้พิมพ์คำนี้เข้าไป มันควรจะแปลว่าอะไรดี)

แต่แทนที่โปรแกรมแปลภาษาตัวนี้จะแปลจากภาษาคนเป็นภาษาคน (?) มันกลับแปลจากภาษาคอมให้กลายเป็นภาษาคอมอีกที

ดังนั้นสเต็ปแรกที่คอมไพเลอร์จะต้องทำคือการ “ตัดคำ” หรือ Tokenizer ตัวอย่างเช่น ประโยคว่า “นี่คือหนังสือ” แน่นนอน…มันประกอบด้วยคำหลักๆ 3 คำ คือ “นี่”, “คือ”, “หนังสือ” ถ้าเรายังตัดคำไม่ถูกก็ไม่มีทางที่จะแปลออก

ลองคิดดูว่าเราตัดคำเป็น นี่-คื-อห-นัง-สือ คงจะอ่านแล้วงงดีนะ

ถ้าอย่างนั้นเราจะรู้ได้ยังไงว่าเราควรตัดคำยังไง ก็ไม่ยากหรอกเพราะเวลาเราเขียนภาษาโปรแกรมมันจะมีสิ่งที่เรียกว่า “Syntax” อยู่ ใครเคยเขียนโปรแกรมมาก่อน คงจำช่วงแรกๆ ที่เริ่มเขียนได้ ถ้าเราพิมพ์อะไรผิดไปสักนิดเดียว มันจะทำให้โปรแกรมรันไม่ได้เลย (เช่นการลืม ; หลังจบประโยคยังไงล่ะ เคยกันสินะ 😛 )

หลังจากการตัดคำเรียบร้อย เราจะรู้ได้ยังไงว่าโค้ดชุดเนี้ยต้องทำอันไหนก่อน เช่นเจอคำสั่ง

x = 5 + 3 * y - ( z + 9 % t ) + 2 + t

ถ้า เราไม่สั่งคอมมันก็คงจะทำจากซ้ายไปขวาซึ่งมันผิดลำดับการทำงานไง เลยต้องเอา token ที่ตัดไว้เรียบร้อยพวกนั้นไปสร้างเป็นโครงสร้างแบบ Tree  หรือที่วิชาคอมไพเลอร์จะเรียกว่า “AST – Abstract Syntax Tree” จะได้เห็นกันชัดๆ ไปเลยว่าคำสั่งไหนทำก่อนตัวไหน

และสุดท้าย หลังจากมีโครงทุกอย่าง(ที่ได้มาอย่างยากลำบาก)แล้ว ก็ถึงเวลาเอาเจ้าพวกนี้แปลทีละบรรทัดให้กลายเป็นโค้ดระดับภาษาแอสเซมบลีหรือ ภาษาเครื่องต่อไป … เป็นอันเสร็จการทำงาน (ถ้าไม่มีบั๊ก!!!)

334 Total Views 3 Views Today
Ta

Ta

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

ใส่ความเห็น

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