Teorik olarak hatasız programlar


12

Ben kod hatasız olamaz, ve bu teoremler hakkında konuşurken devlet makaleleri çok okudum:

Aslında Rice'ın teoremi durma probleminin bir sonucuna benziyor ve durma problemi Gödel'in eksiklik teoremi ile yakın ilişki içindedir.

Bu, her programın en az bir istenmeyen davranışa sahip olacağı anlamına mı geliyor? Yoksa doğrulamak için kod yazmanın mümkün olmadığı anlamına mı geliyor? Özyinelemeli denetime ne dersiniz? İki programım olduğunu varsayalım. Her ikisinin de hataları var, ama aynı hatayı paylaşmıyorlar. Onları aynı anda çalıştırırsam ne olur?

Ve elbette tartışmaların çoğu Turing makineleri hakkında konuştu. Doğrusal sınırlı otomasyon (gerçek bilgisayarlar) ne olacak?


10
Eminim bu python programı yapmak istediği her şeyi yapıyor ve artık yok: print "Hello, World!"... biraz daha açık olabilir misiniz?
durron597

2
@ durron597: Böyle bir yazılım için bir pazar var mı? Merhaba dünya yazıcıları, yeniden yüklenmiş sürüm? Şimdi daha fazla hellos ve daha fazla dünya ile mi?
JensG

1
@Phoshi faugh. İşlemin tüm kapsamını, hata içermeyen bir kerede görebileceğiniz kadar basit bir program (örneğin, bir breadboard üzerinde teller kullanarak) yazmak yeterlidir. Yorumumun ayrıntılarını ana noktama hitap etmeden saldırıyorsunuz, yani hata içermeyen son derece basit programlar yazmak mümkün.
durron597

2
@Phoshi "Python yorumlayıcınızda hata olmadığını kanıtlayın." Python uygulamasındaki hatalar programı yanlış yapmaz . Program, Python uygulamasının dil belirtimine uygun olduğu düşünülüyorsa, doğrudur. Herhangi bir kanıt bazı şeyleri aksiyom olarak alır - örneğin, evrenin programın yürütülmesi boyunca var olmaya devam edeceğini varsaymanız gerekir. CPython'un bir hatası varsa, sonuç yanlış olabilir, ancak hata programda değildi.
Doval

11
Bu teoremler hiçbiri sahip şey böcek veya böcek serbest programların varlığı ile ilgisi yok. Bunlar, hesaplama ile hangi soruların cevaplanabileceğine dair teoremlerdir. Bu teoremler , hesaplanamayan bazı problemler olduğunu ve ne kanıtlanıp ne de kanıtlanamayan bazı matematiksel önermelerin olduğunu gösterir, ancak kesinlikle tüm programların hataları olduğunu veya belirli programların doğru kanıtlanamayacağını söylemezler .
Charles E. Grant

Yanıtlar:


18

Programların hatasız olamayacağı o kadar da değil; kanıtlamaya çalıştığınız programın önemsiz olduğunu kanıtlamak çok zor.

Denemediğin için değil, dikkat et. Tip sistemlerinin bir miktar güvence sağlaması beklenir; Haskell, bunu bir dereceye kadar yapan oldukça sofistike bir tip sistemine sahiptir. Ancak tüm belirsizlikleri asla ortadan kaldıramazsınız.

Aşağıdaki işlevi göz önünde bulundurun:

int add(int a, int b) { return a + b; }

Bu işlevle ilgili sorun ne olabilir? Ne düşündüğünü zaten biliyorum. Diyelim ki taşma kontrolü vb. Gibi tüm üsleri kapladık. Bir kozmik ışın işlemciye çarptığında ve çalışmasına neden olursa ne olur?

LaunchMissiles();

yerine?

Tamam, belki bu biraz çelişkili. Ancak addyukarıdaki işlev gibi basit işlevlerin bile , işlemcinin sürekli olarak bağlamları değiştirdiği, birden çok iş parçacığı ve çekirdek arasında geçiş yaptığı ortamlarda çalışması gerekir. Böyle bir ortamda her şey olabilir. Bundan şüphe ediyorsanız, RAM'in hatasız olduğu için değil, kaçınılmaz olarak oluşan bit hatalarını düzeltmek için yerleşik bir sistemi olduğu için güvenilir olduğunu düşünün .

Ne düşündüğünü biliyorum. "Ama donanımdan değil yazılımdan bahsediyorum."

Yazılımın olması gerektiği gibi çalıştığına dair güven düzeyinizi artırabilecek birçok teknik vardır. Fonksiyonel programlama bunlardan biridir. Fonksiyonel programlama, eşzamanlılık hakkında daha iyi bir neden belirlemenizi sağlar. Ancak fonksiyonel programlama bir kanıt değildir, ünite testlerinden daha fazlasıdır.

Neden? Çünkü kenar olayları denen şeylere sahipsiniz .

Ve basitliğinin sadece biraz ötesine geçtiğinizde, bir programın doğruluğunu kanıtlamakreturn a + b oldukça zor hale gelir .

İleri Okuma
Doğru Şeyleri
Yazıyorlar Ariane 5 Patlaması


6
Tamamen doğru int add(int a, int b) { return a - b; }
yazma

@DonalFellows: İşte tam da bu yüzden Ariane 5 ile ilgili bağlantıyı dahil ettim
Robert Harvey

2
@DonalFellows - Matematiksel karakterizasyon sorunu çözmez, sadece başka bir yere taşır. Matematiksel modelin aslında müşterinin ihtiyacını temsil ettiğini nasıl kanıtlarsınız?
mouviciel

1
@JohnGaughan Bu modüller arasındaki bağımlılıkları varsayar. Birbirinden bağımsız olarak kanıtlanmış ve kanıtlanmış modüller göz önüne alındığında, bunları doğru ve bağımsız reklam sonsuz olduğu da bilinen daha büyük modüllere özyineli olarak oluşturabilirsiniz.
Doval

1
@JohnGaughan Modüllerin entegrasyonu hatalara neden oluyorsa, bağımsız olduklarını kanıtlayamadınız. Yerleşik kanıtlardan yeni kanıtlar oluşturmak, aksiyomlardan kanıtlar oluşturmaktan daha zor değildir. Eğer matematik bu şekilde katlanarak zorlaşırsa, matematikçiler berbat olurdu. Derleme komut dosyalarınızda hatalar olabilir, ancak bu ayrı bir programdır. Bir şeyler oluşturmaya çalıştığınızda yanlış giden bir gizem öğesi yoktur, ancak yan etkilerin sayısına bağlı olarak paylaşılan bir durum olmadığını kanıtlamak zor olabilir.
Doval

12

İlk olarak, bunu hangi bağlamda tartışmak istediğinizi belirleyelim. Stack Exchange'deki Programcılar Soru ve Cevapları, büyük olasılıkla teorik sonuçlar ve Bilgisayar Bilimi teoremlerinden ziyade araçların / dillerin gerçek dünyadaki varlığına ilgi duyduğunuzu gösteriyor .

Kodun hatasız olamayacağını belirten birçok makale okudum

Umarım böyle bir ifade yanlıştır. Her ne kadar büyük ölçekli uygulamaların çoğunun benim bilgi ve tecrübelerimin en iyisi için hatasız olmadığı genel olarak kabul edilmektedir .

Daha yaygın olarak kabul edilen, Turing-complete programlama dilinde yazılmış bir programın tamamen hatasız olup olmadığını mükemmel bir şekilde belirleyen bir aracın mevcut olmamasıdır (yani varoluş, olasılık değil) .

Kanıt olmayan bir durum, günlük deneyimin gözlem verileriyle birlikte, Durma Sorununun sezgisel bir uzantısıdır.

Orada yapar "delilleri yapabileceği exist yazılım doğruluğu bir program tekabül karşıladığını doğrulamak" biçimsel program için spesifikasyonları.

Bu, her programın en az bir istenmeyen davranışa sahip olacağı anlamına mı geliyor?

Hayır. Çoğu uygulamanın en az bir hata veya istenmeyen davranışa sahip olduğu görülmüştür.

Yoksa doğrulamak için kod yazmanın mümkün olmadığı anlamına mı geliyor?

Hayır, şartnameyi takip etmek için resmi şartnameleri ve kanıt asistanlarını kullanabilirsiniz , ancak deneyim gösterdiği gibi, genel sistemde şartname dışındaki faktörler - kaynak kodu çevirmeni ve donanımı gibi hatalar hala mevcut olabilir ve en sık hatalar yapılır özellikleri.

Daha fazla ayrıntı için bkz. Coq böyle bir araç / dil / sistemdir.

Özyinelemeli denetime ne dersiniz?

Bilmiyorum. Buna aşina değilim ve bunun bir hesaplama sorunu mu yoksa derleyici optimizasyonu sorunu mu olduğundan emin değilim.


1
Resmi özellikler ve kanıt asistanları hakkında ilk konuştuğunuz için +1. Bu, önceki cevaplarda eksik olan çok önemli bir noktadır.
Arseni Mourzenko

6

Sormak istiyorum, her kod en az bir istenmeyen davranış alacak anlamına mı geliyor?

Hayır. Doğru programlar yazılabilir ve yazılabilir. Bir programın doğru olabileceğini unutmayın, ancak fiziksel koşullar (örneğin Robert Harvey'nin burada cevabına yazdığı gibi) nedeniyle yürütme başarısız olabilir , ancak bu ayrı bir konudur: bu programın kodu hala doğrudur. Daha açık olmak gerekirse, başarısızlık , bir neden olmadığı arıza veya hata programın kendisi, fakat bunun altında uzanan makinede yürütür bu (*).

(*) Arıza , hata ve arıza için tanımları , sırasıyla statik bir kusur, yanlış bir iç durum ve özelliklerine göre yanlış bir dış gözlemlenen davranış olarak güvenilirlik alanından ödünç alıyorum (bkz. <Bu alandan herhangi bir kağıt>) .

Yoksa, kod yazamayacağım anlamına mı geliyor?

Yukarıdaki açıklamadaki genel duruma bakın ve haklısınız.

Belirli bir X programının doğru olup olmadığını kontrol eden bir program yazabilirsiniz. Eğer yani sırayla iki talimatlar ile biri olarak "merhaba dünya" programını tanımlamak Örneğin, print("hello world")ve exit, bir program yazabilirsiniz onun giriş böylece raporlama, sırayla bu iki talimatlar oluşan bir program olup olmadığını kontrol eder bir olması durumunda "merhaba dünya" programını düzeltin.

Mevcut formülasyonları kullanarak yapamayacağınız şey, herhangi bir keyfi programın durup durmadığını kontrol etmek için bir program yazmaktır, bu da genel durumlarda doğruluk için testin imkansızlığını ima eder.


4

Aynı programın iki veya daha fazla varyantını çalıştırmak, N-varyant (veya N-versiyonu) programlama adı verilen iyi bilinen bir hataya dayanıklılık tekniğidir. Yazılımda hataların varlığının bir kabulüdür.

Genellikle bu varyantlar, farklı derleyiciler kullanılarak farklı geliştirme ekipleri tarafından kodlanır ve bazen farklı işletim sistemlerine sahip farklı CPU'larda yürütülür. Sonuçlar kullanıcıya gönderilmeden önce oylanır. Boeing ve Airbus bu tür mimariyi sever.

Ortak mod hatalarına yol açan iki zayıf bağlantı kalır:

  • Sadece bir şartname vardır.
  • oylama sistemi benzersiz veya karmaşıktır.

5
NASA veya başka bir uzay programının N-varyantının sıklıkla programcıların aynı şekilde düşündüğü problemden muzdarip olduğunu ve bu nedenle kusur en önemsiz seviyenin ötesinde olduğunda ortak kusurlarla eşdeğer programların yakınında bağımsız olarak yazmayı önerdiğine inanıyorum. Örneğin, aynı referans bilgilerine bakın ( ikili aramada uzun süredir devam eden hataya bakın ), aynı algoritmaları kullanma eğilimindedir ve aynı türde hatalar yapar.
mctylr

@mctylr - Çok iyi bir nokta. Ama aslında, yakın zamana kadar, bir uzay aracında bir yazılımın birden fazla varyantını depolamak için bellekte yeterli yer yoktu. Cevapları test, test, test, durulama, tekrarlama.
mouviciel

Uzay mekiği programı üç bağımsız sistem oylama yapılandırması kullandı. Muhalif oylar, sistemin artık doğru olmadığı ve çevrimdışına alındığı anlamına geliyordu (veya gerçekten önerilmişti).

4

Bir programın bazı özellikleri vardır ve bazı ortamlarda çalışır.

(değişen diğerleri cevapları kozmik ışın örneği addiçin FireMissiles "çevre" parçası düşünülebilir)

Programın amaçlanan davranışını (yani belirtimini) ve ortamını resmi olarak belirtebileceğinizi varsayarsak, bazen programın - bu tam anlamıyla hatasız olduğunu (yani davranışının veya çıktısının, biçimlendirmedeki belirtiminin resmileştirilmesine saygı gösterdiğini) resmen kanıtlayabilirsiniz. çevresi).

Özellikle, örneğin Frama-C gibi sağlam statik kaynak analizörleri kullanabilirsiniz .

(ancak bu tür analizörlerin mevcut durumu, GCC derleyicisi veya Firefox tarayıcısı veya Linux çekirdeği gibi büyük ölçekli programların tüm program analizine ve kanıtına izin vermez ve inancım bu tür kanıtların ömrümde gerçekleşmeyeceğidir. 1959'da doğdum)

Bununla birlikte, bazı (sınıf) ortam (lar) da bazı spesifikasyonlar için programın doğru davranış olduğunu kanıtladınız.

Pratik olarak konuşursak, (ve NASA veya ESA muhtemelen bazı uzay aracı yazılımlarının bazı kesin ve resmileştirilmiş spesifikasyonlar olmadan "hatasız" olduğunu kanıtlayabilirsiniz. Ancak bu, sisteminizin her zaman istediğiniz gibi davranacağı anlamına gelmez.

Daha basit bir deyişle, uzay aracı robotunuz bazı ET ile tanışırsa ve bunu belirtmediyseniz, robotunuzun gerçekten istediğiniz gibi davranmasının bir yolu yoktur ....

J.Pitrat'ın blog girişlerini de okuyun .

BTW, Durma problemi veya Gödel teoremi muhtemelen insan beyni ve hatta insan türleri için de geçerlidir.


Belki bir SEU daha iyi bir örnek çağrısı değişen Addetmek LaunchMissilesnihayetinde için hatalı bir çağrıyla sonuçlanan bazı veri değerini değiştirerek bir SEU olacaktır LaunchMissiles. SEU'lar uzaya giden bilgisayarlarda bir sorundur. Bu yüzden modern uzay aracı çoğu zaman birden fazla bilgisayarı uçuruyor. Bu, yeni bir dizi sorun, eşzamanlılık ve artıklık yönetimi ekler.
David Hammen

3

Bu, her programın en az bir istenmeyen davranışa sahip olacağı anlamına mı geliyor?

Hayır.

Durma problemi, her programın sınırlı bir süre içinde durup durmadığını test eden bir program yazmanın imkansız olduğunu söylüyor. Bu, bazı programları durdurma, bazılarını durdurma olarak sınıflandırabilen bir program yazmanın imkansız olduğu anlamına gelmez. Bunun anlamı, durma analizörünün şu ya da bu şekilde kategorize edemeyeceği bazı programlar olacağıdır.

Gödel'in eksiklik teoremleri onlara benzer gri bir alana sahiptir. Yeterli karmaşıklığa sahip bir matematik sistemi göz önüne alındığında, bu sistem bağlamında, doğruluğu değerlendirilemeyen bazı ifadeler olacaktır. Bu, matematikçilerin kanıt fikrinden vazgeçmeleri gerektiği anlamına gelmez. İspat, matematiğin temel taşı olmaya devam etmektedir.

Bazı programların doğru olduğu kanıtlanabilir. Kolay değil, ama yapılabilir. Biçimsel teorem kanıtlamanın amacı budur (biçimsel yöntemlerin bir parçası). Gödel'in eksiklik teoremleri buraya çarpıyor: Tüm programların doğru olduğu kanıtlanamıyor. Bu, resmi yöntemlerin kullanılmasının tamamen boş olduğu anlamına gelmez, çünkü bazı programların gerçekten resmi olarak doğru olduğu kanıtlanabilir.

Not: Resmi yöntemler, kozmik ışının işlemciye çarpması ve launch_missiles()yerine yürütülmesi olasılığını engeller a+b. Programları Robert Harvey'in kozmik ışını gibi tek olaylı rahatsızlıklara maruz kalan gerçek makineler yerine soyut bir makine bağlamında analiz ederler.


1

Orada iyi cevaplar burada bir sürü vardır, ama hepsi bu kritik noktaya etrafında etek görünmektedir: bu teoremleri tüm benzer bir yapıya sahip ve benzeri şeyler söylemek ve ne derler ise değil "muhtemelen doğru yazmak için imkansız programları"(bazı spesifik değeri için 'doğru' ve 'Program' duruma göre değişir), ancak ne yapmak ( 'söz olduğunu' birini biz yanlış ispat edemez hatalı programı yazmaya önlemek imkansız vb).

Durma probleminin özel örneğini alırsak, fark daha netleşir: Açıkçası kanıtlanabilir şekilde durmayan programlar ve kanıtlanmayacak şekilde durmayan diğer programlar vardır. Davranışımız her iki şekilde de belirlenemeyen üçüncü bir program sınıfının olması, yapmak istediğimiz tek şey makul bir şekilde durdurulan bir program yazmaksa, o sınıfa ait bir program yazmaktan kaçınabileceğimiz için sorun değildir.

Aynı şey Rice teoremi için de geçerlidir. Evet, bir programın önemsiz olmayan herhangi bir özelliği için, bu özelliğin doğru veya yanlış olduğu kanıtlanmamış bir program yazabiliriz; böyle bir program yazmaktan da kaçınabiliriz, çünkü bir programın uygun olup olmadığını belirleyebiliriz.


0

Cevabım, gerçek dünya işi ve her geliştirme ekibinin karşılaştığı zorluklar açısından olacaktır. Bu soruda ve cevapların çoğunda gördüğüm şey gerçekten kusurları kontrol etmekle ilgili.

Kod hatasız olabilir. Herhangi bir programlama dili için "Hello World" kod örneklerinden herhangi birini alın ve bunu platformda tasarlandığı şekilde çalıştırın ve tutarlı bir şekilde çalışacak ve istenen sonuçları üretecektir. Kodun hatasız olmasının imkansızlığı konusunda herhangi bir teori sona ermektedir.

Mantık daha karmaşık hale geldikçe potansiyel hatalar ortaya çıkar. Basit Hello World örneğinde mantık yoktur ve her seferinde aynı statik şeyi yapar. Siz mantık güdümlü dinamik davranış ekler eklemez hatalara yol açan karmaşıklığı getiren şeydir. Mantığın kendisi kusurlu olabilir veya mantığa girilen veriler mantığın işlemeyeceği şekilde değişebilir.

Modern bir uygulama ayrıca çalışma zamanı kütüphanelerine, CLR, ara katman yazılımı, veritabanı vb. Katmanlara da bağlıdır.

Son olarak, uygulamanın mantığını besleyen verileri tükettiği uygulamalar / sistemler zinciri, mantıklarında veya yazılım içindeki tüm potansiyel hata kaynaklarıdır; mantık sürülerini veya veri tükettiği yukarı akış sistemlerini üst üste koyar.

Geliştiriciler, uygulamalarının mantığını destekleyen her hareketli parçanın% 100 kontrolünde değildir. Aslında pek kontrolümüz altında değiliz. Bu nedenle birim testi önemlidir ve yapılandırma ve değişiklik yönetimi, görmezden gelmemiz veya tembel / özensiz olmamamız gereken önemli süreçlerdir.

Ayrıca, uygulamanız arasında, kontrolünüz dışındaki bir kaynaktan veri tüketen, aktarılan veriler için spesifik biçim ve özellikleri ve sisteminizin, çıktı sisteminin dahilinde olmasını sağlamaktan kaynak sistemin sorumlu olduğunu varsaydığı herhangi bir sınırlama veya kısıtlamayı tanımlayan belgelenmiş anlaşmalar bu sınırlar.

Yazılım mühendisliğinin gerçek dünya uygulamasında, teorik olarak uygulamaların neden hatasız olamayacağını işinize açıklayarak onu uçuramazsınız. Teknoloji ve iş arasındaki bu nitelikteki tartışmalar, işletmenin para kazanma, para kaybetmeyi önleme ve / veya insanları canlı tutma yeteneğini etkileyen teknolojik bir arızadan sonra asla gerçekleşmeyecektir. "Bu nasıl olabilir" cevabı "bu teoriyi açıklayayım, böylece anlasın" olamaz.

Teorik olarak hesaplamayı gerçekleştirmek ve bir sonuç almak için sonsuza dek sürebilecek devasa hesaplamalar açısından, bir sonuçla bitip sonuç veremeyen bir uygulama - bu bir hatadır. Hesaplamanın doğası çok zaman alıcı ve yoğun hesaplama yapacak şekilde yapılıyorsa, bu talebi alırsınız ve sonucu nasıl / ne zaman alabileceklerini kullanıcıya geri bildirir ve parazit yapmak için paralel iplikleri başlatırsınız. Bunun tek bir sunucuda yapılabileceğinden daha hızlı olması gerekiyorsa ve iş yeterince önemliyse, gerektiği kadar sistemde ölçeklendirirsiniz. Bu yüzden bulut çok caziptir ve iş yapmak için düğümleri döndürme ve bittiğinde onları döndürme yeteneği.

Herhangi bir hesaplama gücünün tamamlanamayacağı yönünde bir talepte bulunma olasılığı varsa, işin sonlu bir sorun olduğunu düşündüğünün cevabını bekleyen bir iş süreci ile sonsuzluğa kaçmamalı.


-2

Kod asla% 100 hatasız olduğuna inanmıyorum çünkü kod asla gerçekten bitmedi. Ne yazdığınızı geliştirebilirsiniz.

Programlama, her ikisi de sonsuz olan bir bilim ve matematik alanıdır. Bir geliştirici olmanın en güzel yanı, işimizin sonsuz olmasıdır.

Tek bir kod satırı yazmanın binlerce artı yolu vardır. Fikir, bu kod satırının en iyileştirilmiş sürümünü yazmaktır, ancak bu hata ücretsiz olmayabilir. Hata içermez, kodunuzun kırılmaz olduğu ve tüm kodların bir dereceye veya yöntemle kırılabileceği fikrine işaret eder.

Kod etkili olabilir mi? Evet.
Kod sonsuza dek optimize edilebilir mi? Evet.
Kod hatasız olabilir mi? Hayır, henüz kırmanın bir yolunu bulamadınız.
Bununla birlikte, kendinizi ve kod yazma uygulamalarınızı daha iyi hale getirmeye çalışırsanız, kodunuzun kırılması zor olacaktır.


bu yazıyı okumak oldukça zor (metnin duvarı). Sakıncası var düzenleyebilir daha iyi bir şekle ing?
gnat
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.