Analisis Aliran Data dengan pengecualian

8

Analisis aliran data bekerja di atas grafik aliran kontrol. Ketika bahasa yang dipertimbangkan mendukung pengecualian, grafik aliran kontrol dapat meledak.

Apa teknik standar untuk menghadapi ledakan ini? Bisakah kita mengabaikan tepi yang dipicu oleh pengecualian? Bagaimanapun juga, aliran data menganalisis perhitungan perkiraan yang berlebihan, sehingga kami akan berakhir dengan solusi yang kurang tepat namun bagus. Apakah ini benar?

Pembaruan : Berikut adalah beberapa tautan bermanfaat yang dapat saya gali pada akhirnya:

bellpeace
sumber
Apa yang Anda maksud dengan "meledak"? Apakah kita secara statis tahu pengecualian mana yang bisa dilemparkan ke mana? Jenis peningkatan ukuran apa yang bersedia Anda terima?
Raphael
1
Dengan meledak, maksud saya jumlah blok dasar bertambah dan jumlah sisi yang menghubungkannya, menghasilkan waktu eksekusi analisis yang berpotensi lebih tinggi. Asumsi saya, mungkin salah, adalah bahwa ini mungkin menjadi masalah dalam kompiler dan mungkin ada beberapa cara untuk menghadapinya. Saya tertarik memahami topik ini.
bellpeace

Jawaban:

10

Mengabaikan pengecualian tidak sehat. Contoh:

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

Saat menganalisis f, Anda harus memperhitungkan fakta yang gmemunculkan pengecualian, jika tidak, Anda akan salah menyimpulkan bahwa xselalu 0 pada saat kembali dari f.

Saya tidak tahu bahwa ada teknik "standar" untuk berurusan dengan pengecualian. Ada beberapa literatur tentang topik ini, saya tidak punya ide lagi tentang makalah apa yang relevan daripada yang bisa saya temukan dengan pencarian Google.

Secara formal, pengecualian dapat diubah menjadi pernyataan bersyarat yang menyebarkan rantai panggilan, yang tentu saja meledakkan grafik aliran kontrol. Dalam banyak kasus nyata, kasus pengecualian adalah kasus yang kurang menarik, di mana banyak data terbunuh, sehingga harus ditangani dengan malas dalam pendekatan ke depan (tidak perlu menganalisis kehidupan di jalur pengecualian jika pawang membunuh data) .

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Pertanyaan lanjutan, jika Anda tidak keberatan. Intinya, jika saya kehilangan beberapa sisi, saya bisa mendapatkan hasil yang tidak sehat. Bagaimana jika saya memiliki tepi kontrol aliran encoding yang sebenarnya tidak dipamerkan selama eksekusi program? Apakah saya akan mendapatkan hasil yang bagus, tetapi berpotensi kurang akurat?
bellpeace
1
@ bellpeace Jika tepi bersesuaian dengan jalur yang tidak pernah diambil selama eksekusi, itu adalah kode mati, sehingga dapat dihapus tanpa mempengaruhi kesehatan. Hasilnya akan lebih tepat: Anda memiliki perkiraan yang lebih baik dari program ini, sehingga Anda bisa mendapatkan perkiraan yang lebih baik dari perilakunya.
Gilles 'SANGAT berhenti menjadi jahat'
Jadi, pada dasarnya, menambahkan tepi tambahan tidak akan memengaruhi kesehatan tetapi hanya presisi?
bellpeace
1
@ bellpeace Ya: jika Anda menambahkan jalur potensial, Anda mungkin memperkenalkan aliran potensial baru yang tidak dapat benar-benar terjadi, tetapi Anda tidak akan menghapus aliran apa pun yang terjadi.
Gilles 'SANGAT berhenti menjadi jahat'
Tunggu, dalam contoh ini, x selalu nol kembali dari f. Jika g memunculkan eksepsi, f tidak kembali. Sekarang jika f menangkap pengecualian (dan mungkin rethrew), itu akan menjadi masalah yang berbeda, tetapi itu akan menjadi tepi eksplisit dalam grafik aliran.
Nama samaran