"Olduğu gibi" kuralı tam olarak nedir?


90

Başlığın dediği gibi,

"Olduğu gibi" kuralı tam olarak nedir?

Alınacak tipik bir cevap şudur:

Programın gözlemlenebilir davranışını değiştirmeyen tüm kod dönüşümlerine izin veren kural

Zaman zaman bu kurala atfedilen belirli uygulamalardan davranışlar almaya devam ediyoruz. Çoğu zaman yanlış. Peki bu kural tam olarak nedir? Standart, bu kuralı bir bölüm veya paragraf olarak açıkça belirtmiyor, öyleyse bu kuralın kapsamına tam olarak ne girer? Bana göre, standart tarafından ayrıntılı olarak tanımlanmayan gri bir alan gibi görünüyor. Standarttaki referanslara atıfta bulunarak ayrıntılar üzerinde bir açıklama yapılabilir mi?

Not: Bunu hem C hem de C ++ olarak etiketlemek, çünkü her iki dille de ilgilidir.


2
Soyut makineyi ifade eder.
Alexey Frunze

" Bunu hem C hem de C ++ olarak etiketlemek, çünkü her iki dille de ilgilidir " Herhangi bir dilde alakalı.
wonderguy

@AlexeyFrunze " Soyut makineye atıfta bulunur" "Soyut makinenin" durumunu, bir amaç değil, bir araç olarak ve uygunluk açısından alakasız olduğunu ifade eder, çünkü "soyut", yani bir şartname aracı olan gerçek değildir.
Meraklıguy

Yanıtlar:


100

" Sanki " kuralı nedir?

" As-eğer " temelde bir uygulama yasal bir C ++ programı gerçekleştirmek için izin verildiğini dönüşümler tanımlarınızı kural. Kısaca, bir programın " gözlemlenebilir davranışını " etkilemeyen tüm dönüşümlere (kesin bir tanım için aşağıya bakın) izin verilir.

Amaç, programın davranışı C ++ Standardı tarafından soyut bir makine açısından belirtilen semantiğe uygun kaldığı sürece uygulamalara optimizasyonları gerçekleştirme özgürlüğü vermektir.


Standart bu kuralı nerede sunar?

C ++ 11 Standardı , Paragraf 1.9 / 1'de " olduğu gibi " kuralını getirmektedir:

Bu Uluslararası Standarttaki anlamsal açıklamalar, parametreleştirilmiş belirleyici olmayan bir soyut makineyi tanımlar. Bu Uluslararası Standart, uyumlu uygulamaların yapısına herhangi bir gereklilik getirmez. Özellikle, soyut makinenin yapısını kopyalamaları veya taklit etmeleri gerekmez. Daha ziyade, uyumlu uygulamaların, aşağıda açıklandığı gibi soyut makinenin gözlemlenebilir davranışını taklit etmesi (sadece) gereklidir .

Ayrıca açıklayıcı bir dipnot şunları ekler:

Bu hüküm bazen "olduğu gibi" kuralı olarak adlandırılır , çünkü bir uygulama, gözlemlenebilir davranıştan tespit edilebildiği sürece, sonuç, gerekliliğe uyulmuş gibi olduğu sürece, bu Uluslararası Standardın herhangi bir gerekliliğini göz ardı etmekte serbesttir. programın. Örneğin, gerçek bir uygulamanın, değerinin kullanılmadığını ve programın gözlemlenebilir davranışını etkileyen hiçbir yan etkinin üretilmediğini anlayabiliyorsa, ifadenin bir kısmını değerlendirmesine gerek yoktur.


Kural tam olarak neyi zorunlu kılıyor?

1.9 / 5 paragrafı ayrıca şunları belirtir:

İyi biçimlendirilmiş bir programı yürüten uygun bir uygulama , aynı program ve aynı girdiyle soyut makinenin karşılık gelen örneğinin olası yürütmelerinden biri ile aynı gözlemlenebilir davranışı üretecektir . Bununla birlikte, bu tür bir yürütme tanımlanmamış bir işlem içeriyorsa, bu Uluslararası Standart, bu programı bu girdi ile yürüten uygulamaya herhangi bir gereklilik getirmez (ilk tanımsız işlemden önceki işlemlerle ilgili olarak bile).

Bu kısıtlamanın sadece "iyi biçimlendirilmiş bir program çalıştırılırken" geçerli olduğunu ve tanımsız davranış içeren bir programın çalıştırılmasının olası sonuçlarının kısıtlanmamış olduğunu vurgulamak gerekir . Bu, Paragraf 1.9 / 4'te de açıklanmıştır:

Bazı diğer işlemler bu Uluslararası Standartta tanımsız olarak tanımlanmıştır (örneğin, bir const nesnesini değiştirmeye çalışmanın etkisi). [Not: Bu Uluslararası Standart, tanımlanmamış davranışlar içeren programların davranışına herhangi bir gereklilik getirmez . - notu gönder]

Son olarak, " gözlemlenebilir davranış " tanımıyla ilgili olarak, Paragraf 1.9 / 8 aşağıdaki gibidir:

Uygun bir uygulama için en az gereksinimler şunlardır:

- Uçucu nesnelere erişim kesinlikle soyut makinenin kurallarına göre değerlendirilir.

- Programın sonlandırılmasında, dosyalara yazılan tüm veriler, programın soyut semantiğe göre çalıştırılmasının yaratacağı olası sonuçlardan biriyle aynı olacaktır.

- Etkileşimli cihazların girdi ve çıktı dinamikleri, bir program girdi beklemeden önce yönlendirici çıktı gerçekten iletilecek şekilde gerçekleşecektir. Etkileşimli bir cihazı oluşturan şey, uygulama tanımlıdır.

Bunlara topluca programın gözlemlenebilir davranışı denir . [ Not : Soyut ve gerçek anlambilim arasında daha sıkı yazışmalar her uygulama tarafından tanımlanabilir. - son not ]


Bu kuralın geçerli olmadığı durumlar var mı?

Bildiğim kadarıyla, " olduğu gibi " kuralının tek istisnası , bir sınıfın kopya yapıcısı, hareket kurucusu veya yıkıcısı yan etkilere sahip olmasına rağmen izin verilen kopyala / taşı seçmesidir. Bunun kesin koşulları Paragraf 12.8 / 31'de belirtilmiştir:

Belirli kriterler karşılandığında, kopyalama / taşıma işlemi için seçilen kurucu ve / veya nesne için yıkıcı yan etkilere sahip olsa bile , bir uygulamanın bir sınıf nesnesinin kopyalama / taşıma yapısını atlamasına izin verilir . [...]


2
Bu alıntıyı gördüm. Net olmayan, gözlemlenebilir davranışın tanımıdır. Tam olarak gözlemlenebilir bir davranış olarak nitelendirilen şey nedir? Seçimi, sanki kuralına bir istisna olarak kopyalamak oldukça iyi biliniyor ve sorumun bir parçası değil.
Alok Save

2
@AlokSave: C standardında, "Uçucu bir nesneye erişmek, bir nesneyi değiştirmek, bir dosyayı değiştirmek veya bu işlemlerden herhangi birini yapan bir işlevi çağırmak tüm yan etkilerdir" görüyoruz. Muhtemelen C ++ standartlarında eşdeğer bir şey vardır. Gayri resmi olarak, sanırım "dış dünya ile etkileşimini değiştiren her şey".
Oliver Charlesworth

1
Soyut makinenin durumunu değiştiren herhangi bir davranış (yani, bir değişkeni veya global değişkeni değiştiren veya G / Ç aygıtlarını okuyup yazan bir şey).
Mats Petersson

1
Bu, daha sonra gözlemlenebilir hiçbir şey olmadığı sürece, hiçbir şey yapmayan sonsuz bir döngünün silinmesine izin verileceği anlamına mı geliyor?
harold

5
Özellikle dikkat edilmesi gereken bir nokta, yalnızca yasal programlar için geçerli olmasıdır . Çağırma şey tanımsız davranış herhangi kapsam dışı açıkça olduğunu.
vonbrand

15

C11'de kural asla bu adla çağrılmaz. Ancak C, C ++ gibi davranışı soyut makine açısından tanımlar. Varsayım kuralı C11 5.1.2.3p4 ve p6'dadır :

  1. Soyut makinede, tüm ifadeler anlambilim tarafından belirtildiği şekilde değerlendirilir. Gerçek bir uygulamanın, değerinin kullanılmadığını ve gerekli yan etkilerin üretilmediğini (bir işlevin çağrılması veya geçici bir nesneye erişilmesinin neden olduğu herhangi bir şey dahil) çıkarabilmesi durumunda, ifadenin bir bölümünü değerlendirmesine gerek yoktur.

  2. [...]

  3. Uygun bir uygulama için en az gereksinimler şunlardır:

    • volatileNesnelere erişim kesinlikle soyut makinenin kurallarına göre değerlendirilir.
    • Programın sonlandırılmasında, dosyalara yazılan tüm veriler, programın soyut semantiğe göre çalıştırılmasının üreteceği sonuçla aynı olacaktır.
    • Etkileşimli cihazların giriş ve çıkış dinamikleri 7.21.3'te belirtildiği gibi gerçekleşecektir . Bu gereksinimlerin amacı, giriş için bekleyen bir programdan önce yönlendirici mesajların gerçekten görünmesini sağlamak için arabelleğe alınmamış veya satır tamponlu çıktının mümkün olan en kısa sürede görünmesidir.

     

    Bu, programın gözlemlenebilir davranışıdır.


-1

C, C ++, Ada, Java, SML ... bir programın (genellikle birçok olası, deterministik olmayan) davranışını (G / Ç bağlantı noktalarında bir dizi etkileşime maruz kalan) açıklayarak iyi belirlenmiş herhangi bir programlama dilinde , hiçbir farklı olarak eğer kuralı vardır .

Sıfıra bölmenin bir istisnayı (Ada, Caml) veya boş bir başvurunun bir istisnayı (Java) ortaya çıkardığını söyleyen farklı bir kural örneğidir . Bir şey belirtmek için kural değiştirebilir başka (*). Ve bazı insanlar yerine bir "lehçesi" dediğimiz olacağını (farklı dil ile sona ereceğini bir farklı kural bir programlama dilinde bazı farklı kullanımlarını belirtmek için orada ayrı gibi gramer kuralı bazı sözdizimi yapılarını kapsar.

(*) Bazı dilbilimcilere göre lehçe, "ordusu" olan bir dildir. bu bağlamda, bu, komitesiz bir programlama dili ve belirli bir derleyici editörleri sektörü anlamına gelebilir.

Sanki kuralı ayrı bir kural değildir ; özellikle herhangi bir programı kapsamaz ve tartışılabilecek, kaldırılabilecek veya herhangi bir şekilde değiştirilebilecek bir kural bile değildir : sözde "kural", program anlambiliminin tanımlandığını ve yalnızca taşınabilir (evrensel olarak) olabileceğini yinelemektedir. programın yürütülmesinin "dış" dünya ile görünür etkileşimleri açısından tanımlanmıştır.

Dış dünya, G / Ç arayüzleri (stdio), bir GUI, hatta saf bir uygulama dilinin sonuç değerini veren etkileşimli bir yorumlayıcı olabilir. C ve C ++ 'da, uçucu nesnelere (belirsiz olarak belirtilmiş) erişimleri içerir; bu, belirli bir noktadaki bazı nesnelerin, ABI'dan açıkça bahsetmeden, bellekte kesinlikle ABI'ye (Uygulama İkili Arayüzü) göre temsil edilmesi gerektiğini söylemenin başka bir yoludur.

Görünür veya gözlemlenebilir davranış olarak da adlandırılan bir yürütme izinin ne olduğunun tanımı, "sanki kuralı" ile neyin kastedildiğini tanımlar. Sanki kuralı onu açıklamaya çalışır , ancak bunu yaparak insanların kafasını karıştırmaktan çok, uygulamaya daha fazla alan sağlayan ek bir anlamsal kural olma ifadesini verdiği için işleri netleştirir.

Özet:

  • Sözde "sanki kuralı", uygulamalar üzerindeki herhangi bir kısıtlamayı gevşetmez.
  • Farklı bir lehçe elde etmek için, görünür davranış (dış dünya ile etkileşim için oluşturulan yürütme izleri) terimiyle belirtilen herhangi bir programlama dilinde sanki kuralını kaldıramazsınız.
  • Görünür davranış açısından belirtilmeyen herhangi bir programlama diline sanki kuralı ekleyemezsiniz.

İnsanlar hatalı olduğuma inanıyorsa ve farklı bir "sanki kural" varsa, neden bu "kural" olmadan bir C ++ (lehçe) varyantını açıklamaya çalışmıyorlar? C ++ özelliği olmasa bile ne anlama gelir? Bir derleyicinin uygun olup olmadığını söylemek kesinlikle imkansızdır. Ya da uygunluğu tanımlamak için.
curiousguy
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.