ตัวแปลภาษา COMPILERS
วัตถุประสงค์
1. แสดงรูปแบบจำลองของโปรแกรมตัวแปลภาษา เพื่อใช้ประกอบการศึกษาและวางพื้นฐานการออกแบบ
2. สร้างความเข้าใจ เพื่อให้เห็นคุณค่าของการใช้ภาษาคอมพิวเตอร์ และความยากง่ายในการใช้ภาษาอย่างมีประสิทธิภาพ
ดังนั้นจึงแบ่งเนื้อหาออกเป็นดังนี้
Part I แนะนำหลักการทั่วไปและแบบจำลองของโปรแกรมตัวแปลภาษา
Part II แสดงตัวอย่างการออกแบบและการทำงานของโปรแกรมตัวแปลภาษา
Part III การจัดการโครงสร้างข้อมูล, Recursion, Storage Allocation, Block Structure, Conditions และ Pointers ที่นำมาประยุกต์ใช้ในการทำงานกับรูปแบบจำลองตัวแปลภาษา
Computer Languages
Structure of Computer Languages
1. Character Set
• Alphabetic Symbols
• Special Characters
2. Data Types
• Constants or Literals
• Numeric
Fixed-point or Integer such as Positive, Zero, Negative
Floating-point or Real such as Single or Double Precision
Complex
• Character String such as bits or bytes string manipulation
• Logical
• Others Data Types
3. Data Structures
• Arrays, Stacks
• File Structures such as organizing in Sequential, Random, Inverted Files
• Pointers
• Procedures and Functions
4. Naming and any Rules
5. Operators and Internal Functions
• Arithmetic Operators such as +, -, *, /, DIV, MOD, ^
• Logical Operators such as NOT, AND, OR, XOR
• String Operators such as concatenate, search, extract, replace of string
6. Structure of Statement Lines and Program
7. Statements or Commands or Instructions
• Declarative Statements
• Assignment Statements
• Control Statements
• Conditional Statements
• I/O Statements
• Debugging or Compiler-directive Statements
• Others
Part I
PL/I Program
WCM: PPROCEDURE (RATE,START,FINISH);
DECLARE (COST,RATE,START,FINISH) FIXED BINARY(31) STATIC;
COST = RATE * (START – FINISH) + 2 * RATE * (START – FINISH – 100);
RETURN (COST);
END;
ตัวแปลภาษาจะต้องทำอย่างไรกับโปรแกรม WCM นี้ เพื่อให้ได้มาซึ่งโปรแกรมคำสั่งภาษาเครื่อง
1. แยกแยะ กระจาย String ให้ได้ Basic Elements (or Tokens)
WCM -------- Label
PROCEDURE -------- Keyword
COST -------- Variable or Identifier
= -------- Operator
2. ตรวจสอบ จดจำรูปแบบประโยคคำสั่ง (Syntactic Construction) เพื่อหาความหมายของการสั่งงาน (Semantic)
คำสั่งแรก เป็นคำสั่ง PROCEDURE พร้อมค่า Arguments สามตัว
คำสั่งที่สอง เป็นคำสั่งอธิบายตัวแปรพร้อมคุณสมบัติที่จะใช้งาน
คำสั่งที่สาม เป็นการกำหนดค่านิพจน์เลขคณิตแก่ตัวแปร COST
คำสั่งที่สี่ เป็นการส่งค่าตัวแปรกลับไปยังโปรแกรมที่เรียกใช้
คำสั่งที่ห้า แสดงการจบชุดของคำสั่งนี้
3. กำหนดพื้นที่และตำแหน่งของหน่วยความจำให้แก่ค่าคงที่ ตัวแปรต่างๆ
4. จัดสร้างชุดคำสั่งภาษาเครื่องที่เหมาะสมถูกต้อง
1. Recognizing Basic Element
Lexical Analysis parsing the source program into the proper syntaxtic classes (Scan)
วิเคราะห์คำ โดยการแยกแยะ String ออกเป็นคำ ๆ (Tokens or Basic Elements) โดยอาศัยตัว Separators ซึ่งได้แก่ ช่องว่าง (Blank or Spaces) โอเปอเรเตอร์ (Operators) สัญลักษณ์พิเศษที่ใช้คั่นวรรคตอน (Punctuation Symbols or Special Symbol) เพื่อแยกประเภทของ Elements ดังกล่าว
• Identifiers
• Literals
• Terminal Symbols เช่น Operators, Keywords, แล้วจัดสร้างเป็น Uniform Symbols (Token ที่มีขนาดไม่คงที่จัดการลำบาก จึงสร้าง Uniform Systems ซึ่งมีขนาดคงที่)
Lexical Analysis : หมายถึง 1 Token
Uniform Symbol = is the same size
2. Recognizing Syntactic Units and Interpreting Meaning
Basic Syntactic Constructs (Token)
WCM : PROCEDURE ( RATE , START , FINISH ) ;
Valid Statement
DECLARE ( COST , RATE , START , FINISH ) FIXED BINARY ( 31 ) STATIC ;
Valid Statement
COST = RATE * ( START - FINISH ) + 2 * RATE * ( START - FINISH -
100 ) ;
Valid Statement
RETURN ( COST ) ;
Valid Statement
END ;
Valid Statement
หน้าที่
- ตรวจสอบ จดจำ วลีคำสั่ง Syntactic Constructs Syntactic Phrase
- แปลความหมายในการสั่งทำงาน (Interpret the Meaning)
วิธีการ
Semantic - Intermediate Form
Reduction Rules
Action Routines
(ใช้กฎ Reductions เพื่อกำหนดรูปแบบประโยคคำสั่ง ว่าประกอบขึ้นมาด้วย ดครงสร้างพื้นฐานอะไรบ้าง แล้วควรจะเรียกใช้รูทีนส่วนไหน (Action Routines) ของตัวแปลภาษามาทำงานในการตีความหมายต่อไป)
Intermediate Forms
ประโยชน์
ช่วยในการ Optimization และยังทำให้การ Optimization แบ่งการทำงานของตัวแปลภาษาออกเป็นการทำงาน 2 ส่วน คือ Machine-Independent (Lexical Analysis, Syntax Analysis, Interpretation)
กับ Machine-dependent (Storage Allocation, Code Generation, Assembly)
การสร้าง Intermediate Forms ขึ้นอยู่กับโครงสร้างของ Syntactic Constructs สามรถแบ่งได้เป็น 3 ชนิด
- Arithmetic Statements
- Non-arithmetic Statements
- Non-Executable Statements
Arithmetic Statements
COST = RATE * ( START - FINISH ) + 2 * RATE * ( START - FINISH -
100 ) ;
1. Parse Tree เป็นการนำ Binary Tree มาประยุกต์ใช้กับ Binary Operator ( +, -, *, /, **)
โดยให้ Root Node เป็น Operator
Left-son Node เป็น Operand ตัวแรก
Right-son Node เป็น Operand ตัวที่สอง
2. Matrix
สำหรับ Arithmetic Statements
Index Operator Operand-1 Operand-2
M1 - START FINISH
M2 * RATE M1
M3 * 2 RATE
M4 - START FINISH
M5 - M4 100
M6 * M3 M5
M7 + M2 M6
M8 = COST M7
สำหรับ Non-Arithmetic Statements
Source Statement : RETURN (COST);
END;
จะได้ Matrix ดังนี้
Index Operator Operand-1 Operand-2
M1 RETURN COST
M2 END
คำสั่งอื่นๆ เช่น คำสั่ง DO, IF, GO TO เป็นต้น
สำหรับ Non-Executable Statements
No Intermediate Form but have some table of information about Identifiers
เช่น คำสั่ง DECLARE ของภาษา PL/I
คำสั่ง DIMENSION ของภาษา FORTRAN, BASIC
Storage Assignment
หน้าที่
Code Generation
Matrix Line. Matrix Entry Generated Codes
L 1,START
1. - START FINISH S 1,FINISH
ST 1,M1
L 1,RATE
2. * RATE M1 M 0,M1
ST 1,M2
L 1,=F’2’
3. * 2 RATE M 0,RATE
ST 1,M3
L 1,START
4. - START FINISH S 1,FINISH
ST 1,M4
L 1,M4
5. - M4 100 S 1,=F’100’
ST 1,M5
L 1,M3
6. * M3 M5 M 0,M5
ST 1,M6
L 1,M2
7. + M2 M6 A 1,M6
ST 1,M7
L 1,M7
8. = COST M7 ST 1,COST
(Length = 92 Bytes)
Optimization (Machine-independent)
จากตัวอย่างของ Matrix โปรแกรมชุดคำสั่งของ WCM ปรากฎว่ามีนิพจน์ย่อย 2 ตัวที่ซ้ำกันคือนิพจน์ย่อย START - FINISH เนื่องจากนิพจน์ดังกล่าวให้ผลลัพธ์ในการทำงานเหมือนกัน ดังนั้นจึงสามารถตัดออกจาก Matrix ได้ แล้วปรับปรุงการอ้างอิงแทนกันให้ถูกต้องต่อไป เรียกวิธีการจัดการแบบนี้ว่า Eliminate of Common Subexpression
Matrix with common subexp. Matrix after eliminate of common subexp.
1. - START FINISH 1. - START FINISH
2. * RATE M1 2. * RATE M1
3. * 2 RATE 3. * 2 RATE
4. - START FINISH 4.
5. - M4 100 5. - M1 100
6. * M3 M5 6. * M3 M5
7. * M2 M6 7. * M2 M6
8. = COST M7 8. = COST M7
วิธีอื่นๆ ได้แก่
- Compile Time Computation of Operations both of whose operands are constants.
- Movement of computations involving nonvarying operands out of loops.
- Use of the properties of Boolean expressions to minimize their computation. Etc.
นิยมแยกออกเป็นอีกขั้นตอนการทำงานหนึ่งก่อนที่จะนำ Matrix ไปดำเนินการในขั้น Code Generation ต่อไป
Optimization (Machine-dependent)
พิจารณาจากตัวอย่าง
1. สามารถลดการใช้ Temporary Storage สำหรับจัดเก็บค่าผลลัพธ์ของการคำนวณรายการใน Matrix ได้ โดยการไม่พยายามที่จะจัดเก็บผลการคำนวณไว้ในหน่วยความจำ (Store)
(คำสั่ง L และ ST เดิมใช้ถึง 14 คำสั่ง เมื่อทำการ Optimize แล้ว จะเหลือเพียง 5
คำสั่งเท่านั้น)
2. สามารถใช้คำสั่งที่สั้นลง แต่ทำงานได้รวดเร็วขึ้นกว่าเดิมอีก
(เช่น แทนที่จะใช้คำสั่ง M ก็ใช้คำสั่ง MR แทนได้)
นอกจากจะลดพื้นที่ขนาดโปรแกรมแล้ว ยังช่วยลดเวลาการ execute ลงไปอีกด้วยถึงเกือบสองเท่า
ปกติการ Optimization มักจะทำควบคู่ไปพร้อมกับการทำ Code Generation นอกจากนั้นแล้วยังน่าที่จะนำเอาเทคนิคของ Conditional Macro Pseudo-ops มาประยุกต์ผสมใช้ด้วย จะช่วยทำให้การสร้าง Code มีความยืดหยุ่น มีประสิทธิภาพมากยิ่งขึ้นอีก
Assembly Phase
ค่าคงที่ (Literals) และตัวแปรตำแหน่ง (Symbolic Address) สำหรับผู้อ่านโปรแกรมอาจจะดูเหมือนง่าย แต่สำหรับตัวแปลภาษาแล้วจะต้องสร้างคำสั่งภาษาเครื่องที่ถูกต้องเสมอ
ตัวแปลภาษาสามารถที่จะใช้วิธีการสร้างค่าคงที่ และ ตัวแปรต่างๆ โดยใช้วิธีการอ้างอิงไปยังตำแหน่งที่จัดเก็บค่าคงที่ และ ตัวแปรดังกล่าวในช่วงของการทำ Storage Allocation ได้ แต่อย่างไรก็ตาม ตัวแปลภาษาก็ไม่สามารถที่จะกำหนดค่าที่แท้จริงของ Labels ได้ จนกว่าจะมีการสร้าง Code ทั้งหมกเสร็จเรียบร้อยเสียก่อน
ดังนั้นจริงๆ แล้วการทำงานในขั้น Code Generation จึงต้องทำหน้าที่ 2 อย่าง
1. Generating Code
2. Defining Labels and resolving all references
เมื่อข้อ 1. คือการทำ Code Generation Phase ที่เราได้กล่าวผ่านมาแล้ว ส่วนข้อ 2. จึงเป็นหน้าที่ของ Assembly Phase ซึ่งในทางปฎิบัติจริงๆ แล้วก็คือ Pass 2 ของ Assembler นั่นเอง
สรุปการทำงาน Part I ของตัวแปลภาษา
ลักษณะงานและปัญหา (Statement of Problem)
1. การแยกประเภทของข้อความ คำสั่งต่างๆ
(Recognizing Basic Elements)
Lexical Analysis Terminal Table
2. ตรวจสอบความถูกต้องของคำสั่งและความหมาย
(Recognizing Syntactic Unit and Interpreting Meaning)
Syntax Analysis Reductions
Semantic Action Routines
3. รูปแบบตัวกลาง (Intermediate Forms)
Parse Tree
Matrix
4. กำหนดการจัดเก็บ (Storage Allocation)
Storage Assignment Static, Dynamic Allocation
5. การสร้างรหัสภาษาเครื่อง (Code Generation)
Code Generation Code Production Table
Optimization
• Machine-Independent
• Machine-Dependent
รูปแบบทั่วไปของตัวแปลภาษา (General Model of Compilers)
1. Lexical Analysis
recognition of basic elements and creation of Uniform Symbols
2. Syntax Analysis
recognition of basic constructs through Reductions
3. Interpretation
definition of exact meaning, creation of Matrix and tables by Action Routines
4. Machine Independent Optimization
creation of more optimal Matrix
ขั้นที่ 1 - 4 เป็นช่วงของ Machine-independent Phase
5. Storage Assignment
modification of Identifier and Literal Tables. It makes entries in the Matrix that allow Code Generation to create code that allocates dynamic storage, and that also allow the Assembly phase to reserve the proper amounts of STATIC storage
6. Code Generation
use of macro processor to produce more optimal assembly codes
7. Assembly and Output
resolving symbolic addresses (labels) and generating machine language
ขั้นที่ 5 - 7 เป็นช่วงของ Machine-dependent Phase
เป้าหมายที่ 1. Object Code 2. Amount of Cores 3. Time to Execute
ซึ่งทั้งสามประการนี้มักจะก่อให้เกิดข้อขัดแย้งกันอยู่บ้างในตัวกว่าจะได้มา
สรุป โครงสร้างข้อมูลที่ใช้งานกับตัวแปลภาษา
A. Source Code
B. Uniform symbol Table
created by Lexical Analysis (List of Tokens) used for Syntax Analysis and Interpretation
C. Terminal Table
permanent table-list of all keywords and special symbols (pointed to by Uniform Symbols)
D. Identifier Table
all variables and temporary storage with information creation by Lexical Analysis
modified by Interpretation and Storage Allocation
referenced by Code Generation and Assembly
E. Literal Table similar to D.
F. Reductions
permanent table of decision rules in form of patterns for matching with the Uniform Symbols Table to discover syntactic structure
G. Matrix
intermediate form which created by Action Routines, optimized and then
used for Code Generation
H. Code Production
permanent table of definition, one entry defining code for each possible matrix operator
I. Assembly Code
created by Code Generation input to assembly phase (assembler)
J. Relocatable Object Code
final output of assembly phase ready to be used as input to Loader
วัตถุประสงค์
1. แสดงรูปแบบจำลองของโปรแกรมตัวแปลภาษา เพื่อใช้ประกอบการศึกษาและวางพื้นฐานการออกแบบ
2. สร้างความเข้าใจ เพื่อให้เห็นคุณค่าของการใช้ภาษาคอมพิวเตอร์ และความยากง่ายในการใช้ภาษาอย่างมีประสิทธิภาพ
ดังนั้นจึงแบ่งเนื้อหาออกเป็นดังนี้
Part I แนะนำหลักการทั่วไปและแบบจำลองของโปรแกรมตัวแปลภาษา
Part II แสดงตัวอย่างการออกแบบและการทำงานของโปรแกรมตัวแปลภาษา
Part III การจัดการโครงสร้างข้อมูล, Recursion, Storage Allocation, Block Structure, Conditions และ Pointers ที่นำมาประยุกต์ใช้ในการทำงานกับรูปแบบจำลองตัวแปลภาษา
Computer Languages
Structure of Computer Languages
1. Character Set
• Alphabetic Symbols
• Special Characters
2. Data Types
• Constants or Literals
• Numeric
Fixed-point or Integer such as Positive, Zero, Negative
Floating-point or Real such as Single or Double Precision
Complex
• Character String such as bits or bytes string manipulation
• Logical
• Others Data Types
3. Data Structures
• Arrays, Stacks
• File Structures such as organizing in Sequential, Random, Inverted Files
• Pointers
• Procedures and Functions
4. Naming and any Rules
5. Operators and Internal Functions
• Arithmetic Operators such as +, -, *, /, DIV, MOD, ^
• Logical Operators such as NOT, AND, OR, XOR
• String Operators such as concatenate, search, extract, replace of string
6. Structure of Statement Lines and Program
7. Statements or Commands or Instructions
• Declarative Statements
• Assignment Statements
• Control Statements
• Conditional Statements
• I/O Statements
• Debugging or Compiler-directive Statements
• Others
Part I
PL/I Program
WCM: PPROCEDURE (RATE,START,FINISH);
DECLARE (COST,RATE,START,FINISH) FIXED BINARY(31) STATIC;
COST = RATE * (START – FINISH) + 2 * RATE * (START – FINISH – 100);
RETURN (COST);
END;
ตัวแปลภาษาจะต้องทำอย่างไรกับโปรแกรม WCM นี้ เพื่อให้ได้มาซึ่งโปรแกรมคำสั่งภาษาเครื่อง
1. แยกแยะ กระจาย String ให้ได้ Basic Elements (or Tokens)
WCM -------- Label
PROCEDURE -------- Keyword
COST -------- Variable or Identifier
= -------- Operator
2. ตรวจสอบ จดจำรูปแบบประโยคคำสั่ง (Syntactic Construction) เพื่อหาความหมายของการสั่งงาน (Semantic)
คำสั่งแรก เป็นคำสั่ง PROCEDURE พร้อมค่า Arguments สามตัว
คำสั่งที่สอง เป็นคำสั่งอธิบายตัวแปรพร้อมคุณสมบัติที่จะใช้งาน
คำสั่งที่สาม เป็นการกำหนดค่านิพจน์เลขคณิตแก่ตัวแปร COST
คำสั่งที่สี่ เป็นการส่งค่าตัวแปรกลับไปยังโปรแกรมที่เรียกใช้
คำสั่งที่ห้า แสดงการจบชุดของคำสั่งนี้
3. กำหนดพื้นที่และตำแหน่งของหน่วยความจำให้แก่ค่าคงที่ ตัวแปรต่างๆ
4. จัดสร้างชุดคำสั่งภาษาเครื่องที่เหมาะสมถูกต้อง
1. Recognizing Basic Element
Lexical Analysis parsing the source program into the proper syntaxtic classes (Scan)
วิเคราะห์คำ โดยการแยกแยะ String ออกเป็นคำ ๆ (Tokens or Basic Elements) โดยอาศัยตัว Separators ซึ่งได้แก่ ช่องว่าง (Blank or Spaces) โอเปอเรเตอร์ (Operators) สัญลักษณ์พิเศษที่ใช้คั่นวรรคตอน (Punctuation Symbols or Special Symbol) เพื่อแยกประเภทของ Elements ดังกล่าว
• Identifiers
• Literals
• Terminal Symbols เช่น Operators, Keywords, แล้วจัดสร้างเป็น Uniform Symbols (Token ที่มีขนาดไม่คงที่จัดการลำบาก จึงสร้าง Uniform Systems ซึ่งมีขนาดคงที่)
Lexical Analysis : หมายถึง 1 Token
Uniform Symbol = is the same size
2. Recognizing Syntactic Units and Interpreting Meaning
Basic Syntactic Constructs (Token)
WCM : PROCEDURE ( RATE , START , FINISH ) ;
Valid Statement
DECLARE ( COST , RATE , START , FINISH ) FIXED BINARY ( 31 ) STATIC ;
Valid Statement
COST = RATE * ( START - FINISH ) + 2 * RATE * ( START - FINISH -
100 ) ;
Valid Statement
RETURN ( COST ) ;
Valid Statement
END ;
Valid Statement
หน้าที่
- ตรวจสอบ จดจำ วลีคำสั่ง Syntactic Constructs Syntactic Phrase
- แปลความหมายในการสั่งทำงาน (Interpret the Meaning)
วิธีการ
Semantic - Intermediate Form
Reduction Rules
Action Routines
(ใช้กฎ Reductions เพื่อกำหนดรูปแบบประโยคคำสั่ง ว่าประกอบขึ้นมาด้วย ดครงสร้างพื้นฐานอะไรบ้าง แล้วควรจะเรียกใช้รูทีนส่วนไหน (Action Routines) ของตัวแปลภาษามาทำงานในการตีความหมายต่อไป)
Intermediate Forms
ประโยชน์
ช่วยในการ Optimization และยังทำให้การ Optimization แบ่งการทำงานของตัวแปลภาษาออกเป็นการทำงาน 2 ส่วน คือ Machine-Independent (Lexical Analysis, Syntax Analysis, Interpretation)
กับ Machine-dependent (Storage Allocation, Code Generation, Assembly)
การสร้าง Intermediate Forms ขึ้นอยู่กับโครงสร้างของ Syntactic Constructs สามรถแบ่งได้เป็น 3 ชนิด
- Arithmetic Statements
- Non-arithmetic Statements
- Non-Executable Statements
Arithmetic Statements
COST = RATE * ( START - FINISH ) + 2 * RATE * ( START - FINISH -
100 ) ;
1. Parse Tree เป็นการนำ Binary Tree มาประยุกต์ใช้กับ Binary Operator ( +, -, *, /, **)
โดยให้ Root Node เป็น Operator
Left-son Node เป็น Operand ตัวแรก
Right-son Node เป็น Operand ตัวที่สอง
2. Matrix
สำหรับ Arithmetic Statements
Index Operator Operand-1 Operand-2
M1 - START FINISH
M2 * RATE M1
M3 * 2 RATE
M4 - START FINISH
M5 - M4 100
M6 * M3 M5
M7 + M2 M6
M8 = COST M7
สำหรับ Non-Arithmetic Statements
Source Statement : RETURN (COST);
END;
จะได้ Matrix ดังนี้
Index Operator Operand-1 Operand-2
M1 RETURN COST
M2 END
คำสั่งอื่นๆ เช่น คำสั่ง DO, IF, GO TO เป็นต้น
สำหรับ Non-Executable Statements
No Intermediate Form but have some table of information about Identifiers
เช่น คำสั่ง DECLARE ของภาษา PL/I
คำสั่ง DIMENSION ของภาษา FORTRAN, BASIC
Storage Assignment
หน้าที่
Code Generation
Matrix Line. Matrix Entry Generated Codes
L 1,START
1. - START FINISH S 1,FINISH
ST 1,M1
L 1,RATE
2. * RATE M1 M 0,M1
ST 1,M2
L 1,=F’2’
3. * 2 RATE M 0,RATE
ST 1,M3
L 1,START
4. - START FINISH S 1,FINISH
ST 1,M4
L 1,M4
5. - M4 100 S 1,=F’100’
ST 1,M5
L 1,M3
6. * M3 M5 M 0,M5
ST 1,M6
L 1,M2
7. + M2 M6 A 1,M6
ST 1,M7
L 1,M7
8. = COST M7 ST 1,COST
(Length = 92 Bytes)
Optimization (Machine-independent)
จากตัวอย่างของ Matrix โปรแกรมชุดคำสั่งของ WCM ปรากฎว่ามีนิพจน์ย่อย 2 ตัวที่ซ้ำกันคือนิพจน์ย่อย START - FINISH เนื่องจากนิพจน์ดังกล่าวให้ผลลัพธ์ในการทำงานเหมือนกัน ดังนั้นจึงสามารถตัดออกจาก Matrix ได้ แล้วปรับปรุงการอ้างอิงแทนกันให้ถูกต้องต่อไป เรียกวิธีการจัดการแบบนี้ว่า Eliminate of Common Subexpression
Matrix with common subexp. Matrix after eliminate of common subexp.
1. - START FINISH 1. - START FINISH
2. * RATE M1 2. * RATE M1
3. * 2 RATE 3. * 2 RATE
4. - START FINISH 4.
5. - M4 100 5. - M1 100
6. * M3 M5 6. * M3 M5
7. * M2 M6 7. * M2 M6
8. = COST M7 8. = COST M7
วิธีอื่นๆ ได้แก่
- Compile Time Computation of Operations both of whose operands are constants.
- Movement of computations involving nonvarying operands out of loops.
- Use of the properties of Boolean expressions to minimize their computation. Etc.
นิยมแยกออกเป็นอีกขั้นตอนการทำงานหนึ่งก่อนที่จะนำ Matrix ไปดำเนินการในขั้น Code Generation ต่อไป
Optimization (Machine-dependent)
พิจารณาจากตัวอย่าง
1. สามารถลดการใช้ Temporary Storage สำหรับจัดเก็บค่าผลลัพธ์ของการคำนวณรายการใน Matrix ได้ โดยการไม่พยายามที่จะจัดเก็บผลการคำนวณไว้ในหน่วยความจำ (Store)
(คำสั่ง L และ ST เดิมใช้ถึง 14 คำสั่ง เมื่อทำการ Optimize แล้ว จะเหลือเพียง 5
คำสั่งเท่านั้น)
2. สามารถใช้คำสั่งที่สั้นลง แต่ทำงานได้รวดเร็วขึ้นกว่าเดิมอีก
(เช่น แทนที่จะใช้คำสั่ง M ก็ใช้คำสั่ง MR แทนได้)
นอกจากจะลดพื้นที่ขนาดโปรแกรมแล้ว ยังช่วยลดเวลาการ execute ลงไปอีกด้วยถึงเกือบสองเท่า
ปกติการ Optimization มักจะทำควบคู่ไปพร้อมกับการทำ Code Generation นอกจากนั้นแล้วยังน่าที่จะนำเอาเทคนิคของ Conditional Macro Pseudo-ops มาประยุกต์ผสมใช้ด้วย จะช่วยทำให้การสร้าง Code มีความยืดหยุ่น มีประสิทธิภาพมากยิ่งขึ้นอีก
Assembly Phase
ค่าคงที่ (Literals) และตัวแปรตำแหน่ง (Symbolic Address) สำหรับผู้อ่านโปรแกรมอาจจะดูเหมือนง่าย แต่สำหรับตัวแปลภาษาแล้วจะต้องสร้างคำสั่งภาษาเครื่องที่ถูกต้องเสมอ
ตัวแปลภาษาสามารถที่จะใช้วิธีการสร้างค่าคงที่ และ ตัวแปรต่างๆ โดยใช้วิธีการอ้างอิงไปยังตำแหน่งที่จัดเก็บค่าคงที่ และ ตัวแปรดังกล่าวในช่วงของการทำ Storage Allocation ได้ แต่อย่างไรก็ตาม ตัวแปลภาษาก็ไม่สามารถที่จะกำหนดค่าที่แท้จริงของ Labels ได้ จนกว่าจะมีการสร้าง Code ทั้งหมกเสร็จเรียบร้อยเสียก่อน
ดังนั้นจริงๆ แล้วการทำงานในขั้น Code Generation จึงต้องทำหน้าที่ 2 อย่าง
1. Generating Code
2. Defining Labels and resolving all references
เมื่อข้อ 1. คือการทำ Code Generation Phase ที่เราได้กล่าวผ่านมาแล้ว ส่วนข้อ 2. จึงเป็นหน้าที่ของ Assembly Phase ซึ่งในทางปฎิบัติจริงๆ แล้วก็คือ Pass 2 ของ Assembler นั่นเอง
สรุปการทำงาน Part I ของตัวแปลภาษา
ลักษณะงานและปัญหา (Statement of Problem)
1. การแยกประเภทของข้อความ คำสั่งต่างๆ
(Recognizing Basic Elements)
Lexical Analysis Terminal Table
2. ตรวจสอบความถูกต้องของคำสั่งและความหมาย
(Recognizing Syntactic Unit and Interpreting Meaning)
Syntax Analysis Reductions
Semantic Action Routines
3. รูปแบบตัวกลาง (Intermediate Forms)
Parse Tree
Matrix
4. กำหนดการจัดเก็บ (Storage Allocation)
Storage Assignment Static, Dynamic Allocation
5. การสร้างรหัสภาษาเครื่อง (Code Generation)
Code Generation Code Production Table
Optimization
• Machine-Independent
• Machine-Dependent
รูปแบบทั่วไปของตัวแปลภาษา (General Model of Compilers)
1. Lexical Analysis
recognition of basic elements and creation of Uniform Symbols
2. Syntax Analysis
recognition of basic constructs through Reductions
3. Interpretation
definition of exact meaning, creation of Matrix and tables by Action Routines
4. Machine Independent Optimization
creation of more optimal Matrix
ขั้นที่ 1 - 4 เป็นช่วงของ Machine-independent Phase
5. Storage Assignment
modification of Identifier and Literal Tables. It makes entries in the Matrix that allow Code Generation to create code that allocates dynamic storage, and that also allow the Assembly phase to reserve the proper amounts of STATIC storage
6. Code Generation
use of macro processor to produce more optimal assembly codes
7. Assembly and Output
resolving symbolic addresses (labels) and generating machine language
ขั้นที่ 5 - 7 เป็นช่วงของ Machine-dependent Phase
เป้าหมายที่ 1. Object Code 2. Amount of Cores 3. Time to Execute
ซึ่งทั้งสามประการนี้มักจะก่อให้เกิดข้อขัดแย้งกันอยู่บ้างในตัวกว่าจะได้มา
สรุป โครงสร้างข้อมูลที่ใช้งานกับตัวแปลภาษา
A. Source Code
B. Uniform symbol Table
created by Lexical Analysis (List of Tokens) used for Syntax Analysis and Interpretation
C. Terminal Table
permanent table-list of all keywords and special symbols (pointed to by Uniform Symbols)
D. Identifier Table
all variables and temporary storage with information creation by Lexical Analysis
modified by Interpretation and Storage Allocation
referenced by Code Generation and Assembly
E. Literal Table similar to D.
F. Reductions
permanent table of decision rules in form of patterns for matching with the Uniform Symbols Table to discover syntactic structure
G. Matrix
intermediate form which created by Action Routines, optimized and then
used for Code Generation
H. Code Production
permanent table of definition, one entry defining code for each possible matrix operator
I. Assembly Code
created by Code Generation input to assembly phase (assembler)
J. Relocatable Object Code
final output of assembly phase ready to be used as input to Loader
0 comments:
Post a Comment