Yazılım Geliştirme: C++26 Sözleşmeleri | merhaba çevrimiçi

Adanali

Active member
Yazılım Geliştirme: C++26 Sözleşmeleri | merhaba çevrimiçi


  1. Yazılım geliştirme: C++26'da sözleşmeler

C++26'daki yansıma konulu kısa seriden sonra şimdi sözleşmelerden bahsedelim. Bu, işlevler için önkoşulları, sonkoşulları ve değişmezleri belirtmenize olanak tanır.


Duyuru








Rainer Grimm uzun yıllardır yazılım mimarı, ekip ve eğitim yöneticisi olarak çalışmaktadır. C++, Python ve Haskell programlama dilleri üzerine makaleler yazmaktan hoşlanıyor, aynı zamanda özel konferanslarda sık sık konuşmaktan da hoşlanıyor. Modern C++ adlı blogunda C++ tutkusunu yoğun bir şekilde ele alıyor.













Sözleşmelerin zaten C++20'nin bir parçası olması gerekiyordu ancak Köln'deki standart toplantı sırasında kaldırıldı. Herb Sutter, Sutter's Mill'de bu konuda şunları söylemişti: “Sözleşmeler, C++20'nin şu ana kadarki en etkili özelliğidir ve muhtemelen C++11'den bu yana C++'a eklediğimiz en etkili özelliktir.” C++26 ile muhtemelen bunu başaracağız.

Bu makale P2961R2 önerisine dayanmaktadır.

Sözleşme nedir?


Bir sözleşme, yazılım bileşenleri için arayüzleri kesin ve doğrulanabilir bir şekilde belirtir. Bu yazılım bileşenleri, ön koşulların, son koşulların ve değişmezlerin karşılaması gereken işlevler ve yöntemlerdir. İşte tanımlar:

  • A Önkoşul: bir işleve erişirken uygulanması gereken bir yüklem,
  • A Sonkoşul: fonksiyondan çıkarken uygulanması gereken bir yüklem,
  • A İddia: hesaplamada kendi noktasında geçerli olduğu söylenen bir yüklem.
Önkoşul ve sonkoşul, fonksiyon tanımının dışına yerleştirilir, ancak değişmez, fonksiyon tanımının içine yerleştirilir. Yüklem, Boole değeri olarak değerlendirilen bir ifadedir.

Size ilk örneği göstermeden önce sözleşme tasarımının amaçları hakkında bir şeyler yazmak istiyorum.

Tasarım hedefleri


Aşağıdaki tasarım hedefleri İngilizce olarak tanımlanmıştır:

  • Sözdizimi doğal olarak mevcut C++'a uymalıdır. Niyet, sözleşme kontrollerine aşina olmayan kullanıcılar tarafından karışıklığa yol açmayacak şekilde sezgisel olarak anlaşılabilmelidir.
  • Bir sözleşme denetimi önceden var olan bir özniteliğe, lambdaya veya başka herhangi bir C++ yapısına benzememelidir. Kendi anında tanınabilir tasarım alanına oturmalıdır.
  • Sözdizimi zarif ve hafif görünmelidir. Gereğinden fazla token ve karakter kullanılmamalıdır.
  • Okunabilirliği kolaylaştırmak için sözdizimi, bir sözleşme denetiminin farklı sözdizimsel bölümlerini görsel olarak ayırmalıdır. Sözleşmenin türü, yüklemi, getiri değerinin adı bir bakışta ayırt edilebilmelidir… (Teklif P2961R2)
Şimdi ilk örnek şöyle:


int f(int i)
pre (i >= 0)
post (r: r > 0)
{
contract_assert (i >= 0);
return i+1;
}


pre VEYA post

  • bir önkoşul veya sonkoşul ekleyin. Bir fonksiyonun herhangi bir sayıda önkoşulu ve sonkoşulu olabilir. İstenildiği gibi birbirine karıştırılabilirler.
  • bunlar bağlama bağlı anahtar kelimelerdir, yani belirli bağlamlarda bir anahtar kelimedir, ancak bu bağlamın dışında bir tanımlayıcıdır.
  • işlev bildiriminin sonuna yerleştirilirler.
post bir dönüş değeri olabilir. Tanımlayıcı yüklemden önce görünmelidir ve ardından iki nokta üst üste gelmelidir.

contract_assert

  • bu anahtar bir kelimedir. Aksi halde bir işlev çağrısından ayırt edilemeyebilir.
İddia sorunu


Garanti için ideal anahtar kelime şu olacaktır: assertancak Contract_assert değil. assert çoğu programlama dilinde sözleşmeye dayalı iddiaları ifade etmek için kullanılır. Ancak C++'ın eski bir sorunu var.


#include <cassert>

void f() {
int i = get_i();
assert(i >= 0); // identical syntax for contract assert and macro assert!
use_i(i);
}


assert bu zaten başlıktan bir makrocassert>.

Maalesef Sözleşmeleri çalışırken gösteremiyorum çünkü bildiğim kadarıyla hiçbir derleyici sözdizimini desteklemiyor.

Bir sonraki adım nedir?


Bir sonraki yazımda çekirdek C++26 dilinin daha küçük özelliklerine bakacağım.


(Ben)
 
Üst