Jak mówi tytuł,
Typowa odpowiedź, jaką można uzyskać, to:
Reguła zezwalająca na wszelkie transformacje kodu, które nie zmieniają obserwowalnego zachowania programu
Od czasu do czasu otrzymujemy zachowania z pewnych implementacji, które są przypisane tej regule. Wiele razy źle. Na czym więc dokładnie polega ta zasada. Norma nie wspomina wyraźnie o tej zasadzie jako sekcji lub akapicie, więc co dokładnie obejmuje zakres tej zasady? Wydaje mi się, że jest to szara strefa, której norma nie definiuje szczegółowo. Czy ktoś może rozwinąć szczegóły, powołując się na odniesienia z normy?
Uwaga: oznaczając to jako C i C ++, ponieważ ma to znaczenie dla obu języków.
Odpowiedzi:
Jaka jest zasada „ jak gdyby ”?
Reguła „ as-if ” zasadniczo definiuje, jakie transformacje implementacja może wykonać na legalnym programie w C ++. Krótko mówiąc, wszystkie przekształcenia, które nie wpływają na „ obserwowalne zachowanie ” programu (dokładna definicja znajduje się poniżej).
Celem jest zapewnienie implementacjom swobody wykonywania optymalizacji, o ile zachowanie programu pozostaje zgodne z semantyką określoną w standardzie C ++ w odniesieniu do maszyny abstrakcyjnej.
Gdzie norma wprowadza tę zasadę?
Standard C ++ 11 wprowadza zasadę „ as-if ” w paragrafie 1.9 / 1:
Ponadto przypis wyjaśniający dodaje:
Co dokładnie nakazuje reguła?
Pkt 1.9 / 5 dalej określa:
Warto podkreślić, że ograniczenie to ma zastosowanie tylko przy „wykonywaniu dobrze sformułowanego programu” , a możliwe wyniki wykonania programu, który zawiera niezdefiniowane zachowanie, są nieograniczone. Jest to również wyraźnie określone w paragrafie 1.9 / 4:
Wreszcie, jeśli chodzi o definicję „ obserwowalnego zachowania ”, ust. 1.9 / 8 brzmi następująco:
Czy są sytuacje, w których ta zasada nie ma zastosowania?
O ile mi wiadomo, jedynym wyjątkiem od reguły „ jak gdyby ” jest opcja kopiowania / przenoszenia, która jest dozwolona, nawet jeśli konstruktor kopiujący, konstruktor przenoszenia lub destruktor klasy mają efekty uboczne. Dokładne warunki tego są określone w paragrafie 12.8 / 31:
źródło
W C11 reguła nigdy nie jest nazywana tą nazwą. Jednak C, podobnie jak C ++, definiuje zachowanie w kategoriach abstrakcyjnej maszyny. Reguła as-if znajduje się w C11 5.1.2.3p4 i p6 :
źródło
W C, C ++, Ada, Java, SML ... w dowolnym języku programowania dobrze określonym przez opis (zwykle wielu możliwych, niedeterministycznych) zachowań programu (narażonych na szereg interakcji na portach I / O) , nie ma odrębnej reguły „as-if” .
Przykładem odrębnej reguły jest ta, która mówi, że dzielenie przez zero wywołuje wyjątek (Ada, Caml) lub zerowa dereferencja wywołuje wyjątek (Java). Można zmienić regułę, aby określić coś innego i może skończyć z innym języku (które niektórzy ludzie raczej nazwać „dialekt” (*). Wyraźną regułą jest tam, aby podać kilka różnych zastosowań język programowania jak odrębną reguły gramatyczne obejmują niektóre konstrukcje składniowe.
(*) Według niektórych lingwistów dialekt to język posiadający „armię”. w tym kontekście może to oznaczać język programowania bez komitetu i określonej branży redaktorów kompilatorów.
Reguła as-if nie jest odrębną regułą ; nie obejmuje żadnego programu w szczególności i nie jest nawet regułą, którą można by omówić, usunąć lub w jakikolwiek sposób zmienić : tak zwana „reguła” po prostu powtarza, że semantyka programu jest zdefiniowana i może być tylko przenośna (uniwersalna) zdefiniowane w kategoriach widocznych interakcji wykonania programu ze światem „zewnętrznym”.
Światem zewnętrznym mogą być interfejsy I / O (stdio), GUI, a nawet interaktywny interpreter, który wyświetla wynikową wartość czystego języka aplikacyjnego. W językach C i C ++ obejmuje (niejasno określone) dostępy do obiektów ulotnych, co jest innym sposobem na powiedzenie, że niektóre obiekty w danym punkcie muszą być reprezentowane w pamięci ściśle według ABI (Application Binary Interface), bez wyraźnego wspominania o ABI.
Definicja śladu wykonania , zwana także zachowaniem widocznym lub dającym się zaobserwować, definiuje, co należy rozumieć pod pojęciem „reguły jak gdyby”. Reguła as-if próbuje to wyjaśnić, ale czyniąc to, bardziej dezorientuje ludzi niż wyjaśnia, ponieważ daje wyraz bycia dodatkową regułą semantyczną, dającą większą swobodę implementacji.
Podsumowanie:
źródło