2012-07-11 26 views
11

Tôi đang làm việc bằng ngôn ngữ lập trình đồ chơi của riêng mình. Bây giờ tôi đang giải thích ngôn ngữ nguồn từ AST và tôi tự hỏi những gì lợi thế biên dịch thành một mã byte và sau đó giải thích nó có thể cung cấp cho tôi.Động lực đằng sau việc biên dịch mã byte là gì?

Để bây giờ tôi có ba điều trong tâm trí:

  • Vượt qua hàng trăm cây cú pháp của thời gian có thể chậm hơn so với chạy hướng dẫn trong một mảng, đặc biệt là nếu sự hỗ trợ mảng O (1) truy cập ngẫu nhiên (ví dụ. nhảy 10 hướng dẫn lên và xuống).
  • Trong môi trường thực thi đã nhập, tôi có một số chi phí thời gian chạy vì AST của tôi được nhập và tôi liên tục duyệt qua (ví dụ: tôi có 10 loại nút và tôi cần kiểm tra loại hiện tại của mình là thi hành). Có thể biên dịch thành một mã byte không định dạng có thể giúp cải thiện điều này, vì sau khi kiểm tra kiểu và biên dịch, tôi sẽ có một giá trị và mã không được nhập.
  • Việc biên dịch thành mã byte có thể cung cấp khả năng di động tốt hơn.

Điểm của tôi có chính xác không? Một số động lực khác đằng sau việc biên dịch bytecode là gì?

+0

Bằng cách chạy trên trình diễn giải nó làm tăng tính di động của mã của bạn – Luis

+0

@Luis, vâng điều này đã có trong tâm trí của tôi, tôi quên thêm .. – sinan

+0

@Luis: đó là không có thật. Các AST được tuần tự hóa có thể được thực hiện như nhau. Bytecode có thể trong thực tế không được di động; Mã byte bytecode cụ thể cho từng phiên bản của trình thông dịch. –

Trả lời

5

Tốc độ là lý do chính; việc giải thích AST chỉ là quá chậm trong thực tế.

Một lý do khác để sử dụng bytecode là nó có thể được tuần tự hóa theo thứ tự (được lưu trữ trên đĩa), để bạn có thể phân phối nó. Đây là những gì Java làm.

+0

hmm, do đó, về cơ bản là điều này. Tôi đã hy vọng tìm thấy một số động lực thú vị khác. – sinan

+0

"Đây là những gì Java làm". python không? –

6

Điểm tạo mã byte (hoặc bất kỳ biểu mẫu "dễ hiểu nào khác" như mã luồng) về cơ bản là hiệu suất. Đối với một intepreter AST để quyết định phải làm gì tiếp theo, nó cần phải đi qua cây, kiểm tra các nút, xác định loại nút, kiểm tra loại toán hạng bất kỳ, xác minh tính hợp pháp và quyết định trường hợp đặc biệt nào của AST- nhà điều hành được chỉ định áp dụng (nó nói "+", nhưng nó có nghĩa là thêm 16 bit hoặc chuỗi nối?), trước khi nó cuối cùng thực hiện một số hành động.

Nếu có hành động cuối cùng và tạo ra một số loại cấu trúc dễ diễn giải, thì tại thời điểm "thực thi", thông dịch viên có thể tập trung đơn giản vào thực hiện các hành động mà không cần xác định/xác định trường hợp đặc biệt.

Một lý do gần đây khác là nếu bạn tạo mã byte cho bất kỳ một số máy ảo nổi tiếng (JVM, MSIL, Parrot, v.v.), bạn thậm chí không cần phải mã hóa trình thông dịch. Đối với JVM và MSIL, bạn cũng nhận được lợi ích của các trình biên dịch JIT liên kết với chúng, và với thiết kế cẩn thận về ngôn ngữ của bạn, khả năng tương thích với các thư viện lớn, đó là điểm thu hút thực sự của Java và C#.

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