Các thuật toán kiểm tra loại


19

Tôi đang bắt đầu một nghiên cứu thư mục cá nhân về các thuật toán kiểm tra kiểu và muốn một số mẹo. Các thuật toán, chiến lược và kỹ thuật chung được sử dụng phổ biến nhất là gì?

Tôi đặc biệt quan tâm đến các thuật toán kiểm tra kiểu phức tạp được triển khai bằng các ngôn ngữ gõ tĩnh được biết đến rộng rãi, ví dụ như C ++, Java 5+, Scala hoặc các ngôn ngữ khác. IE, các thuật toán kiểm tra kiểu không đơn giản do cách gõ ngôn ngữ cơ bản rất đơn giản (như Java 1.4 trở xuống).

Tôi không quan tâm đến một ngôn ngữ cụ thể X, Y hoặc Z. Tôi quan tâm đến các thuật toán kiểm tra loại bất kể ngôn ngữ mà chúng nhắm mục tiêu. Nếu bạn cung cấp một câu trả lời như "ngôn ngữ L mà bạn chưa bao giờ nghe về ngôn ngữ nào được gõ mạnh và việc gõ rất phức tạp có thuật toán kiểm tra kiểu A, B và C bằng cách kiểm tra X và Y bằng thuật toán Z" hoặc " chiến lược X và Y được sử dụng cho Scala và biến thể Z của A được sử dụng cho C # rất tuyệt vì các tính năng R, S và T hoạt động theo cách đó ", thì câu trả lời rất hay.


3
Có lẽ bạn nên chỉnh sửa câu hỏi này để hỏi về việc kiểm tra loại cho một ngôn ngữ cụ thể. Các câu hỏi kiểu danh sách mở thường không được khuyến khích trên SE (mặc dù trang web cụ thể này chưa có chính sách liên quan đến vấn đề đó). Ngoài ra: <type-system-elitist> Hệ thống kiểu Java không phức tạp </ type-system-elitist>.
sepp2k

3
Có lẽ câu hỏi có thể được nhắc lại để cụ thể hơn, nhưng tôi không nghĩ nó nên được đóng lại.
Dave Clarke

1
@ sepp2k: Tôi biết rằng nó hơi rộng, nhưng đã kết thúc theo cách này vì tôi không muốn giới hạn tính hữu ích của các câu trả lời. BTW, tôi không hiểu bạn muốn nói gì với "<type-system-elitist> Hệ thống kiểu Java không phức tạp </ type-system-elitist>". Trên thực tế, hệ thống loại 1.4 trở xuống của Java rất đơn giản, nhưng các khái quát trắng trong Java 5, nó trở nên phức tạp hơn rất nhiều.
Victor Stafusa

2
Yêu cầu một ngôn ngữ cụ thể sẽ làm cho câu hỏi không phù hợp hơn cho trang web này, imho. Câu hỏi có lẽ nên yêu cầu kỹ thuật chung.
Raphael

1
@Victor Một công cụ cơ bản là Ngữ pháp thuộc tính . Bạn có thể sẽ không thể làm mọi điều xấu xa mà bạn có thể tưởng tượng với họ, nhưng họ là một điểm khởi đầu tốt.
Raphael

Câu trả lời:


13

Hầu hết các nghiên cứu không thực sự xuất bản các thuật toán kiểm tra loại cho các ngôn ngữ lập trình đầy đủ. Bạn sẽ tìm thấy một số hình thức của một phần lớn các hệ thống loại cho các ngôn ngữ lập trình đầy đủ, chẳng hạn như công việc được thực hiện bởi Drossopoulou và Eisenbach cho Java hoặc Nipkov và cộng sự trên C ++ . Tuy nhiên, thường xuyên hơn, bạn sẽ chỉ tìm thấy các hệ thống loại cho một số phần cốt lõi của ngôn ngữ (Feather weight Java là một ví dụ) hoặc cho các khái niệm cốt lõi của một ngôn ngữ như cách tiếp cận suy luận kiểu địa phương của scala .

Trong hội nghị như POPL và ICFP bạn sẽ tìm thấy nhiều thuật toán kiểm tra kiểu cho các loại cụ thể của hệ thống loại, và cuốn tiểu thuyết phương pháp tiếp cận như hai chiềutridirectional kiểm tra kiểu.

Tổng quát hơn, có lẽ bạn cần biết về thuật toán Damas-Milner , suy luận kiểu cục bộ, kiểm tra loại hai chiều và hai chiều, và mở rộng từ đó, bằng cách theo dõi các tài liệu tham khảo trong các bài báo và bằng cách sử dụng học giả google để tìm ra bài báo nào trích dẫn và xây dựng các cách tiếp cận được mô tả. Ngoài ra, như được đề xuất ở trên, các hội nghị như POPL, ICPF, ESOP và thậm chí ECOOP và OOPSLA sẽ có các giấy tờ liên quan đến nhiệm vụ của bạn.


Afaik, hệ thống loại của Scala đã được phát triển trong các dự án nghiên cứu và do đó được xuất bản. Trình biên dịch là nguồn mở, quá. Mặc dù vậy, đã không nhìn vào.
Raphael

Không cần tôi phải suy luận; Tôi biết rằng có những bài báo được xuất bản trên hệ thống loại của Scala. Yêu cầu này được kiểm tra dễ dàng bằng cách tìm kiếm . Ngoài ra, tôi tính mã nguồn của trình biên dịch là xuất bản đủ trên thuật toán (miễn là nó được bao gồm trong các nguồn; tôi giả sử như vậy nhưng không kiểm tra). Tuyên bố ban đầu của tôi là mơ hồ, đúng, nhưng phản ứng của bạn có vẻ không chính đáng.
Raphael

2

Một công cụ cơ bản là Grammy thuộc tính . Bạn có thể sẽ không thể làm mọi điều xấu xa mà bạn có thể tưởng tượng với họ, nhưng họ là một điểm khởi đầu tốt.

Về cơ bản, bạn có thể đi qua cây cú pháp trừu tượng từ trên xuống và / hoặc từ dưới lên và truyền thông tin xung quanh. Vì vậy, ví dụ, bạn có thể chuyển thông tin loại phạm vi toàn cầu (ví dụ: các lớp và thành viên của chúng) xuống dưới và xác định loại biểu thức đệ quy, tức là từ dưới lên, chuyển các loại kết quả lên trên.

Tìm một số giải thích và ví dụ trong các slide ở đây (Chương 5).


Có ai có một tài liệu tham khảo tốt hơn? Tôi đoán tôi cần mua Dragonbook hoặc Wilhelm / Maurer một trong những ngày này ...
Raphael

1
Công cụ JastAdd là một hệ thống trình biên dịch hiện đại, tuyệt vời dựa trên ngữ pháp thuộc tính tham chiếu. Chúng tôi đã sử dụng nó trong một số dự án.
Dave Clarke
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.