Mozilla Corporation*
{gal,brendan,shaver,danderson,dmandelin,mrbkap,graydon,bz,jorendorff,jruderman}@mozilla.com
Adobe Corporation#
{edwsmith,rreitmai}@adobe.com
Intel Corporation\$
{mohammad.r.haghighat}@intel.com
University of California, Irvine+
{mbebenit,changm,franz}@uci.edu
Tóm tắt
Các ngôn ngữ động như JavaScript khó biên dịch hơn các ngôn ngữ có kiểu tĩnh. Vì không có thông tin kiểu cụ thể, các trình biên dịch truyền thống cần sinh ra mã tổng quát có thể xử lý mọi tổ hợp kiểu có thể xảy ra tại thời gian chạy. Chúng tôi trình bày một kỹ thuật biên dịch thay thế cho các ngôn ngữ có kiểu động, xác định các dấu vết vòng lặp được thực thi thường xuyên tại thời gian chạy và sau đó sinh mã máy ngay lập tức được chuyên biệt hóa cho các kiểu động thực tế xuất hiện trên mỗi đường đi qua vòng lặp. Phương pháp của chúng tôi cung cấp chuyên biệt hóa kiểu liên thủ tục với chi phí thấp, cùng với một cách thức thanh lịch và hiệu quả để biên dịch gia tăng các đường đi thay thế được phát hiện một cách lười biếng qua các vòng lặp lồng nhau. Chúng tôi đã triển khai một trình biên dịch động cho JavaScript dựa trên kỹ thuật của mình và đã đo được các mức tăng tốc 10x và cao hơn đối với một số chương trình phép đo chuẩn nhất định.
Các danh mục và mô tả chủ thể D.3.4 [Ngôn ngữ lập trình]: Bộ xử lý — Trình biên dịch gia tăng, sinh mã.
Các thuật ngữ chung Thiết kế, Thực nghiệm, Đo lường, Hiệu năng.
Từ khóa JavaScript, biên dịch đúng lúc, cây dấu vết.
- Giới thiệu
Các ngôn ngữ động như JavaScript, Python và Ruby phổ biến vì chúng giàu khả năng biểu đạt, dễ tiếp cận đối với người không chuyên, và giúp việc triển khai trở nên dễ dàng như phân phối một tệp mã nguồn. Chúng được sử dụng cho các tập lệnh nhỏ cũng như các ứng dụng phức tạp.