QUY TRÌNH DỊCH CHƯƠNG TRÌNH

I/ ĐỊNH NGHĨA

Quy trình dịch là quá trình chuyển đổi từ ngôn ngữ bậc cao(C/C++, Pascal, Java, C#,..) sang ngôn ngữ đích (ngôn ngữ máy) để máy tính có thể hiểu và thực thi.

II/ HOẠT ĐỘNG

Một quy trình dịch gồm ba giai đoạn:

– Giai đoạn tiền xử lý(preprocessing)

– Giai đoạn dịch(compiling)

– Giai đoạn liên kết(linking)

1/ Giai đoạn tiền xử lí:

Giai đoạn tiền xử lí (preprocessing) thực hiện:

+Nhận mã nguồn

+Xoá bỏ tất cả chú thích của chương trình

+Chỉ thị tiền xử lí (bắt đầu bằng #) cũng được xử lí

Ví dụ:  Chỉ thị #include cho phép ghép thêm mã chương trình của một tệp tiêu đề vào mã nguồn cần dịch. Các hằng số được định nghĩa bằng #define sẽ được thay thế bằng giá trị cụ thể tại mỗi nơi sử dụng trong chương trình.

2/ Giai đoạn dịch:

Gồm 2 công đoạn:

Công đoạn dịch NNBC:

+Phân tích cú pháp của mã nguồn NNBC

+Chuyển chúng sang dạng mã Assemly là môt ngôn ngữ bậc thấp gần với tập lệnh của bộ vi xử lí.

Công đoạn dịch Assembly:

+Dịch chương trình => mã máy.

+Một tệp mã máy (.obj) sinh ra trong hệ thống sau đó.

3/ Giai đoạn liên kết:

Trong giai đoạn này mã máy của một chương trình dịch từ nhiều nguồn khác nhau được liên kết lại với nhau để tạo thành chương trình đích duy nhất.

Mã máy của các hàm thư viện gọi trong chương trình cũng được đưa vào chương trình cuối trong giai đoạn này.

III/ Phân tích chương trình nguồn

Sự phân tích chương trình nguồn của trình biên dịch bao gồm nhiều pha. Các pha theo lý thuyết ngôn ngữ là:

Phântíchtừvựng:

+Chia nhỏ các dòng mã nguồn -> thẻ khóa

+Mỗi thẻ khóa đại diện cho cho một đơn vị không thể chia nhỏ của ngôn ngữ.

Thí dụ: một từ khóa, một kí hiệu nhận dạng hay một tên kí hiệu. Các thẻ khoá nhận biết bằng máy hữu hạn trạng thi.

Phântíchcúpháp: Nhận diện các cấu trúc cú pháp của mã nguồn. Nó chỉ tập trung lên cấu trúc. Nói cách khác, nó nhận diện trật tự sắp xếp của các thẻ khóa và hiểu cấu trúc thứ bậc trong bộ mã.

Phântích ý nghĩa: Dùng để nhận biết ý nghĩa của chương trình (mã nguồn) và bắt đầu chuẩn bị cho ra kết quả. Trong pha này, sự kiểm tra về kiểu được hoàn tất và hầu hết các lỗi dịch được nêu ra.

Biểutrưngtrunggian:

Đây là một dạng tương đương của chương trình nguyên thủy đã được chuyển thành và gọi là biểu trưng trung gian. Biểu trưng này có thể là một cấu trúc dữ liệu (thường là dạng cây hay dạng biểu đồ hay một dạng ngôn ngữ trung gian.)

IV/ Ý nghĩa

Vấn đề ở đây là tại sao ta lại có 3 giai đoạn dich chương trình mà không hợp thành 1 giai đoạn duy nhất gồm cả Preprocessing Compiling và liking?

Thứ nhất, Việc giữ chức năng riêng biệt sẽ làm giảm sự phức tạp của trình dịch.

Thứ hai, Một lợi thế rõ ràng hơn rằng: Điều này cho phép tạo ra các chương trình lớn mà không cần phải làm lại các bước biên dịch mỗi lần một tập tin được thay đổi.

Thứ ba, điều này sẽ làm đơn giản việc thực hiện các thư viện mã nguồn trước khi biên dịch: chỉ cần tạo các object file và liên kết chúng giống như bất kỳ tập object file khác.

Việc thực thi như vậy được gọi là ” mô hình thực thi riêng biệt”.

Cuối cùng, ta dễ dàng tìm kiếm lỗi hơn và sửa chữa chúng:

•Trong giai đoạn dịch, các lỗi cú pháp chương trình sẽ được phát hiện và thông báo cho người sử dụng.
•Trong giai đoạn liên kết lỗi liên quan đến việc gọi hàm hay sử dụng biến tổng thể mà không tồn tại sẽ bị phát hiện. Kể cả lỗi viết chương trình chính không có hàm main() cũng được phát hiện.

V/ Dịch trong Command Line

Để biên dịch một file *.c hay *.cpp bằng cửa sổ Command Line, ta sẽ sử dụng Visual studio command Prompt:

Chọn “Start”, chọn vào thư mục “Visual studio 2010”(hay 2008, 2005), chon vào “Visual studio tools” thì sẽ thấy có chương trình “Visual studio command Prompt”.

1./ Biên dịch (bao gồm cả Preprocessing Compiling và Linking):

-Gõ lệnh như sau:

cl *.c (hay *.cpp) với * là tên mã nguồn chương trình cần biên dịch rồi press enter.

Vd: File mã nguồn tên là: hello.c

Cú pháp:  cl hello.c

2./ Chạy tiền xử lý, dịch và liên kết riêng rẽ:

Gõ lệnh như sau:

Preprocessing: cl /E *.c (hay *.cpp)

Compiling:  cl /c *.c (hay *.cpp)

Linking: link *.obj

Với * là tên mã nguồn chương trình cần biên dịch hay đối tượng cần liên kết rồi press enter. Nếu có nhiều file ta gõ tên các file liên tiếp, cách nhau 1 dấu cách.

Ví dụ: Với chương gồm có Main.cpp, tong.cpp,Tong.h. Ta thực hiện quá trình dịch và liên kết như sau:

Leave a comment