Cuốn sách tốt nhất để trả lời câu hỏi của bạn có lẽ là: Cooper và Torczon, "Engineering a Compiler", 2003. Nếu bạn có quyền truy cập vào thư viện trường đại học, bạn sẽ có thể mượn một bản sao.
Trong một trình biên dịch sản xuất như llvm hoặc gcc, các nhà thiết kế cố gắng hết sức để giữ tất cả các thuật toán bên dưới trong đó n là kích thước của đầu vào. Đối với một số phân tích cho các giai đoạn "tối ưu hóa", điều này có nghĩa là bạn cần sử dụng phương pháp phỏng đoán thay vì tạo mã thực sự tối ưu.Ô ( n2)viết sai rồi
Lexex là một máy trạng thái hữu hạn, vì vậy kích thước của đầu vào (tính bằng ký tự) và tạo ra một luồng mã thông báo O ( n ) được truyền cho trình phân tích cú pháp.Ô ( n )Ô ( n )
Đối với nhiều trình biên dịch cho nhiều ngôn ngữ, trình phân tích cú pháp là LALR (1) và do đó xử lý luồng mã thông báo theo thời gian theo số lượng mã thông báo đầu vào. Trong quá trình phân tích cú pháp, bạn thường phải theo dõi bảng ký hiệu, nhưng, đối với nhiều ngôn ngữ, có thể được xử lý bằng một chồng bảng băm ("từ điển"). Mỗi lần truy cập từ điển là O ( 1 ) , nhưng đôi khi bạn có thể phải đi bộ ngăn xếp để tìm kiếm một biểu tượng. Độ sâu của ngăn xếp là O ( s ) trong đó s là độ sâu lồng của các phạm vi. (Vì vậy, trong các ngôn ngữ giống như C, bạn có bao nhiêu lớp niềng răng xoăn.)Ô ( n )Ô ( 1 )Ô ( s )S
Sau đó, cây phân tích thường được "làm phẳng" thành một biểu đồ luồng điều khiển. Các nút của biểu đồ luồng điều khiển có thể là các lệnh 3 địa chỉ (tương tự như ngôn ngữ lắp ráp RISC) và kích thước của biểu đồ luồng điều khiển thường sẽ là tuyến tính theo kích thước của cây phân tích cú pháp.
Sau đó, một loạt các bước loại bỏ dự phòng thường được áp dụng (loại bỏ phổ biến phụ, chuyển động mã bất biến vòng lặp, lan truyền liên tục, ...). (Điều này thường được gọi là "tối ưu hóa" mặc dù hiếm khi có kết quả tối ưu, mục tiêu thực sự là cải thiện mã càng nhiều càng tốt trong giới hạn không gian và thời gian mà chúng tôi đã đặt trên trình biên dịch.) Mỗi bước loại bỏ dự phòng sẽ thường yêu cầu bằng chứng về một số sự thật về biểu đồ luồng điều khiển. Những bằng chứng này thường được thực hiện bằng cách sử dụng phân tích luồng dữ liệu . Hầu hết các phân tích luồng dữ liệu được thiết kế sao cho chúng sẽ hội tụ trong đi qua biểu đồ luồng trong đó dÔ ( d)Cười mở miệnglà (đại khái) độ sâu lồng vòng lặp và vượt qua biểu đồ luồng mất thời gian trong đó n là số lượng lệnh 3 địa chỉ.Ô ( n )viết sai rồi
Để tối ưu hóa tinh vi hơn, bạn có thể muốn thực hiện các phân tích tinh vi hơn. Tại thời điểm này, bạn bắt đầu chạy vào sự đánh đổi. Bạn muốn các thuật toán phân tích của bạn mất ít hơn nhiều so với Ô ( n2)thời gian trong kích thước của biểu đồ luồng của toàn chương trình, nhưng điều này có nghĩa là bạn cần thực hiện mà không có thông tin (và các biến đổi cải tiến chương trình) có thể tốn kém để chứng minh. Một ví dụ kinh điển về điều này là phân tích bí danh, trong đó đối với một số cặp ghi nhớ bạn muốn chứng minh rằng hai lần ghi đó không bao giờ có thể nhắm mục tiêu vào cùng một vị trí bộ nhớ. (Bạn có thể muốn thực hiện phân tích bí danh để xem liệu bạn có thể di chuyển một lệnh này sang hướng dẫn khác không.) Nhưng để có được thông tin chính xác về bí danh, bạn có thể cần phân tích mọi đường dẫn điều khiển có thể thông qua chương trình, theo cấp số mũ trong chương trình (và do đó theo cấp số nhân về số lượng nút trong biểu đồ luồng điều khiển.)
Tiếp theo bạn nhận được vào phân bổ đăng ký. Phân bổ đăng ký có thể được coi là một vấn đề tô màu đồ thị và tô màu cho một đồ thị với số lượng màu tối thiểu được gọi là NP-Hard. Vì vậy, hầu hết các trình biên dịch sử dụng một số loại heuristic tham lam kết hợp với tràn đăng ký với mục tiêu giảm số lượng tràn đăng ký tốt nhất có thể trong giới hạn thời gian hợp lý.
Cuối cùng, bạn nhận được vào việc tạo mã. Việc tạo mã thường được thực hiện một khối cơ bản tối đa tại một thời điểm trong đó một khối cơ bản là một tập hợp các nút biểu đồ luồng điều khiển được kết nối tuyến tính với một mục nhập duy nhất và một lối thoát duy nhất. Điều này có thể được định dạng lại dưới dạng vấn đề bao gồm biểu đồ trong đó biểu đồ bạn đang cố gắng che là biểu đồ phụ thuộc của bộ hướng dẫn 3 địa chỉ trong khối cơ bản và bạn đang cố gắng che bằng một bộ biểu đồ đại diện cho máy có sẵn hướng dẫn. Vấn đề này là theo cấp số nhân về kích thước của khối cơ bản lớn nhất (về nguyên tắc, có thể có cùng thứ tự với kích thước của toàn bộ chương trình), do đó, điều này một lần nữa thường được thực hiện với phương pháp phỏng đoán trong đó chỉ có một tập hợp con nhỏ của các lớp phủ có thể kiểm tra.