ก่อนจะพูดถึงว่าคอมไพเลอร์คืออะไร จะขอย้อนกลับไปเรื่องภาษาโปรแกรมกันสักหน่อย
การทำงานต่างๆ ของคอมพิวเตอร์ล้วนแต่มาจากการทำงานตามสิ่งที่เราโปรแกรมเข้าไปให้มัน ซึ่งเจ้าคอมพิวเตอร์เนี่ยก็รู้จักแค่ 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" จะได้เห็นกันชัดๆ ไปเลยว่าคำสั่งไหนทำก่อนตัวไหน
และสุดท้าย หลังจากมีโครงทุกอย่าง(ที่ได้มาอย่างยากลำบาก)แล้ว ก็ถึงเวลาเอาเจ้าพวกนี้แปลทีละบรรทัดให้กลายเป็นโค้ดระดับภาษาแอสเซมบลีหรือ ภาษาเครื่องต่อไป ... เป็นอันเสร็จการทำงาน (ถ้าไม่มีบั๊ก!!!)