Các chương trình máy tính là tập hợp các hướng dẫn được đưa ra cho phần cứng, để thực hiện các tác vụ. Các chương trình này hầu hết được viết bằng các ngôn ngữ cấp cao và máy tính không hiểu ngôn ngữ đó. Do đó, một trình biên dịch được sử dụng để chuyển đổi các hướng dẫn đó thành mã máy hoặc mã đích. Nó trải qua nhiều giai đoạn để xây dựng mã mục tiêu. Tối ưu hóa mã là một trong số đó. Có hai kỹ thuật tối ưu hóa như, phụ thuộc vào máy và tối ưu hóa mã độc lập với máy. Các sự khác biệt chính giữa phụ thuộc máy và tối ưu hóa mã độc lập của máy là tối ưu hóa phụ thuộc máy được áp dụng cho mã đối tượng trong khi tối ưu hóa mã độc lập của máy được áp dụng cho mã trung gian.
1. Tổng quan và sự khác biệt chính
2. Tối ưu hóa mã phụ thuộc máy là gì
3. Tối ưu hóa mã độc lập máy là gì
4. Điểm tương đồng giữa phụ thuộc máy và tối ưu hóa mã độc lập của máy
5. So sánh cạnh nhau - Phụ thuộc máy so với tối ưu hóa mã độc lập của máy ở dạng bảng
6. Tóm tắt
Khi chuyển đổi mã nguồn thành mã đối tượng hoặc mã đích, trình biên dịch sẽ trải qua một số giai đoạn. Đầu tiên, mã nguồn được trao cho bộ phân tích Lexical tạo ra mã thông báo. Sau đó, đầu ra được trao cho bộ phân tích cú pháp để điều tra xem các mã thông báo được tạo có theo thứ tự logic hay không. Đầu ra đó được trao cho máy phân tích ngữ nghĩa. Giả sử rằng có một đoạn mã là p = q + r;
Ở đây, p, q là các số nguyên, nhưng r là một số float. Sử dụng bộ phân tích ngữ nghĩa, biến số nguyên c được chuyển thành float. Do đó, nó không phân tích ngữ nghĩa. Đầu ra của bộ phân tích ngữ nghĩa đi đến trình tạo mã trung gian. Nó trả về một mã trung gian mà sau đó đi đến trình tối ưu hóa mã. Tối ưu hóa mã là quá trình loại bỏ các câu lệnh chương trình không thiết yếu mà không thay đổi ý nghĩa của mã nguồn thực tế. Nó không phải là một tối ưu hóa bắt buộc nhưng, nó có thể cải thiện thời gian chạy của mã đích. Đầu ra của trình tối ưu hóa mã được trao cho trình tạo mã và cuối cùng, mã đích được xây dựng.
Hình 01: Các giai đoạn của trình biên dịch
Trong tối ưu hóa mã phụ thuộc máy, tối ưu hóa được áp dụng cho mã nguồn. Phân bổ đủ lượng tài nguyên có thể cải thiện việc thực hiện chương trình trong tối ưu hóa này.
Khi tối ưu hóa được thực hiện trên mã trung gian, nó được gọi là tối ưu hóa mã độc lập của máy. Có các kỹ thuật khác nhau để đạt được tối ưu hóa mã độc lập của máy. Chúng được mô tả bằng các ví dụ sau.
Đọc các dòng mã dưới đây.
cho (j = 0; j<10; j ++)
b = x + 2;
a [j] = 5 * j;
Theo đoạn mã trên, b = x + 2 được tính toán lặp đi lặp lại trong mỗi lần lặp. Khi b được tính, nó không thay đổi. Vì vậy, dòng này có thể được đặt bên ngoài vòng lặp như sau.
b = x + 2;
cho (j = 0; j< 10; j++)
a [j] = 5 * j;
Đây được gọi là chuyển động mã.
Đọc các dòng mã dưới đây.
j = 5;
if (j == 10)
a = b + 20;
Theo đoạn mã trên, 'if block' sẽ không bao giờ thực thi vì giá trị j sẽ không bao giờ bằng 10. Nó đã được khởi tạo thành giá trị 5. Do đó, điều này nếu khối có thể bị xóa. Kỹ thuật này là loại bỏ mã chết.
Một phương pháp khác là giảm sức mạnh. Các phép toán số học như phép nhân đòi hỏi nhiều bộ nhớ, thời gian và chu kỳ CPU hơn. Những biểu thức đắt tiền này có thể được thay thế bằng các biểu thức rẻ tiền như b = a * 2; hoặc có thể được thay thế bằng phép cộng, b = a + a;
Tham khảo mã dưới đây.
cho (j = 1; j <= 5; j ++)
giá trị = j * 5;
Thay vì nhân, mã có thể được thay đổi như sau.
int temp = 5;
cho (j = 1; j<=5; j++)
temp = temp + 5;
giá trị = nhiệt độ;
Có thể đánh giá các biểu thức là hằng số trong thời gian chạy. Nó được gọi là gấp liên tục. Có thể nói như b [j + 1] = c [j + 1];
Thay vào đó, nó có thể được thay đổi như sau.
n = j +1;
b [n] = c [n];
Có thể có các vòng như sau.
cho (j = 0; j<5; j++)
printf (Tiếng a a n n);
cho (j = 0; j <5; j++)
printf (Tiếng b \ n));
In a và b, cả hai đều có cùng số lần lặp. Cả hai có thể được kết hợp thành một vòng lặp như sau.
cho (j = 0; j <5; j++)
printf (Tiếng a a n n);
printf (Tiếng b \ n));
Một kỹ thuật quan trọng khác là Loại bỏ biểu thức phụ phổ biến. Đó là thay thế các biểu thức giống hệt nhau bằng một biến duy nhất để thực hiện phép tính. Tham khảo mã dưới đây.
a = b * c + k;
d = b * c + m;
Mã này có thể được chuyển đổi như sau.
nhiệt độ = b * c;
a = temp + k;
d = nhiệt độ + m;
Không bắt buộc phải tính toán b * c nhiều lần. Giá trị nhân có thể được lưu trữ trong một biến và được sử dụng lại.
Máy phụ thuộc so với tối ưu hóa mã độc lập máy | |
Tối ưu hóa mã phụ thuộc máy được áp dụng cho mã đối tượng. | Tối ưu hóa mã độc lập với máy được áp dụng cho mã trung gian. |
Liên quan đến phần cứng | |
Tối ưu hóa phụ thuộc máy liên quan đến các thanh ghi CPU và tham chiếu bộ nhớ tuyệt đối. | Tối ưu hóa mã độc lập của máy không liên quan đến các thanh ghi CPU hoặc tham chiếu bộ nhớ tuyệt đối. |
Tối ưu hóa mã bao gồm hai kỹ thuật tối ưu hóa là phụ thuộc vào máy và tối ưu hóa mã độc lập với máy. Sự khác biệt giữa tối ưu hóa mã độc lập với máy và tối ưu hóa mã độc lập của máy là tối ưu hóa phụ thuộc máy được áp dụng cho mã đối tượng trong khi đó, tối ưu hóa mã độc lập của máy được áp dụng cho mã trung gian.
Bạn có thể tải xuống phiên bản PDF của bài viết này và sử dụng nó cho mục đích ngoại tuyến theo ghi chú trích dẫn. Vui lòng tải xuống phiên bản PDF tại đây Sự khác biệt giữa Phụ thuộc máy và Tối ưu hóa mã độc lập của máy
1. Thiết kế trình biên dịch | Tối ưu hóa mã. GeekforGeek. Có sẵn ở đây
2. Điểm, Hướng dẫn. Thiết kế trình biên dịch - Tối ưu hóa mã. Www.tutorialspoint.com, Điểm hướng dẫn, ngày 15 tháng 8 năm 2017. Có sẵn tại đây
3.Eududies4you. Tài liệu học tập JNTUH CSE. Sự khác biệt giữa phụ thuộc máy và tối ưu hóa mã độc lập. Có sẵn ở đây
1.'Compiler 'của I, Surachit, (CC BY-SA 3.0) qua Commons Wikimedia