Trình biên dịch hàng loạt là gì?


28

Tôi có trích dẫn sau đây từ khóa học của nhà soạn nhạc của mình (trong bối cảnh tô màu đồ thị):

Bởi vì nó chậm, màu đồ thị có xu hướng được sử dụng trong trình biên dịch hàng loạt, trong khi quét tuyến tính có xu hướng được sử dụng trong trình biên dịch JIT.

Tôi không thể tìm thấy một định nghĩa rõ ràng trực tuyến. Vì vậy, những gì làm cho một trình biên dịch là một trình biên dịch hàng loạt?


Câu hỏi đó lạc đề ở đây. softwareengineering.stackexchange.com là một nơi tốt hơn để hỏi
Basile Starynkevitch

Câu trả lời:


42

Trình biên dịch JIT (Just-In-Time) biên dịch mã vào thời gian chạy, tức là khi chương trình đang chạy. Do đó, chi phí biên dịch là một phần của thời gian thực hiện chương trình, và do đó nên được giảm thiểu.

Đối lập với điều này là trình biên dịch trước thời hạn (AOT), về cơ bản đồng nghĩa với "trình biên dịch bó". Điều này chuyển đổi mã nguồn thành mã máy và sau đó chỉ mã máy được phân phối. Do đó, trình biên dịch có thể rất chậm vì nó không ảnh hưởng đến thời gian thực hiện của chương trình kết quả.

Ngày nay, khi mọi người nói "trình biên dịch", họ thường có nghĩa là trình biên dịch AOT. Thật vậy, thuật ngữ "Trình biên dịch AOT" chỉ thực sự bắt đầu trở nên phổ biến gần đây khi mọi người bắt đầu tạo trình biên dịch AOT cho các ngôn ngữ được biên dịch JIT, đặc biệt là JavaScript. Nhiều ngôn ngữ trong số này, ví dụ C #, biên dịch sang ngôn ngữ trung gian cho VM sau đó được JIT biên dịch thành mã máy vào thời gian chạy. Thuật ngữ "Trình biên dịch AOT" có ý nghĩa rằng mã nguồn sẽ được biên dịch trực tiếp thành mã máy, do đó không cần phải có hình thức biên dịch JIT nào trong thời gian chạy.

"Trình biên dịch hàng loạt" là một chút của một thuật ngữ cổ xưa tại thời điểm này. Sự tương phản thực sự với một trình biên dịch hàng loạt khi thuật ngữ này phổ biến là một trình biên dịch gia tăng . Biên dịch tăng dần thường được liên kết với các ngôn ngữ như Lisp nơi bạn đã có REPL và bạn có thể tương tác yêu cầu triển khai ngôn ngữ để biên dịch một chức năng cụ thể. Nếu một chức năng đã được thực thi mà việc biên dịch chưa được yêu cầu trước đó, thì nó thường sẽ được giải thích. Ngược lại, một trình biên dịch bó, biên dịch tất cả các hàm cùng một lúc, tức là trong một đợt.


1
Và trở lại trong những ngày xưa, trình biên dịch không chạy tương tác, bạn phải gửi một công việc đến hàng đợi để biên dịch chương trình của mình
Neuromancer

Và một số triển khai ngôn ngữ (awk của GNU, cpython, v.v.) biên dịch toàn bộ đầu vào thành một biểu diễn bên trong như bước đầu tiên trong thời gian chạy, kết hợp một số thuộc tính được mô tả ở đây.
dmckee

1
@dmckee nhất nếu không phải tất cả các triển khai ngôn ngữ, thực sự
user253751

Một sự mơ hồ khác: Các công cụ được gọi là trình biên dịch bó tồn tại cho các hệ điều hành MSDOS, các tệp bó được biên dịch này thành các tệp thực thi ....
rackandboneman

Tất nhiên luôn luôn có một đại diện nội bộ. Nhưng đôi khi nó là một ngôn ngữ theo đúng nghĩa của nó, như trong Gcc, Llvm hoặc .Net. Điều này là do kiến ​​trúc front-end / middle / back-end, front-end biến đổi ngôn ngữ (C, C ++, Java, fortran ..) thành ngôn ngữ cấp thấp phổ biến, sau đó các thuật toán tối ưu hóa được chạy và cuối cùng, mã được tối ưu hóa này trong ngôn ngữ chung được chuyển đổi bởi back-end thành mã byte hoặc trình biên dịch, thư viện thực thi hoặc tĩnh hoặc động.
tái hợp

11

Ý nghĩa được ngụ ý trong trích dẫn bạn đưa ra! Nó bắt nguồn từ việc xử lý hàng loạt thuật ngữ điện toán được sử dụng khi tác vụ không được thực hiện trong thời gian thực, nhưng nó được lên kế hoạch để hệ điều hành thực hiện sau đó khi tải (thường cho các hoạt động thời gian thực) ít hơn.

Trình biên dịch bó là một trình biên dịch khi người dùng không chờ kết quả biên dịch. Đó là một trong những gì chúng ta sẽ nói, sử dụng thuật ngữ hiện đại hơn, được thực hiện trong nền.

Đây là điều ngược lại của một JIT (Just-In-Time) được thực hiện "trực tiếp" vào đúng thời điểm cần thiết mà không cần phải tốn thêm thời gian để xử lý triệt để hơn.

Tốc độ chậm của quá trình biên dịch hàng loạt có thể được minh họa bằng cách này:

nhập mô tả hình ảnh ở đây

Nguồn: https://xkcd.com/303/

Hoặc thậm chí này:

nhập mô tả hình ảnh ở đây

Nguồn: http://dilbert.com/strip/2013-06-22

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.