เขียนมาถึงบทความที่ 10 แล้วสำหรับ "โปรแกรม Compiler" ผมก็ป่วยด้วยไข้หวัด (ไม่ใช่ 2009 แน่นอน) สภาพอากาศแปรปรวนมากที่กรุงเทพมหานคร นอกเสียจากฤดูปกติที่มีแต่ร้อนกับร้อนมาก พึ่งสังเกตครับว่ามีนกมาทำรังออกลูกออกหลาน (ไม่ได้ติดหวัดจากนกพวกนี้นะ) อยู่ใกล้กับที่ที่ผมทำงาน เช้าๆได้ยินเสียงนกปลุกให้ตื่นตลอด (ดีเหมือนกัน) แล้วเพื่อนๆละเดี๋ยวนี้ต้องพึ่งใครให้ปลุกตอนเช้าหรือเปล่าครับ ? คงไม่หรอกเน๊าะ ^^
Symbol Table
ชื่อนี้และ Token Stream เพื่อนๆคงได้ยินจนชินแล้ว มันคืออะไร ? ปกติแล้ว Compiler ในสมัยที่เครื่องคอมพิวเตอร์พึงวิวัฒนาการ หน่วยความจำหลัก (RAM) มีราคาแพงมาก แถมยังเนื้อที่น้อยนิดอีกต่างหาก อาจารย์เล่าให้ฟังว่า การโปรแกรมสมัยท่านยังสาว (ขอโทษจริงๆครับ) ต้องคิดหาวิธีจัดการหน่วยความจำที่มีเพียง 10 MB (หรือน้อยกว่านี้ก็มี) แน่นอนถ้าซื้อเพิ่มต้องใช้งบหลวง แค่ราคา 10 MB ก็ปาไปแสนกว่าบาทแล้ว ไม่เหมือนเดี๋ยวนี้ความจุ 2 GB ราคาอยู่ที่ 1000-1500 (DDR3) บาท
Symbol Table จำเป็นมากสำหรับโปรแกรม Compiler ย้อนยุค แต่มันเป็นการจัดการหน่วยความจำที่ดีมาก กล่าวคือ เมื่อเพื่อนได้คำหรือ Tokens มาแล้ว เช่น "int" "a" "=" "10" + "10" ";" เพื่อนๆต้องเพิ่มมันลง Symbol Table เสียก่อน (Token Name) เพื่อให้พวกมันมีรหัสหมายเลขเป็นของตัวเอง (Token Index) พร้อมกับเพิ่มประเภทของมันลงไปด้วย (Token Type) โดยมีเงื่อนไขว่า หากคำหรือ Tokens ในลำดับถัดมาซ้ำกับที่มีอยู่แล้วในตาราง ก็จะไม่เพิ่มเข้าไปอีกครับ (ไม่เอาซ้ำนั่นเอง) ดูตัวอย่างนะ
เพิ่ม "int" ลงใน Symbol Table
เพิ่ม "a" ลงใน Symbol Table
เพิ่ม "=", "10", "+" ลงใน Symbol Table
เพิ่ม "10" ซึ่งซ้ำกับที่มีอยู่ลงใน Symbol Table
ท้ายสุดเพิ่ม ";" ลงใน Symbol Table
นอกจากนี้เรายังสามารถเปลี่ยนประเภทของ Tokens (Token Type) จากเดิมที่เป็นชื่อยาวๆเช่น Keywords, Operators... ให้เป็นหมายเลขแทนได้ สมมติให้ตารางด้านล่างนี้ชื่อ Token Type
เมื่อนำมาใช้กับ Symbol Table หน้าตาจึงออกมาเป็นแบบนี้ครับ
แล้วเหตุใดจึงพยายามเปลี่ยนจาก int, a, ... และ Keywords, Operators, ... ให้เป็นหมายเลขด้วย นั่นเพราะวิชา Compiler พยายามจำลองการทำงานของ Compiler จริงๆ กล่าวคือ
- Compiler ควรมีขนาดเล็ก ใช้หน่วยความจำน้อยที่สุด และทำงานแปลได้รวดเร็ว
- การจัดการให้โค้ดอยู่ในรูปแบบตัวเลข (ฐานสอง > ฐานสิบหก | ฐานแปด > ฐานสิบ > ตัวอักษร > สตริง) จะทำให้ระบบประมวลผลได้ไวกว่ารูปแบบอื่นๆ
ท้ายสุดอยากให้เพื่อนๆลองสร้างคลาสและคิดอัลกอลิทึมสำหรับ Symbol Table และตาราง Token Type ครั้นเปลี่ยนเป็นโคัดโปรแกรมภาษาจาวา จะเขียนอย่างไร ? และขณะนี้เวลา 17.00 น. ผมขอตัวออกไปวิ่งที่สวนสุขภาพ ค่ำๆจะกลับมาครับ
อ่านเนื้อหาที่เกี่ยวข้อง ก่อนหน้า หรือ ถัดไป
ไม่มีความคิดเห็น:
แสดงความคิดเห็น