2010-12-28 28 views
8

Trong Erlang and OTP in Action (trang 46), các tác giả nêu rõ sau đây trong một lưu ý:Khi mã được biên dịch khác với hệ vỏ được đánh giá?

Có thể xảy ra trong một số trường hợp góc lẻ, mã đánh giá trong vỏ cư xử hơi khác nhau từ cùng một mã khi biên soạn như là một phần của một mô-đun. Trong trường hợp này, phiên bản được biên dịch là tiêu chuẩn vàng. Vỏ cố gắng hết sức để làm điều tương tự khi nó diễn giải các biểu thức.

Bạn có thể nghĩ một hoặc nhiều trường hợp trong số trường hợp góc lẻ này không? Đó là những khác biệt nhỏ trong những trường hợp đó?

Trả lời

7

Trình thông dịch erlang, erl_eval, cố gắng hết sức để xử lý chính xác như mã được biên dịch. Nếu nó không phải là rất có thể là một lỗi.

Ngoại trừ trong một trường hợp và đang nhận tin nhắn. Mã được biên dịch có thể truy cập các hướng dẫn nội bộ để truy cập và thao tác hàng đợi tin nhắn. Người phiên dịch không thể làm điều này. Phải: thực sự xóa thư khỏi hàng đợi (nhiều hơn hoặc ít hơn với receive X -> X end); kiểm tra chúng để xem chúng có khớp với mẫu nhận hay không; giữ những thứ không khớp; và trả lại tất cả các thư không mong muốn hiện tại vào hàng đợi (bằng cách nhận tất cả các tin nhắn và sau đó gửi lại cho chính nó). Điều này có nghĩa rằng có một thời gian ngắn trong đó nếu một tin nhắn đến nó có thể không kết thúc trong cùng một vị trí trong hàng đợi tin nhắn như cho mã biên dịch.

8

Sự khác biệt quan trọng nhất là trình bao được diễn giải trong khi mã được biên dịch là ... cũng .. được biên dịch. Điều này có sự khác biệt quan sát được về tốc độ thực thi và cách sử dụng bộ nhớ của hàm. Nói cách khác, bạn có thể thấy rằng biến thể phiên dịch chậm hơn hoặc sử dụng hết bộ nhớ của bạn trong khi phiên bản được biên dịch thì không.

Vấn đề này đã cắn nhiều lập trình viên trẻ Erlang. Anh ta hoặc cô ấy nghĩ rằng Erlang là khá chậm so với các ngôn ngữ khác, trong khi nó trong thực tế là một thử nghiệm của mã giải thích chống lại biên soạn.

Đoạn văn là biện pháp bảo vệ. Về cơ bản, trình thông dịch và trình biên dịch phải đồng ý với tất cả đầu vào/đầu ra của một hàm. Nhưng tiếc là không phải luôn luôn như vậy. Trong thực tế, trình thông dịch và trình biên dịch là các công cụ thực thi riêng biệt và do đó có thể khác nhau. Nếu bạn bản địa biên dịch thông qua HiPE, những thay đổi có thể còn lớn hơn. Thông thường các vấn đề phát sinh xung quanh các số dấu phẩy động IEEE 754.

+1

Một trường hợp mà sự khác biệt tốc độ có thể giúp bạn có được sự vui nhộn được tạo trong trình bao. Chúng không được biên soạn và sẽ luôn được diễn giải ngay cả khi được chuyển thành mã được biên dịch. – rvirding

Các vấn đề liên quan