Kekerasan komputasi dari program komputer "nyata"

10

Saya sering mendengar dikatakan bahwa Anda tidak dapat menulis sebuah program untuk menangkap bug di browser web, atau pengolah kata, atau sistem operasi, karena Teorema Rice: properti semantik apa pun untuk bahasa lengkap Turing tidak dapat diputuskan.

Namun, saya tidak yakin sejauh mana ini berlaku untuk program dunia nyata suka sistem operasi. Apakah jenis program ini membutuhkan kekuatan penuh dari kelengkapan Turing? Apakah ada model perhitungan yang lebih sederhana (seperti PR) di mana aplikasi ini dapat ditulis? Jika demikian, sejauh mana hal ini memungkinkan kesesuaian kebenaran program?

David Harris
sumber
Anda tidak dapat memeriksa properti universal non-sepele (mis. sesuatu berlaku untuk semua input) dari model yang jauh lebih lemah, mis. Anda tidak dapat memeriksa apakah dua TM yang dihitung komputer polytime menghitung fungsi yang sama (walaupun berhenti dapat dipilih untuk mereka karena polytime TM selalu berhenti). Di sisi lain, jika domain input dibatasi, Anda dapat memeriksa beberapa properti di beberapa model, misalnya program tidak macet pada input berukuran kurang dari 1.000, setidaknya dalam teori (dalam praktiknya mungkin tidak bisa diterapkan).
Kaveh
pertanyaan yang
Artem Kaznatcheev

Jawaban:

14

Anda tentu dapat menulis program yang menangkap bug - ada komunitas besar dan aktif orang yang menulis program untuk melakukan hal itu. Namun, teorema Rice mencegah Anda dari melakukan adalah menulis bug-catcher yang baik dan lengkap (yaitu, menangkap semua bug dari kelas tertentu tanpa positif palsu).

Yang mengatakan, pembatasan naif pada model perhitungan sebenarnya tidak banyak membantu Anda dalam meningkatkan kepraktisan analisis program. Alasannya adalah bahwa Anda bisa mendapatkan program yang melakukan "hal yang hampir sama" dengan memutar sambil memutar

while P do 
   C

menjadi for-loop dengan konstanta iterasi besar:

for i = 0 to BIGNUM do 
  if P then 
    C
  else
    break

Sekarang program ini bahkan tidak memerlukan kekuatan penuh dari rekursif primitif (karena for-loop dapat diperluas secara makro menjadi pernyataan bersarang jika-maka-yang lain), tetapi dalam kebanyakan kasus praktis ia akan berperilaku sama seperti sebelumnya. Perhatikan bahwa hal ini membantu decidability dalam teori - program ini total, sehingga Anda dapat menjawab pertanyaan dengan menjalankan program dan melihat apa yang terjadi. Ini bukan yang sebenarnya kita inginkan, yaitu untuk mendapatkan jawaban lebih cepat daripada menjalankan program - penghentian buatan yang diperkenalkan sebenarnya tidak membantu analisis program dalam praktik, karena bug terjadi karena kesalahan dalam logika program nyata, dan kami belum Aku tidak menyentuh itu sama sekali.

ϵ0

Neel Krishnaswami
sumber
Apa yang Anda maksud dengan "program ini bahkan tidak primitif rekursif"?
Ryan Williams
@RyanWilliams mungkin hanya dapat ditulis dalam sistem yang memungkinkan kurang dari array penuh fungsi rekursif primitif, misalnya program yang membutuhkan batas eksplisit (waktu kompilasi) pada loop.
cody
Anda dapat memperluas makro loop, meninggalkan Anda dengan program percabangan (yaitu, hanya dengan if-then-else dan komposisi berurutan).
Neel Krishnaswami
Mungkin akan lebih jelas untuk mengatakan sesuatu seperti "program ini bahkan tidak membutuhkan kekuatan penuh dari primitif rekursi".
Maks.
@ Max: saran diterima!
Neel Krishnaswami
5

Karena Anda bertanya tentang kebenaran program dari program dunia nyata seperti sistem operasi, Anda mungkin tertarik dengan proyek seL4 ( jurnal , pdf , konferensi ).

Tim NICTA mengambil microkernel generasi ketiga dari 8700 baris C dan 600 baris assembler diimplementasikan sesuai dengan spesifikasi abstrak di Haskell. Mereka memberikan bukti formal yang diperiksa mesin (dalam Isabelle / HOL) bahwa implementasinya secara ketat mengikuti spesifikasi. Dengan demikian membuktikan bahwa program mereka bebas bug.

Jadi sama seperti masalah penghentian, meskipun tidak dapat dipecahkan secara umum, ini dapat diselesaikan untuk beberapa kasus tertentu. Dalam hal ini, walaupun Anda tidak dapat membuktikan bahwa kode C yang arbitrer bebas bug, mereka dapat melakukannya dalam kasus seL4 microkernel.

Artem Kaznatcheev
sumber
Perhatikan bahwa kode bersertifikasi masih rentan terhadap kesalahan dalam spesifikasinya, jadi Anda hanya bisa mengatakan bahwa kode tersebut bebas bug relatif terhadap spesifikasinya.
nponeccop
@nponeccop pasti benar, tetapi ketika Anda mulai meragukan spesifikasi Anda juga mulai benar-benar mengaburkan garis fitur bug yang terkenal. Untuk menyebut sesuatu sebagai 'bug' Anda harus memiliki beberapa spesifikasi implisit dalam pikiran, menangkap intuisi di balik spesifikasi implisit tersebut mulai menggali sangat dalam hingga Anda mengajukan pertanyaan pada dasar-dasar dalam filsafat matematika (dengan gaya Brouwer vs Hilbert) .
Artem Kaznatcheev
Yang dimaksud dengan 'spesifikasi' adalah spesifikasi formal yaitu teorema formal yang Anda buktikan. Anda mungkin masih membuat kesalahan dalam mengubah persyaratan tekstual Anda menjadi teorema. Satu-satunya hal yang Anda dapatkan dengan sertifikasi adalah pengurangan basis kode tepercaya Anda (Anda hanya harus mempercayai teorema Anda dan bukan kode atau bukti Anda) dan konsistensi kode Anda dengan teorema Anda.
nponeccop
Berikut adalah kutipan dari situs web seL4: 'Kode C dari seL4 microkernel mengimplementasikan dengan benar perilaku yang dijelaskan dalam spesifikasi abstraknya dan tidak lebih.'
nponeccop
2

Pertanyaan yang Anda ajukan sebenarnya sangat berbeda.

Namun, saya tidak yakin sejauh mana ini berlaku untuk program dunia nyata suka sistem operasi. Apakah jenis program ini membutuhkan kekuatan penuh dari kelengkapan Turing?

Dibutuhkan sangat sedikit untuk model komputasi untuk menjadi Turing lengkap. Misalnya, berbagai model dengan penghitung dapat mensimulasikan mesin Turing. Jika Anda yakin perangkat lunak Anda membutuhkan lebih dari dua penghitung yang dapat Anda manipulasi secara sewenang-wenang, Anda menggunakan bahasa lengkap Turing. Meskipun bilangan bulat mesin dibatasi apriori, struktur data yang dialokasikan heap biasanya tidak. Jika perangkat lunak Anda membutuhkan daftar, pohon, dan data yang dialokasikan secara dinamis lainnya, Anda menggunakan bahasa lengkap Turing.

Apakah ada model perhitungan yang lebih sederhana (seperti PR) di mana aplikasi ini dapat ditulis? Jika demikian, sejauh mana hal ini memungkinkan kesesuaian kebenaran program?

Penting untuk mengetahui bahwa kami tidak ingin memeriksa properti sewenang-wenang dari perangkat lunak kami. Memeriksa properti yang sangat spesifik dan sempit (tidak ada buffer overflows, tidak ada null-pointer dereferences, tidak ada loop tak terbatas, dll) sangat meningkatkan kualitas dan kegunaan perangkat lunak. Secara teori, masalah seperti itu masih belum dapat dipastikan. Dalam praktiknya, fokus pada properti tertentu memungkinkan kita menemukan struktur dalam program kita yang sering kita manfaatkan untuk menyelesaikan masalah.

Secara khusus, Anda dapat memodifikasi pertanyaan awal Anda

Apakah ada abstraksi perangkat lunak saya yang dapat saya analisis secara efisien dalam model lengkap non-Turing?

Abstraksi adalah model yang mencakup perilaku perangkat lunak asli dan mungkin banyak perilaku tambahan. Ada model seperti mesin satu-counter atau sistem pushdown yang Turing tidak lengkap dan yang bisa kita analisis. Pendekatan standar dalam verifikasi program dengan alat otomatis adalah dengan membangun abstraksi dalam model seperti itu dan memeriksanya secara algoritmik.

Ada aplikasi di mana orang-orang peduli dengan properti canggih dari perangkat keras atau perangkat lunak mereka. Perusahaan perangkat keras ingin agar chip mereka menerapkan algoritma aritmatika dengan benar, perusahaan otomotif dan avionik menginginkan perangkat lunak yang benar secara sertifikasi. Jika itu penting, Anda lebih baik menggunakan manusia (terlatih).

Vijay D
sumber
Saya pikir Anda telah menjawab pertanyaan sebaliknya, yaitu apakah mungkin pengolah kata menjadi Turing lengkap? Dengan penanganan register yang tepat, itu. Meskipun demikian, dimungkinkan untuk menerapkan aturan manipulasi register untuk mengalahkan kelengkapan Turing. Pertanyaan saya adalah seberapa banyak Anda dapat memprogram secara praktis dalam batasan-batasan sempit ini.
David Harris
Saya menjawab pertanyaan tentang apakah menulis sistem operasi dan perangkat lunak aplikasi lain memerlukan bahasa pemrograman lengkap Turing. Jika Anda memerlukan banyak penghitung atau struktur data tidak terbatas, Anda akan memerlukan bahasa pemrograman Turing lengkap.
Vijay D
@ Vijay: tidak, ini tidak benar. Ada banyak teori tipe (misalnya, Agda dan Coq) yang keduanya sangat ekspresif dan tidak memungkinkan rekursi tak terbatas.
Neel Krishnaswami
@Neel: Untuk memperjelas, saya hanya berbicara tentang kelengkapan Turing. Apakah tidak mungkin untuk mensimulasikan mesin Turing dalam teori-teori ini?
Vijay D
Itu benar - mereka tidak menyelesaikan Turing. Dalam logika konstruktif, Turing-kelengkapan memungkinkan analog paradoks Russell diprogram.
Neel Krishnaswami