Kodun doğruluğu kanıtları ana akım olacak mı? [kapalı]


14

En önemsiz programlar dışında hepsi hatalarla doludur ve bu nedenle onları kaldırmayı vaat eden her şey son derece çekici. Şu anda, doğruluk kanıtları koddur, esas olarak bunu öğrenmenin zorluğu ve bir programı doğru bir şekilde kanıtlamak için gereken ekstra çaba nedeniyle son derece ezoteriktir. Kod kanıtlamanın hiç bitmeyeceğini düşünüyor musunuz?

Yanıtlar:


8

Gerçekten bu anlamda değil, ancak bu alanda saf fonksiyonel programlama iyidir. Haskell kullanıyorsanız, kod derlenirse programınızın doğru olması muhtemeldir. ES hariç, iyi bir tip sistem iyi bir yardımcıdır.

Ayrıca sözleşme için programlama da yardımcı olabilir. Bkz. Microsoft Kod Sözleşmeleri


6
Özür dilerim - Çok "gerçek dünya" Haskell yapmadım, ama birkaç yaşam için yeterli öğretici alıştırma yaptım. Derlenmesi, çalışmanın muhtemel olduğu anlamına gelmez. Örneğin Ada ile karşılaştırıldığında (kesinlikle statik olarak yazılmış bir zorunlu dil olduğu için seçildi), Haskell'in biraz daha kolay olduğunu söyleyebilirim, ancak çoğunlukla daha özlü olduğu için (düşük siklomatik karmaşıklık). IO monad ile uğraşırken, Haskell'i doğru hale getirmeyi daha zorlaştıracak sıkıntılar var - doğal olarak yapamayacağı şeylerin olması zorunlu bir tarzdan yeterince farklı.
Steve314

"Doğal olarak yapamaz" durumunda, bir "while" döngüsü düşünün. Evet, kendiniz dönebilirsiniz - ancak while koşulu monad içinde olmalıdır, çünkü döngü gövdesinin yan etkilerine tepki göstermesi gerekir. Bu, while koşulu içinde yan etkilere neden olmanız için izin verildiği anlamına gelmez, aynı zamanda while while döngüsünü kullanmanın garip olmasını sağlar. Sonuç - IO monad kodunda bile özyineleme kullanmak genellikle daha kolaydır ve bu, işleri belirli bir şekilde yapılandırmanız gerektiği anlamına gelir.
Steve314

14

En önemsiz programlar hariç hepsi

makul çabayla doğru olduğuna dair tamamen kanıtlanamaz. Herhangi bir resmi doğruluk kanıtı için, en azından resmi bir spesifikasyona ihtiyacınız vardır ve bu spesifikasyon tam ve doğru olmalıdır. Bu, çoğu gerçek dünya programı için kolayca oluşturabileceğiniz bir şey değildir. Örneğin, bu tartışma sitesinin kullanıcı arayüzü gibi bir şey için böyle bir özellik yazmaya çalışın ve ne demek istediğimi biliyorsunuz.

Burada konuyla ilgili güzel bir makale buldum:

http://www.encyclopedia.com/doc/1O11-programcorrectnessproof.html


Doğru - herhangi bir programlama projesi için, sorunun gayri resmi bir tanımından biçimsel olana (genellikle bugün bir program şeklinde) bir geçiş vardır ve bu ortadan kalkmaz.
David Thornley

astree.ens.fr Burada Astrée'nin Endüstriyel Uygulamaları'na bakınız
zw324

@ZiyaoWei: bu tür araçlar yardımcı olur, ancak daha fazla değil, sadece bazı resmi hatalar bulurlar. Gibi tek satırlı bir program printf("1")doğruysa ya da doğru değilse (örneğin, gereksinim "1'den 6'ya eşit olarak dağıtılmış rasgele bir sayı yazdırdığı için) böyle bir statik analizör tarafından karar verilemez.
Doc Brown

10

Resmi kanıtlarla ilgili sorun, sorunun yalnızca bir adım geri taşınmasıdır.

Bir programın doğru olduğunu söylemek, bir programın yapması gerekeni yaptığını söylemekle eşdeğerdir. Programın ne yapması gerektiğini nasıl tanımlarsınız? Siz belirleyin. Özelliğin kapsamadığı durumlarda, programın ne yapması gerektiğini nasıl tanımlarsınız? Peki, o zaman spesifikasyonu daha ayrıntılı hale getirmelisiniz.

Diyelim ki spesifikasyonunuz sonunda tüm programın her yönünün doğru davranışını tanımlayacak kadar ayrıntılı hale geliyor. Artık kanıtlama araçlarınızı anlamasını sağlayacak bir yola ihtiyacınız var. Yani, spekülasyon aracının anlayabileceği bir tür resmi dile çevirmeniz gerekiyor ... hey, bir dakika!


2
Ayrıca .. "Yukarıdaki koddaki hatalara dikkat edin; sadece doğru olduğunu kanıtladım, denemedim." - Donald Knuth
Brendan

8

Resmi doğrulama uzun bir yol kat etti, ancak genellikle endüstri / yaygın olarak kullanılan araçlar en son araştırmaların gerisinde kalıyor. İşte bu yönde bazı son çabalar:

Spec # http://research.microsoft.com/en-us/projects/specsharp/ Bu, kod sözleşmelerini (ön / sonrası koşulları ve değişmezler) destekleyen ve bu sözleşmeleri çeşitli statik analiz yapmak için kullanabilen bir C # uzantısıdır. .

Buna benzer projeler, java için JML gibi diğer diller için de mevcuttur ve Eiffel de bu kadar yerleşiktir.

Daha da ileri giderek, slam ve blast gibi projeler, programcı ek açıklama / müdahale ile belirli davranış özelliklerini doğrulamak için kullanılabilir, ancak yine de modern dillerin tüm genelliği ile ilgilenemez (tamsayı taşması / işaretçi aritmetiği gibi şeyler modellenmez).

Gelecekte pratikte kullanılan bu tekniklerin daha fazlasını göreceğimize inanıyorum. Ana engel, program değişmezlerinin manuel ek açıklamalar olmadan çıkarım yapmasının zor olmasıdır ve programcılar genellikle bu ek açıklamaları vermek istemezler çünkü bunu yapmak çok sıkıcı / zaman alıcıdır.


4

Kapsamlı geliştirici çalışması olmadan kodu otomatik olarak kanıtlama yöntemi ortaya çıkmadıkça değil.


Ekonomik argümanı düşünün: belki de geliştiricilerin yazılım hataları nedeniyle para kaybetmekten ziyade doğruluk kanıtlarıyla "boşa harcaması" daha iyidir.
Andres F.

Fishtoaster ile hemfikirim, çok daha az kaynak yoğun olmadıkça, düzenli iş yazılımlarının büyük bir kısmı bu doğruluk düzeyini desteklemek için maliyet / faydaya sahip olmayacaktır. Esir bir kitleye bir LOB uygulamasında bazen bir hata raporuyla ilgili maliyet için en fazla iş yararı, "bunu yapma" yazan dokümanlara bir çizgi eklemektir
Bill

3

Bazı resmi yöntem araçları (örneğin kritik gömülü C yazılımı için Frama-C gibi ) belirli bir yazılımın (doğru) kanıtını sağlayan (en azından kontrol eden) olarak görülebilir. (Frama-C, bir programın bir şekilde resmileştirilmiş spesifikasyonuna uyduğunu ve programdaki açıklamalı açıklamalı değişmezlere saygı duyduğunu kontrol eder).

Bazı sektörlerde, bu tür resmi yöntemler mümkündür, örneğin sivil uçaklarda kritik yazılım için DO-178C . Bazı durumlarda, bu tür yaklaşımlar mümkün ve yararlıdır.

Tabii ki, daha az buggy yazılımı geliştirmek çok maliyetlidir. Ancak resmi yöntem yaklaşımı bir tür yazılım için mantıklıdır. Kötümserseniz, hatanın koddan biçimsel spesifikasyonuna (bazı "hatalara" sahip olabileceğini düşünebilirsiniz, çünkü bir yazılımın amaçlanan davranışını resmileştirmek zordur ve hataya açıktır).


3

Bu soruya rastladım ve bu bağlantının ilginç olabileceğini düşünüyorum:

Astrée'nin Endüstriyel Uygulamaları

2003 yılında 130 binden fazla kod satırı ile Airbus tarafından kullanılan bir sistemde RTE'nin olmadığını kanıtlamak kötü görünmüyor ve merak ediyorum, bunun gerçek dünya olmadığını söyleyecek.


2

Hayır. Bunun ortak atasözü, "Teoride, teori ve pratik aynıdır. Pratikte değil."

Çok basit bir örnek: Yazım hataları.

Aslında kodun birim testi ile çalıştırılması, bu tür şeyleri neredeyse anında bulur ve uyumlu bir test seti resmi kanıtlara olan ihtiyacı ortadan kaldıracaktır. Tüm kullanım durumları - iyi, kötü, hata ve uç durumlar - kodun koddan ayrı olan herhangi bir kanıttan daha doğru olduğunu kanıtlayan daha iyi kanıt olarak sonuçlanan birim testlerinde numaralandırılmalıdır.

Özellikle gereksinimler değişirse veya bir hatayı düzeltmek için algoritma güncellenirse - kod yorumlarının sıklıkla aldığı gibi resmi kanıtın güncelliğini yitirmesi daha olasıdır.


3
Yanlış. Hiçbir birim testi tüm olası parametreleri kapsamaz. Bir derleyiciyi bu şekilde "birim testi" yaptığınızı ve geçiş semantiğinin olmadığından emin olun.
SK-logic

3
birim test kutsal
kâse

1
@Winston Ewert, doğrulanmış derleyiciler (ve daha birçok doğrulanmış montajcı) var. Ve donanım, yazılımdan çok daha sık resmi olarak doğrulanır. Buraya bakın: gallium.inria.fr/~xleroy/publi/compiler-certif.pdf
SK-logic

1
@ SK-logic, evet akademik amaçlarla ispatlanmış oyuncak derleyiciler var. Ama insanların gerçekten kullandığı derleyiciler ne olacak? Çoğu derleyicinin çeşitli otomatik test formları kullanılarak kontrol edildiğinden ve neredeyse hiçbir resmi doğru kanıt yapılmadığından şüpheleniyorum.
Winston Ewert

1
Winston Ewert, doğruluk kanıtları pratiktir ve gerçek hayatta yaygın olarak kullanılmaktadır. Çok pratik olmayan, modern ana akım dillerin çoğudur. Umarım hepsi ölür, bu yüzden doğruluk kanıtlarının değeri gelecekte artacaktır.
SK-logic

1

Duruş probleminden dolayı doğruluk kanıtlarına getirilen sınırların, doğruluk kanıtlarının ana akım haline gelmesinin önündeki en büyük engel olabileceğini düşünüyorum.


8
Durma sorunu, keyfi bir programın durup durmadığını belirleyemeyeceğimizi söylüyor. Bu programlar tuhaf şeyler yapabilir, mesela Mersenne prime olup olmadığını görmek için her tamsayıyı test edin. Bunu normal programlarda yapmıyoruz!
Casebash

1
@Casebash, soru, durdurma sorununun çözülebileceği yararlı bir program alt kümesi olup olmadığıdır. Bu hiçbir şekilde net değil. Yani programlarımızı kısıtlayabilir miyiz, böylece faydalı görevleri yapma yeteneğimizi bozmadan her tamsayıyı test etmek gibi şeyler yapamayız?
Winston Ewert

1

Zaten herkes tarafından kullanılıyor. Programlama dilinizin tip kontrolünü her kullandığınızda, temel olarak programınızın doğruluğunu matematik olarak kanıtlarsınız. Bu zaten çok iyi çalışıyor - sadece kullandığınız her fonksiyon ve veri yapısı için doğru tipleri seçmenizi gerektirir. Tür ne kadar doğru olursa, alacağınız kontrol o kadar iyi olur. Programlama dillerinde mevcut olan mevcut türlerin zaten neredeyse tüm olası davranışları tanımlamak için yeterince güçlü araçları vardır. Bu, mevcut her dilde çalışır. C ++ ve statik diller sadece derleme zamanında kontroller yaparken, python gibi daha dinamik diller program çalıştırıldığında yapıyor. Çek hala tüm bu dillerde mevcut. (örneğin, c ++, haskell'in yaptığı gibi yan etkilerin kontrolünü zaten destekler,


C ++ 'daki yan etkiler hakkında biraz, const doğruluğundan bahsediyor musunuz?
Winston Ewert

evet, const + const üye işlevi. Tüm üye işlevleriniz sabitse, nesnelerdeki tüm veriler değiştirilemez.
tp1

Onlar kullanırsanız hala değiştirilebilir vardır mutableya const_cast. Kesinlikle orada çizdiğiniz bağlantıyı görüyorum, ancak iki yaklaşımın tadı benim için oldukça farklı görünüyor.
Winston Ewert

Bu yüzden onu kullanmayı seçmeniz gerekiyor - her zaman etrafta dolaşmanın yolları var. Ancak önemli olan, derleyicilerin bölgedeki problemleri nasıl kontrol edeceğidir.
tp1
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.