Phân tích luồng dữ liệu với các ngoại lệ


8

Phân tích luồng dữ liệu làm việc trên một biểu đồ luồng điều khiển. Khi một ngôn ngữ được xem xét hỗ trợ các ngoại lệ, biểu đồ luồng điều khiển có thể phát nổ.

Các kỹ thuật tiêu chuẩn để đối phó với vụ nổ này là gì? Chúng ta có thể coi thường các cạnh gây ra bởi ngoại lệ? Luồng dữ liệu phân tích dù sao cũng tính toán gần đúng, vì vậy chúng tôi sẽ kết thúc bằng một giải pháp ít chính xác hơn nhưng hợp lý hơn. Điều này có đúng không?

Cập nhật : Dưới đây là một số liên kết hữu ích mà tôi đã có thể khai thác ở cuối:


Bạn có ý nghĩa gì khi "nổ tung"? Chúng ta có biết tĩnh ngoại lệ nào có thể được ném ở đâu không? Những loại tăng kích thước bạn sẽ sẵn sàng chấp nhận?
Raphael

1
Bằng cách phát nổ tôi có nghĩa là số lượng các khối cơ bản được tăng lên và số cạnh kết nối chúng, dẫn đến thời gian thực hiện phân tích có khả năng cao hơn. Giả định của tôi, có lẽ sai, là điều này có thể là một vấn đề trong trình biên dịch và có thể có một số cách xử lý nó. Tôi quan tâm đến việc hiểu chủ đề.
bellpeace

Câu trả lời:


10

Bỏ qua các ngoại lệ là không có căn cứ. Thí dụ:

let g = {
     raise E;
}
let f = {
     x := interesting_stuff();
     g();
     x := 0;
}

Khi phân tích f, bạn cần tính đến thực tế glàm phát sinh một ngoại lệ, nếu không bạn sẽ kết luận không chính xác xluôn luôn là 0 khi trở về f.

Tôi không biết rằng có một kỹ thuật tiêu chuẩn của người Viking để xử lý các trường hợp ngoại lệ. Có một số tài liệu về chủ đề này, tôi không có thêm ý tưởng nào về những giấy tờ có liên quan mà tôi có thể tìm thấy bằng một tìm kiếm Google.

Chính thức, các trường hợp ngoại lệ có thể được biến thành các câu lệnh có điều kiện truyền lên chuỗi cuộc gọi, điều này tất nhiên làm nổ tung biểu đồ luồng điều khiển. Trong nhiều trường hợp cụ thể, trường hợp ngoại lệ là trường hợp ít thú vị hơn, trong đó có rất nhiều dữ liệu bị giết, do đó, nên xử lý một cách lười biếng theo cách tiếp cận (không cần phân tích mức độ nhạy cảm trên đường dẫn ngoại lệ nếu trình xử lý giết dữ liệu) .


Một câu hỏi tiếp theo, nếu bạn không phiền. Về cơ bản, nếu tôi thiếu một số cạnh, tôi có thể nhận được một kết quả không rõ ràng. Điều gì xảy ra nếu tôi có luồng điều khiển mã hóa cạnh thực tế không được hiển thị trong khi thực hiện chương trình? Tôi sẽ có một kết quả âm thanh, nhưng có khả năng ít chính xác hơn?
bellpeace

1
@bellpeace Nếu một cạnh tương ứng với một đường dẫn không bao giờ được thực hiện trong khi thực thi, đó là mã chết, vì vậy nó có thể bị xóa mà không ảnh hưởng đến âm thanh. Kết quả sẽ được nhiều hơn nữa chính xác: bạn có một xấp xỉ tốt hơn của chương trình, vì vậy bạn có thể nhận được một xấp xỉ tốt hơn về hành vi của nó.
Gilles 'SO- đừng trở nên xấu xa'

Vì vậy, về cơ bản, thêm các cạnh bổ sung sẽ không ảnh hưởng đến âm thanh mà chỉ chính xác?
bellpeace

1
@bellpeace Có: nếu bạn thêm các đường dẫn tiềm năng, bạn có thể đưa ra các luồng tiềm năng mới không thực sự xảy ra, nhưng bạn sẽ không xóa bất kỳ luồng nào xảy ra.
Gilles 'SO- ngừng trở nên xấu xa'

Đợi đã, trong ví dụ này, x luôn bằng 0 khi trả về từ f. Nếu g tăng một ngoại lệ, f sẽ không quay lại. Bây giờ nếu f bắt được ngoại lệ (và có lẽ đã rút lại), đó sẽ là một vấn đề khác, nhưng đó sẽ là một cạnh rõ ràng trong biểu đồ luồng.
Bút danh
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.