Thứ Bảy, 11 tháng 5, 2013

Bài 2: Cấu trúc của một compiler

Một compiler có 5 đoạn chính :

  1. Lexical Analysis (Phân tích từ vựng)
  2. Parsing (Phân tích cú pháp)
  3. Semantic Analysis (Phân tích ngữ nghĩa)
  4. Optimization (Tối ưu hóa)
  5. Code Generation (Sinh code)
Chúng ta sẽ cùng nhau nói về từng cái một, và để dễ hiểu chúng ta lấy qua việc tìm hiểu xem làm thế nào con người hiểu được tiếng anh. 
Bước thứ nhất là hiểu về chương trình, cả compiler và con người, là để hiểu words.
  • bước thứ nhất: nhận dạng các từ (words)
         - đơn vị nhỏ nhất phía trên letters
                           
                                  This is a sentence

Con người có thể nhìn vào đoạn ví dụ này và nhận ra ngay lập tức có 4 words 'this is a' và 'sentence'. Đó là một cách tự động, và ta thậm chí không nghĩ về nó nhưng có một phép tính toán thực sự diễn ra tại đây. Bạn phải nhận dạng được các phân cách (separators), cụ thể là các khoảng trắng (blanks) và dấu chấm câu và những đầu mối (clues) như là các chữ viết hoa. Và nhờ đó giúp bạn phân chia được các letters thành các nhóm, thành một loạt words bạn có thể hiểu được. Và nhấn mạnh rằng nó không hề tầm thường. hãy nhìn vào sentence sau:
                                 ist his ase nte nce
Bạn có thể đọc nó nhưng nó mất thời gian Bởi vì việc đặt separators không đúng vị trí, rõ ràng chúng ta có thể nhận dạng được các words như 'is', 'this', 'a', 'sentence' nhưng chúng không đến ngay lập tức, bạn thực sự phải làm một vài công việc để nhìn xem chỗ nào là nơi phân chia. Mục đích của lexical analysis:
  • Lexical analysis chia program text thành "words" hoặc "tokens"
                if x == y then z =1; else z = 2; 
Ví dụ về một mảnh program text, thanh cho một đoạn tiếng anh. Chúng ta có thể nhận dạng được tokens. Có một vài thứ rõ ràng như là keywords, giống như if, then, và else. Chúng ta cũng có tên các biến, những thứ giống như là X, Y, và Z. chúng ta còn các hằng như số 1, số 2. ngoài ra chúng ta còn có những phép tính như là phép gán (=), phép so sánh (==). và ở đây chúng ta có một câu hỏi thú vị. Làm thế nào để chúng ta biết được rằng double equals không phải là 2 individual equals signs.và làm thế nào chúng ta biết được chúng ta muốn nó (double equals) chứ không phải là 2 equals. 

Dấu ";" là một dấu kết thúc cũng là tokens và các blanks cũng vậy. 

Đối với con người, mỗi khi words được hiểu bước tiếp theo là hiểu cấu trúc của sentence. Việc đó gọi là parsing (phân tích cú pháp).
  • Mỗi khi words được hiểu, bước tiếp theo là hiểu về cấu trúc của sentence
  • Parsing = Lập biểu đồ Sentences
         - biểu đồ là một cây

Chúng ta cùng phân tích sentence sau:

    This         line               is                    a                  long                     sentence
   article       noun             verb               article            adjective               noun
          subject                   verb                                      object
                                      sentence
Bước thứ nhất là phân tích cú pháp để nhận dạng vai trò của mỗi word trong sentence. chúng ta có những thứ như danh từ, động từ, tính từ. Nhưng sau đó, công việc thực sự của parsing là nhóm words lại với nhau thành các cấu trúc bậc cao hơn. ví dụ chúng ta nhóm word 'this' và word 'line' thành subject, 'a', 'long', 'sentence' thành object, 'is' vẫn là verb. và như đã nói, biểu đồ là một cây, mà cây thì phải có rễ, rễ của cây được gọi là sentence. Đó là cách ta phân tích trong English.

if x == y, z = 1; then z = 2;

khi chúng ta parsing program text công việc cũng tương tự. chúng ta cùng parsing đoạn code phía trên. Đó là một if then else statement, vì vậy root của biểu đồ chúng ta, của cây phân tích 

Không có nhận xét nào:

Đăng nhận xét