Làm thế nào để loại được kiểm tra trong trình thông dịch / trình biên dịch ngôn ngữ động, chẳng hạn như JavaScript?


11

Trong các ngôn ngữ động, chẳng hạn như JavaScript hoặc Python, loại biến được xác định khi chạy. Đây là một lý do tại sao chúng chậm hơn các ngôn ngữ được gõ như Java.

Làm thế nào là kiểm tra loại được thực hiện? Lý do thiết yếu quá trình này là chậm là gì?


Chúng không chậm hơn vì chúng năng động, chúng chậm hơn vì khó làm cho chúng nhanh hơn. JavaScript thực sự được tối ưu hóa nhất và khá nhanh.
Derek Litz

Câu trả lời:


5

Có sự nhầm lẫn trong câu hỏi.

Có một giả định rằng kiểm tra loại là chậm, điều này không nhất thiết phải như vậy.

Câu hỏi dường như cũng nhầm lẫn giữa quá trình gửi loại với kiểm tra kiểu , và chúng là hai điều khác nhau. Một là một quá trình được thực hiện trong thời gian chạy, còn lại là một quá trình tại thời gian biên dịch. Tôi nghi ngờ câu hỏi là thực sự hỏi về loại công văn.

Đó là loại công văn có thể giới thiệu chi phí trong thời gian chạy, bởi vì tính toán dành thời gian với các hướng dẫn quyết định, một cách linh hoạt, hành động nào cần thực hiện, dựa trên các loại giá trị mà nó nhìn thấy trong thời gian chạy. ví dụ: trong một ngôn ngữ động, nếu tôi áp dụng "+" cho hai điều, tôi có thể có nghĩa là bổ sung số hoặc nối chuỗi, vì vậy tôi cần dành thời gian xem xét những gì trong tay để quyết định làm gì. Có các chiến lược đánh giá có thể làm giảm chi phí của công văn động. (ví dụ: truy tìm JIT)

Liên quan đến việc kiểm tra kiểu trong JavaScript, xem: http://www.cs.brown.edu/~sk/Publications/Papers/Published/gsk-flow-typing-theory/ . Để có cái nhìn tổng quát hơn về cách thức hoạt động của trình kiểm tra loại, sách giáo khoa ngôn ngữ lập trình chuẩn sẽ bao gồm các thuật toán. Ví dụ: http://www.cs.brown.edu/~sk/Publications/Books/ProgLangs/


Tôi cũng đã viết một cuộc khảo sát nhỏ về truy tìm các JIT và ngôn ngữ động trong hashcollision.org/comp toàn diện / tring.pdf

Trình thông dịch Javascript mang các bit thẻ với mỗi giá trị cho loại công văn. Bạn có thể giải thích một chút về điều này? Ví dụ, việc sử dụng các bit thẻ là gì? Có một chút tương ứng với một loại?

Khái niệm về một loại không phải lúc nào cũng được kết nối với đại diện. Ví dụ, chúng ta có thể có khái niệm về loại 'dặm so với loại' km 'và hợp lý là có một ngôn ngữ có thể phát hiện tĩnh, tại thời điểm biên dịch, liệu các tính toán có áp dụng không đúng các hoạt động trên các giá trị làm rối tung các loại . Bạn có thể tưởng tượng rằng chúng có cùng một biểu diễn và nếu trình biên dịch có thể, vào thời gian biên dịch, đảm bảo rằng chúng không bao giờ bị trộn lẫn, thì không có lý do nào khiến các giá trị cần ghi nhãn bổ sung trong biểu diễn.

1
Tiếp tục: nhưng thường, đặc biệt là trong các ngôn ngữ động, bạn muốn biểu diễn các giá trị của các loại khác nhau. Có một số cách để thực hiện phân biệt đối xử này. Thẻ loại là phổ biến, nhưng có các kỹ thuật khác. Ví dụ: bạn có thể đặt một số loại nhất định trong các vùng bộ nhớ bị chặn. Xem "Đại diện thông tin loại bằng ngôn ngữ gõ động." lambda-the-ultimate.org/node/3912 để khảo sát toàn diện các kỹ thuật biểu diễn.

7

Về cơ bản, trong các ngôn ngữ chưa được đánh dấu, mọi điểm tham chiếu đến một đối tượng có chứa cả loại và giá trị. Ví dụ: var a = 3trỏ đến một thể hiện chứa giá trị 3 và kiểu int, nếu bạn tạo a = "bla", tham chiếu được cập nhật thành một thể hiện chứa chuỗi "bla" và chuỗi kiểu, đối tượng cũ bị loại bỏ, v.v ...

Điều này chậm vì mỗi khi một thao tác (ví dụ a + b) phải được thực hiện trên các loại cơ bản này, trước tiên thời gian chạy phải hủy đăng ký các đối tượng, kiểm tra xem loại của chúng có tương thích không, thực hiện thao tác, tạo đối tượng mới.

Ngược lại, a + btrong C ++ hoặc Java kiểm tra tại thời điểm biên dịch rằng các loại là hợp lệ và tương thích, thì a và b được lưu trữ dưới dạng giá trị ngay lập tức (không phải tham chiếu) và bổ sung là thao tác xử lý đơn giản trên các giá trị này.

Tất nhiên, đây là tất cả rất lý thuyết. Trong thực tế, rất nhiều tối ưu hóa có thể được thực hiện trong quá trình này để tránh phần lớn chi phí và các ngôn ngữ được gõ động có thể nhận được khá nhanh.


1
Thủ thuật như bộ đệm nội tuyến đa hình có thể cải thiện hiệu suất rất nhiều. Các tác phẩm của David Ungar (Bản thân) và Eliot Miranda (Squeak, Visual Works Smalltalk) là những thông tin hữu ích nhất, liên quan đến hiệu suất ngôn ngữ động.
Frank Shearar

0

Mỗi giá trị được lưu trữ cùng với loại của nó, cái nào cần kiểm tra trước. Ngoài ra chuyển đổi nói từ chuỗi sang số đi qua kiểm tra, trên đường đi.


Đúng, đây là nó, nó chỉ là một kiểm tra thời gian chạy, không có gì lạ mắt.
anon
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.