Có những lựa chọn thay thế cho các loại để phân tích tĩnh?


18

Gõ tĩnh trong ngôn ngữ lập trình có thể hữu ích cho việc thực thi một số bảo đảm tại thời gian biên dịch - nhưng các loại có phải là công cụ duy nhất cho công việc này không? Có những cách khác để xác định bất biến?

Ví dụ, một ngôn ngữ hoặc môi trường có thể giúp thực thi một bảo đảm về độ dài mảng hoặc liên quan đến mối quan hệ giữa các yếu tố đầu vào với một chức năng. Tôi chỉ chưa nghe thấy bất cứ điều gì như thế này bên ngoài một hệ thống loại.

Một điều liên quan tôi đã tự hỏi là nếu có bất kỳ cách không khai báo nào để thực hiện phân tích tĩnh ( hầu hết các loại là khai báo ).

Câu trả lời:


24

Các hệ thống loại tĩnh là một loại phân tích tĩnh, nhưng có nhiều phân tích tĩnh thường không được mã hóa trong các hệ thống loại. Ví dụ:

  • Kiểm tra mô hình là một kỹ thuật phân tích và xác minh cho các hệ thống đồng thời cho phép bạn chứng minh rằng chương trình của bạn hoạt động tốt dưới tất cả các xen kẽ luồng có thể.

  • Phân tích luồng dữ liệu tập hợp thông tin về các giá trị có thể có của các biến, có thể xác định xem một số tính toán có dư thừa hay một số lỗi không được tính đến.

  • Giải thích trừu tượng mô hình hóa một cách bảo thủ các hiệu ứng của một chương trình, thông thường theo cách phân tích được đảm bảo để chấm dứt các trình kiểm tra loại có thể được thực hiện theo cách tương tự như các trình thông dịch trừu tượng.

  • Logic táchlogic chương trình (ví dụ được sử dụng trong bộ phân tích Infer ) có thể được sử dụng để suy luận về trạng thái chương trình và xác định các vấn đề như các cuộc hội thảo con trỏ null, trạng thái không hợp lệ và rò rỉ tài nguyên.

  • Lập trình dựa trên hợp đồng là một phương tiện để xác định các điều kiện tiên quyết, hậu điều kiện, tác dụng phụ và bất biến. Ada có hỗ trợ riêng cho các hợp đồng và có thể xác minh một số trong số chúng một cách tĩnh.

Tối ưu hóa trình biên dịch thực hiện nhiều phân tích nhỏ để xây dựng các cấu trúc dữ liệu trung gian để sử dụng trong quá trình tối ưu hóa như SSA, ước tính chi phí nội tuyến, thông tin ghép nối hướng dẫn, v.v.

Một ví dụ khác về phân tích tĩnh không khai báo được tìm thấy trong bộ đánh máy Hack , trong đó các cấu trúc luồng điều khiển thông thường có thể tinh chỉnh loại biến:

$x = get_value();
if ($x !== null) {
    $x->method();    // Typechecks because $x is known to be non-null.
} else {
    $x->method();    // Does not typecheck.
}

Và nói về các loại tinh chỉnh của Hồi giáo , trở lại vùng đất của các hệ thống loại, các loại tinh chỉnh (như được sử dụng trong LiquidHaskell ) với các vị từ được đảm bảo để giữ cho các phiên bản của loại Tinh chế Chú ý . Và các loại phụ thuộc thực hiện điều này hơn nữa, cho phép các loại phụ thuộc vào các giá trị. Thế giới hello hello Các kiểu gõ phụ thuộc thường là chức năng nối mảng:

(++) : (a : Type) -> (m n : Nat) -> Vec a m -> Vec a n -> Vec a (m + n)

Ở đây, ++có hai toán hạng loại Vec a mVec a n, là các vectơ với loại phần tử avà độ dài mntương ứng, là các số tự nhiên ( Nat). Nó trả về một vectơ có cùng loại phần tử có chiều dài là m + n. Và hàm này chứng minh ràng buộc này một cách trừu tượng, mà không biết các giá trị cụ thể của mn, do đó độ dài của vectơ có thể là động.


Hệ thống kiểu gì? Tôi nhận ra rằng tôi không thực sự biết. Định nghĩa trên Wikipedia là hình tròn: en.wikipedia.org/wiki/Type_system
Max Heiber

1
@mheiber: Một hệ thống kiểu tĩnh đơn giản là một phân tích tĩnh mà gán loại (ví dụ int, int -> int, forall a. a -> a) với các điều khoản (ví dụ 0, (+ 1), \x -> x). Các phân tích khác có thể quy định các thuộc tính khác nhau không liên quan đến loại dữ liệu, ví dụ: tác dụng phụ ( pure, io), khả năng hiển thị ( public, private) hoặc trạng thái ( open, closed). Trong thực tế, nhiều thuộc tính trong số này có thể được kiểm tra trong cùng một triển khai như kiểm tra / suy luận kiểu, vì vậy sự khác biệt không hoàn toàn rõ ràng.
Jon Purdy

4

Câu trả lời của @ JonPurdy thì tốt hơn, nhưng tôi muốn thêm một vài ví dụ nữa:

Rõ ràng:

  • kiểm tra cú pháp

  • xơ vải

Không rõ ràng:

  • Rust cho phép lập trình viên xác định liệu "các ràng buộc" có thể thay đổi hay không và thực thi các ràng buộc này.

  • Điều này có liên quan: một số ngôn ngữ cho phép một số mã được chạy trong thời gian biên dịch, điều đó có nghĩa là nhiều thứ có thể bị lỗi trong thời gian biên dịch có thể bị bắt tại thời gian biên dịch. Một số ví dụ là các macro và các thủ tục ngôn ngữ Nim được đánh dấu bằng compileTimepragma .

  • Lập trình logic về cơ bản là xây dựng một chương trình bằng cách cung cấp các xác nhận.

Gõ bán tĩnh:

  • Flow của Facebook cho phép kết hợp giữa gõ động và gõ tĩnh. Ý tưởng là ngay cả mã động được gõ ngầm. Flow cho phép bạn chạy một máy chủ theo dõi mã của bạn khi nó chạy để phát hiện các lỗi loại có thể xảy ra, ngay cả khi bạn không chú thích các chức năng của mình.

1

Phân tích loại không có nghĩa là nhiều.

Agda được biết là có một hệ thống loại Turing hoàn chỉnh, rất khác biệt (và khó tính toán hơn nhiều) so với các ngôn ngữ ML (ví dụ Ocaml ).


Agda, đã nỗ lực rất nhiều để không có "hệ thống loại hoàn chỉnh" và thậm chí không có "hệ thống thuật ngữ hoàn chỉnh".
dùng833970
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.