วันเสาร์ที่ 23 ตุลาคม พ.ศ. 2553

Compiler : กระบวนการ Compile (ภาษา Java)

หลังจากไม่ได้เขียนต่อเสียนาน (เวลาส่วนใหญ่มอบให้น้อง (ไม่) ใหม่ Objective-C) เพื่อนของผมมีคำถามเกี่ยวกับ Compiler ที่พวกเขากำลังศึกษาอยู่ จึงเป็นแรงผลักดันให้ผมใช้เวลากับโปแกรม Compiler อีกครั้ง

เพื่อนๆคงทราบดีแล้วว่ากระบวนการแปลของ Compiler ต้องประกอบด้วย
- อ่าน Source
- ส่งให้กระบวนการ Lexical
- นำผลลัพธ์ส่งต่อให้กระบวนการ Parser
- นำผลลัพธ์ส่งต่อให้กระบวนการ Code Generator
- ได้ภาษาเป้าหมาย
(ถ้าจำไม่ได้ให้อ่านบทความหน้านี้) ต่อจากเนื้อหาที่แล้วในไฟล์ชื่อ MainProgram.java ให้ลบ System.out.println("Hello, World"); ออกเสีย แล้วโค้ดดังนี้ (รูปหมายเลข 101)
***หมายเหตุ
- คลิกที่รูปเพื่อดูภาพขนาดจริง
- ต้องขออภัยเพื่อนๆที่ผมตัดสินใจไม่เขียนโค้ดล้วนๆลงบทความ เพราะโด้ดอาจผิดพลาดได้ ฉะนั้นหากรูปหายหรือไม่สมบูรณ์ รบกวนเพื่อนๆ Comment ตรงท้ายบทความบอกผมหน่อยนะ จะรีบมาแก้ไขทันที
- จากรูป คำสั่งส่วนใหญ่มีเส้นหยักสีแดงอยู่ข้างใต้ แสดงว่าคำสั่งเหล่านั้นไม่ถูกต้องตามไวยากรณ์ (Syntax) ของภาษาจาวา เบื้องต้นนี้เพื่อนๆยังไม่ต้องใส่ใจ เพราะเมื่อเราแก้ไขให้ถูกต้องแล้วเส้นหยักสีแดงก็จะหายไปเองครับ

จากรูป (หมายเลข 101) อธิบายได้ว่า
- บรรทัดที่ 4 เราต้องสร้างคลาสชื่อ SourceCodeReader สำหรับอ่านไฟล์ที่ชื่อ SourceCode.txt (ขณะนี้ยังไม่ได้สร้าง)
- คลาส SourceCodeReader จะอ่านไฟล์ SourceCode.txt ได้ผลลัพธ์ออกมาเป็นค่าคงที่ของสตริง (String Type) ผ่านเมธอดชื่อ getSourceCode() โดยรับที่อยู่ของไฟล์ (File Path) ผ่านทาง Constructor
- บรรทัดที่ 7 เราอ้างถึงคลาส Lexical (ได้สร้างไว้แล้ว) คลาสนี้จะรับเอา ค่าคงที่ของสตริง ซึ่งอ้างโดยอินสแตนท์ชื่อ sourceCode ผ่านทาง Constructor
- บรรทัดถัดมาเรียกบริการ getSymbolTable() และ getTokenStream() ได้ผลลัพธ์เป็นคลาส SymbolTable และ TokenStream ตามลำดับ (ขณะนี้ยังไม่ได้สร้าง) เพื่อนำมาแสดงผล (ถ้าต้องการ) และส่งให้กับคลาส Parser
- บรรทัดที่ 11 เราอ้างถึงคลาส Parser (ได้สร้างไว้แล้ว) คลาสนี้จะรับเอา SymbolTable และ TokenStream ซึ่งอ้างโดยอินสแตนท์ชื่อ symbolTable และ tokenStream ตามลำดับ ผ่านทาง Constructor
- บรรทัดถัดมาเรียกบริการ getIntermediateCode() ได้ผลลัพธ์เป็นคลาส IntermediateCode เพื่อนำมาแสดงผล (ถ้าต้องการ) และส่งให้กับคลาส CodeGenerator
- บรรทัดที่ 14 เราอ้างถึงคลาส CodeGenerator (ได้สร้างไว้แล้ว) คลาสนี้จะรับเอา IntermediateCode ที่อ้างโดยอินสแตนท์ชื่อ intermediateCode ผ่านทาง Constructor
- สุดท้ายจะแสดงผลลัพธ์เป็นภาษาเป้าหมายที่ต้องการ ทว่าตัวอย่างนี้จะแสดงเป็นภาษาเครื่องสมมติ (ใช้งานจริงไม่ได้) เพื่อให้เราได้เรียนรู้กระบวนการสำคัญๆของ Compiler

ดังนั้นบทความถัดไปเราจะกล่าวถึงการสร้างคลาส SourceCodeReader ครับ

อ่านเนื้อหาที่เกี่ยวข้อง ก่อนหน้า หรือ ถัดไป

1 ความคิดเห็น:

  1. I just could not leave your website prior to
    suggesting that I actually loved the standard info a person provide for your visitors?

    Is going to be back continuously in order to investigate cross-check new posts

    my web page ... natural cellulite treatment

    ตอบลบ