“Gerçek” bilgisayar programlarının hesaplama sertliği


10

Rice'ın Teoremi nedeniyle bir web tarayıcısında, kelime işlemcide veya işletim sisteminde hataları yakalamak için bir program yazamayacağınızı sık sık duydum: Turing tam bir dil için herhangi bir anlamsal özellik kararsız.

Bununla birlikte, bunun gerçek dünya programı için işletim sistemlerini ne ölçüde sevdiğinden emin değilim. Bu tür programlar Turing tamlığının tam gücüne ihtiyaç duyuyor mu? Bu uygulamaların yazılabileceği daha basit hesaplama modelleri (PR gibi) var mı? Öyleyse, bu, program doğruluğunun ne ölçüde kararlaştırılmasına izin verir?


çok daha zayıf modellerin önemsiz evrensel özelliklerini (örneğin, tüm girdiler için bir şey tutar) kontrol edemezsiniz, örneğin, iki çoklu zamanlı hesaplanabilir TM'nin aynı işlevi hesaplayıp hesaplamadığını kontrol edemezsiniz (bir çoklu zamanlı TM her zaman durduğu için durdurma onlar için karar verilebilir). Öte yandan, girdilerin etki alanı sınırlıysa, bazı modellerde bazı özellikleri kontrol edebilirsiniz, örneğin program en azından teoride 1000'den küçük boyuttaki girdilere çökmez (pratikte zorlanabilir olabilir).
Kaveh

hafif ilgili soru
Artem Kaznatcheev

Yanıtlar:


14

Kesinlikle olabilir tam olarak yapmak için programlar yazmak insanların büyük ve aktif topluluk var - yakalamak böcek programlar yazmak. Ancak, Rice'ın teoreminin yapmasını engellediği şey, hem sağlam hem de eksiksiz olan böcek yakalayıcılar yazmaktır (yani, belirli bir sınıfın tüm hatalarını yanlış pozitifler olmadan yakalamak).

Bununla birlikte, hesaplama modelindeki naif kısıtlamalar, program analizinin pratikliğini geliştirmede size çok fazla yardımcı olmaz. Bunun nedeni, döngüleri çevirerek "neredeyse aynı şeyi" yapan programlar alabilmenizdir.

while P do 
   C

büyük bir yineleme sabiti olan for-döngülere:

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

Şimdi bu programın ilkel özyinelemenin tam gücüne bile ihtiyacı yoktur (for-loop, büyük bir iç içe if-then-else deyimine makro olarak genişletilebildiğinden), ancak çoğu pratik durumda, eskisi gibi davranacaktır. Teoride karar verilebilirliğe yardımcı olduğunu unutmayın - program toplamdır, böylece programı çalıştırarak ve ne olduğunu görünce soruları cevaplayabilirsiniz. Aslında istediğimiz bu değil, bu da programı çalıştırmaktan daha hızlı cevaplar almaktır - tanıtılan yapay sonlandırma aslında uygulamada program analizine yardımcı olmaz, çünkü gerçek program mantığındaki hatalar nedeniyle hatalar oluşur ve biz Hiç dokunmadım.

Ayrıca, bir programlama diline soyutlama olanaklarının eklenmesi, analiz sorununun karmaşıklığını radikal bir şekilde kötüleştirirken, uygulamadaki programları doğrulamayı kolaylaştırır. Örneğin, basit tipli lambda hesabının doğal sayılarla sonlandırılmasını kanıtlamak için kadar indüksiyon gerekir , ancak tip polimorfizmi ekleyerek, sonlandırma kanıtı ikinci derece aritmetiğin tutarlılığı kadar güçlü olan Sistem F'ye sahip olursunuz. Yine de, uygulamada F'de yazılan programların doğrulanması çok daha kolaydır, çünkü ikinci dereceden nicelemenin modülerlik özellikleri, yapılandırılmış programlar ve doğruluk kanıtlarını yazmayı daha kolay hale getirir.ε0


"Bu program ilkel özyinelemeli bile değil" ile ne demek istiyorsun?
Ryan Williams

@RyanWilliams muhtemelen sadece ilkel özyinelemeli fonksiyonların tam sayısından daha azına izin veren bir sistemde yazılabilir, örneğin döngülerde açık (derleme zamanı) sınırları gerektiren programlar.
cody

Döngüler makro olarak genişletilebilir ve sizi bir dallanma programıyla bırakabilirsiniz (yani yalnızca if-else-ve ardışık kompozisyonla).
Neel Krishnaswami

Belki de "bu program ilkel özyinelemenin tam gücüne bile ihtiyaç duymaz" gibi bir şey söylemek daha açık olurdu.
Maksimum

@ Maks: öneri kabul edildi!
Neel Krishnaswami

5

İşletim sistemleri gibi gerçek dünya programlarının program doğruluğunu sorduğunuzdan, seL4 projesiyle ( dergi , pdf , konferans ) ilgilenebilirsiniz .

NICTA ekibi, Haskell'deki soyut bir spesifikasyona göre uygulanan 8700 satır C ve 600 satır montajcıya ait üçüncü nesil bir mikro çekirdek aldı. Uygulamanın şartnameye kesinlikle uyduğunu gösteren, resmi, makine tarafından kontrol edilen bir kanıt (Isabelle / HOL'de) sunmuşlardır. Böylece programlarının hatasız olduğunu kanıtlarlar.

Dolayısıyla, durdurma problemi gibi, genel olarak çözülemese de, bazı belirli durumlar için çözülebilir. Bu durumda, keyfi C kodunun hatasız olduğunu kanıtlayamasanız da, seL4 mikro çekirdeği durumunda bunu yapabilirler.


Sertifikalı kodun spesifikasyonundaki hatalara karşı hala savunmasız olduğunu unutmayın, bu nedenle yalnızca kodun spesifikasyona göre hatasız olduğunu söyleyebilirsiniz.
nponeccop

@nponeccop kesinlikle doğrudur, ancak spesifikasyondan şüphe etmeye başladığınızda, aynı zamanda rezil böcek özelliği çizgisini gerçekten bulanıklaştırmaya başlarsınız. Bir şeyi 'hata' olarak adlandırmak için aklınızda bazı örtülü belirtimleriniz olması gerekir, böylesi örtük bir belirtimin arkasındaki sezgiyi yakalamak, matematik felsefesinin temellerinde (Brouwer vs.Hilbert tarzında) sorulara ulaşıncaya kadar gerçekten derin kazmaya başlar. .
Artem Kaznatcheev

'Spesifikasyon' ile, resmi spesifikasyonu yani kanıtladığınız resmi teoremleri kastediyorum. Metin gereksinimlerinizi teoremlere dönüştürmede yine de hatalar yapabilirsiniz. Sertifikasyonla elde ettiğiniz tek şey, güvenilir kod tabanınızın azaltılması (kodunuza veya kanıtlarınıza değil, yalnızca teoremlerinize güvenmelisiniz) ve kodunuzun teoremlerinizle tutarlılığıdır.
nponeccop

İşte seL4 web sitesinden bir alıntı: 'seL4 mikro çekirdeğinin C kodu, soyut spesifikasyonunda açıklanan davranışı doğru bir şekilde uygular ve daha fazlası değil.'
nponeccop

2

Sorduğunuz sorular aslında oldukça farklı.

Bununla birlikte, bunun gerçek dünya programı için işletim sistemlerini ne ölçüde sevdiğinden emin değilim. Bu tür programlar Turing tamlığının tam gücüne ihtiyaç duyuyor mu?

Bir hesaplama modelinin Turing'in tamamlanması son derece az sürer. Örneğin, sayaçlı çeşitli modeller Turing makinelerini simüle edebilir. Yazılımınızın keyfi olarak değiştirebileceğiniz ikiden fazla sayaç gerektirdiğini düşünüyorsanız, Turing tam dili kullanıyorsunuzdur. Makine tam sayıları apriori ile sınırlı olsa da, yığın tahsisli veri yapıları genellikle değildir. Yazılımınızın listelere, ağaçlara ve dinamik olarak ayrılmış diğer verilere ihtiyacı varsa, Turing tam dili kullanıyorsunuz.

Bu uygulamaların yazılabileceği daha basit hesaplama modelleri (PR gibi) var mı? Öyleyse, bu, program doğruluğunun ne ölçüde kararlaştırılmasına izin verir?

Yazılımımızın keyfi özelliklerini kontrol etmek istemediğimizi bilmek önemlidir. Çok özel, dar özelliklerin kontrol edilmesi (arabellek taşması yok, boş gösterici deşarjı yok, sonsuz döngü yok, vb.) Yazılımın kalitesini ve kullanılabilirliğini son derece geliştirir. Teorik olarak, bu tür problemler hala kararsızdır. Uygulamada, belirli özelliklere odaklanmak, programlarımızda sorunu çözmek için sıklıkla kullanabileceğimiz bir yapı keşfetmemizi sağlar.

Özellikle, orijinal sorunuzu şu şekilde değiştirebilirsiniz:

Turing olmayan bir tam modelde yazılımımı verimli bir şekilde analiz edebileceğim bir soyutlama var mı?

Bir soyutlama, orijinal yazılımın davranışını ve muhtemelen birçok ek davranış içeren bir modeldir. Turing tamamlanmamış ve analiz edebileceğimiz tek tezgahlı makineler veya aşağı itme sistemleri gibi modeller var. Otomatik araçlarla program doğrulamasında standart yaklaşım, böyle bir modelde bir soyutlama oluşturmak ve algoritmik olarak kontrol etmektir.

İnsanların donanımlarının veya yazılımlarının sofistike özelliklerini önemsediği uygulamalar vardır. Donanım şirketleri yongalarının aritmetik algoritmaları doğru bir şekilde uygulamasını istiyor, otomotiv ve aviyonik şirketler onaylanabilir şekilde doğru yazılım istiyor. Eğer bu kadar önemliyse, (eğitimli) bir insan kullanmanız daha iyi olur.


Sanırım karşıt soruyu cevapladınız, yani bir kelime işlemcinin Turing'i tamamlaması mümkün mü? Kayıtların uygun şekilde işlenmesi ile öyle. Bununla birlikte, Turing tamlığını yenmek için kayıt manipülasyon kuralları koymak mümkündür. Benim sorum, bu dar kısıtlamalarda pratik olarak ne kadar programlayabileceğiniz.
David Harris

İşletim sistemlerini ve diğer uygulama yazılımlarını yazmak için Turing tam programlama dili gerektirip gerektirmediği sorusunu yanıtlıyordum. Birden fazla sayaca veya sınırsız veri yapısına ihtiyacınız varsa, Turing tam programlama diline ihtiyacınız olacaktır.
Vijay D

@Vijay: hayır, bu doğru değil. Her ikisi de son derece etkileyici olan ve sınırsız özyinelemeye izin vermeyen birçok tür teorisi vardır (örneğin, Agda ve Coq).
Neel Krishnaswami

@Neel: Açıklığa kavuşturmak için sadece Turing tamlığından bahsediyorum. Bu teorilerde bir Turing makinesini simüle etmek mümkün değil mi?
Vijay D

Bu doğru-- Turing tam değiller. Yapıcı mantıkta, Turing-bütünlüğü, Russell'ın paradoksunun bir analoğunun programlanmasına izin verir.
Neel Krishnaswami
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.