Ben ne kadar anlatmak için bir konumda değilim daha konu üzerinde yapılmalıdır araştırma, ama orada ben söyleyebilirim olduğunu yapılıyor araştırma örneğin, Verisoft XT Alman hükümeti tarafından finanse edilen bir program.
Aradığınızı düşündüğüm kavramlara, resmi doğrulama ve sözleşmeye dayalı programlama denir ; burada ikincisi, ilkini programcı dostu bir yöntemdir. Sözleşmeye dayalı programlamada, önce kodunuzu normal şekilde yazar ve sonra sözleşmeye sözde sözleşmeler eklersiniz. Bu paradigmaya dayanan kolayca kullanılabilen bir dil Microsoft Research tarafından Spec # ve her ikisi de çevrimiçi deneyebileceğiniz C # için işlevsel olarak benzer ancak biraz daha az güzel Kod Sözleşmeleri uzantısıdır (diğer diller için benzer araçlara da sahiptirler, rise4fun'a bakın) ). Bahsettiğiniz "aralık türüne sahip int", bir işlevdeki iki sözleşmeyle yansıtılır:
Contract.Requires(-3 <= a && a <= 24);
Contract.Requires( 3 <= b && b <= 10);
Bu işlevi çağırmak istiyorsanız, bu ölçütleri karşılaması gereken parametreleri kullanmanız veya derleme zamanı hatası almanız gerekir. Yukarıdakiler çok basit sözleşmelerdir, değişkenler veya istisnalar ve bunların ilişkileri hakkında neredeyse her türlü varsayım veya gereksinimi ekleyebilir ve derleyici her gereksinimin bir varsayım veya sağlanabilecek bir şey tarafından karşılanıp karşılanmadığını kontrol eder, yani türetilmiş varsayımlardan. Bu nedenle ismin kaynaklandığı yer: Çağıran gereksinimi karşılar , arayan bir iş sözleşmesinde olduğu gibi bunların karşılanmasını sağlar .
P(x1,x2,...,xn)nPkullanıldı. CS tarafından bakıldığında, bu ikisi sürecin kritik parçalarıdır - doğrulama koşullarının oluşturulması zordur ve SMT, düşünülen teorilere bağlı olarak NP tam veya kararsız bir sorundur. SMT çözücüler için bile bir rekabet var, bu yüzden kesinlikle bu konuda biraz araştırma var. Buna ek olarak, SMT'nin durum alanı numaralandırması, sembolik model kontrolü, sınırlı model kontrolü ve daha fazlası gibi resmi doğrulama için SMT kullanılmasına alternatif yaklaşımlar vardır, ancak SMT de şu anda en "modern" yaklaşımdır.
Genel fikrin sınırları ile ilgili olarak:
- Daha önce belirtildiği gibi, programın doğruluğunu kanıtlamak hesaplama açısından zor bir sorundur, bu nedenle sözleşmeli bir programın (veya başka bir spesifikasyon biçiminin) derleme zaman kontrolünün gerçekten uzun sürmesi veya hatta imkansız olması mümkün olabilir. Çoğu zaman iyi çalışan buluşsal yöntemler uygulamak, bu konuda yapabileceği en iyi şeydir.
- Programınız hakkında ne kadar çok belirlerseniz, belirtimin kendisinde hata olma olasılığı o kadar artar . Bu, programınızda hala hatalar olsa bile yanlış pozitiflere (her şey hatasız olsa bile derleme zamanı denetimi başarısız olur) veya güvenli olmanın yanlış izlenimine yol açabilir.
- Sözleşme veya şartname yazmak gerçekten sıkıcı bir iştir ve çoğu programcı bunu yapmak için çok tembeldir. Her yerde kod sözleşmeleri ile bir C # programı yazmaya çalışın, bir süre sonra "hadi, bu gerçekten gerekli mi?" Bu nedenle, resmi doğrulama genellikle donanım tasarımı ve uçak veya otomasyon kontrol yazılımı gibi güvenlik açısından kritik sistemler için kullanılır.
Yukarıdaki açıklamaya tam olarak uymayan bahsetmeye değer son şey, "Örtülü Karmaşıklık Teorisi", örneğin bu çalışma . Yazabileceğiniz her bir programın belirli bir karmaşıklık sınıfına, örneğin P'ye düştüğü programlama dillerini karakterize etmeyi amaçlamaktadır. Böyle bir dilde, yazdığınız her programın otomatik olarak "kontrol edilebilen" polinom çalışma zamanı olması "sağlanır". sadece programı derleyerek. Bununla birlikte, bu araştırmanın pratik olarak kullanılabilir herhangi bir sonucunu bilmiyorum, ama aynı zamanda bir uzman olmaktan çok uzakım.