Trong phong cách chức năng, luồng giá trị thông qua một chương trình là rất, rất rõ ràng (cho cả trình biên dịch và lập trình viên). Điều này cung cấp cho trình biên dịch rất nhiều thời gian để quyết định nơi lưu trữ các giá trị, thời gian giữ chúng xung quanh, v.v.
Trong một ngôn ngữ bắt buộc, trình biên dịch hứa hẹn cho lập trình viên một mô hình trong đó hầu hết các biến tương ứng với các vị trí thực tế trong bộ nhớ tồn tại trong suốt vòng đời xác định. Có khả năng, bất kỳ câu lệnh nào cũng có thể đọc từ (hoặc ghi vào!) Bất kỳ vị trí nào trong số các vị trí này, vì vậy trình biên dịch chỉ có thể thay thế các vị trí bộ nhớ bằng phân bổ đăng ký, hợp nhất hai biến vào một vị trí lưu trữ hoặc thực hiện tối ưu hóa tương tự sau khi thực hiện phân tích khó khăn về nơi khác trong chương trình mà biến có thể được tham chiếu.
Bây giờ, có hai hãy cẩn thận:
- Cộng đồng ngôn ngữ lập trình đã dành (lãng phí?) Rất nhiều nỗ lực trong năm mươi năm qua để phát triển các cách thông minh để thực hiện phân tích này. Có những thủ thuật nổi tiếng như đăng ký tô màu và vv để có được một số trường hợp dễ dàng hơn được thực hiện hầu hết thời gian; nhưng điều này làm cho các trình biên dịch lớn, chậm và sự đánh đổi liên tục về độ phức tạp của quá trình biên dịch đối với chất lượng của mã kết quả
- Đồng thời, hầu hết các ngôn ngữ lập trình chức năng cũng không hoàn toàn là chức năng; rất nhiều điều mà các chương trình thực sự cần làm, như trả lời I / O vốn không có chức năng, vì vậy không có trình biên dịch nào có thể hoàn toàn không có các thủ thuật này và không có ngôn ngữ nào tránh được chúng hoàn toàn - ngay cả Haskell, cũng hơi khó hoàn toàn phù hợp với sở thích của tôi (Your Mileage May Vary) chỉ có thể kiểm soát và loại bỏ các phần không có chức năng trong mã của bạn, không thể tránh chúng hoàn toàn.
Nhưng để trả lời câu hỏi chung, vâng, một mô hình chức năng cung cấp cho trình biên dịch rất nhiều sự tự do để tối ưu hóa mà nó không có trong một thiết lập bắt buộc.