Co dokładnie oznacza „semantycznie obserwowany” efekt uboczny?

11

Mam pytanie dotyczące czystych funkcji. Według strony Wikipedii jednym z wymogów czystej funkcji jest:

Ocena wyniku nie powoduje semantycznie obserwowalnego efektu ubocznego lub wyjścia, takiego jak mutacja obiektów podlegających mutacji lub wyjście do urządzeń I / O.

Co to naprawdę oznacza? A raczej jak mogę wywołać efekt uboczny, który nie jest semantycznie obserwowalny?

Henrik Sommerland
źródło
2
Nie powinieneś nadmiernie obciążać ręcznie falowanych rzeczy, które kiedyś można znaleźć na Wikipedii.
Andrej Bauer,
1
@AndrejBauer Huh? Co jest w tym falistego? Może nie na poziomie badawczym (nie mam nic przeciwko, jeśli zostanie to przeniesione do informatyki ) - choć biorąc pod uwagę twoją reakcję, być może nie.
Gilles „SO- przestań być zły”
Myślę, że po prostu nie podoba mi się wyrażenie „semantycznie obserwowalne”.
Andrej Bauer
1
Powiem inaczej: jaka jest różnica między „obserwowalnym semantycznie” a „obserwowalnym”? „Semantycznie” to tylko modne hasło, które nie ma tutaj sensu.
Andrej Bauer,
„semantyczny” wydaje się mieć szczególne znaczenie w różnych obszarach teorii programowania, być może zaimportowany z lingwistyki / filozofii, gdzie sięga dziesięcioleci, czyli „składnia kontra semantyka”… może to inne pytanie tutaj…
vzn

Odpowiedzi:

11

Semantyka programu to model jego zachowania, który, jak każdy model naukowy, ignoruje aspekty, których nie chcesz studiować.

Niezwykle szczegółowy model wykonania programu modelowałby fizyczne zachowanie komputera, który go wykonuje, w tym czas wykonania, zużycie energii, promieniowanie elektromagnetyczne itp. Takie aspekty są bardzo rzadko brane pod uwagę, ponieważ bardzo rzadko są istotne. Niemniej jednak mają one czasem znaczenie: przydatny model autopilota samolotowego musi zawierać informacje o czasie wykonywania, przydatny model bezpieczeństwa karty kredytowej musi obejmować promieniowanie elektromagnetyczne, ...

W typowej semantyce działania niepożądane, takie jak czas i zużycie energii, są ignorowane. Nawet jeśli w przyziemnym otoczeniu, w którym wpisujesz wyrażenie w wierszu interpretera Haskell, wydruk wyniku jest efektem ubocznym (jeśli spróbujesz wydrukować nieskończony obiekt, ma to znaczenie). Jeśli w interpretatorze Haskella zabraknie pamięci, jest to również zauważalny efekt uboczny w modelu „realnym”, ale nie w wyidealizowanym modelu Haskella, który skutecznie pozwala na nieograniczone obliczenia.

Zaobserwować efekt uboczny jest taki, który jest wzorowany na semantyce. W typowych modelach języków programowania zużycie pamięci nie jest modelowane, więc obliczenia wymagające 1 TB pamięci masowej mogą być czyste, nawet jeśli próba uruchomienia ich na komputerze PC wyraźnie się nie powiedzie.

Innym rodzajem nieobserwowalnego efektu ubocznego jest efekt wewnętrzny. Sądzę, że o tym pomyślałaby większość semantystów, mówiąc o nieobserwowalnych skutkach ubocznych. Rozważ obliczenia, które wewnętrznie wykorzystują zmienne dane, ale nie dzielą się tymi zmiennymi danymi z żadną inną częścią programu. Na przykład funkcja sortowania listy, która buduje tablicę z tymi samymi elementami co lista, sortuje tablicę w miejscu i zwraca listę zawierającą elementy jako tablicę w ich ostatecznej kolejności: semantyczny model podwyrażeń tej funkcji pokazuje stronę efekty (modyfikacje tablicy), ale sama funkcja nie ma zewnętrznego efektu ubocznego, więc jest czysta.

Dla bardziej subtelnego przykładu rozważmy funkcję, która zapisuje niektóre dane do pliku tymczasowego i czyści po sobie. W semantyce, w której zawsze jest wystarczająco dużo miejsca na pliki tymczasowe, a programy nie współużytkują plików tymczasowych, funkcja nie ma skutków ubocznych; plik tymczasowy działa jako dodatkowa pamięć używana przez funkcję. W semantyce, która uwzględnia pełne warunki systemu plików, funkcja ma efekt uboczny - może się nie powieść z powodu zewnętrznych okoliczności. W semantyce, która pozwala na awarię maszyny, funkcja ma efekt uboczny: jeśli wystąpi awaria podczas wykonywania funkcji, plik tymczasowy może pozostać. W semantyce, która pozwala współbieżnie wykonywanym programom zobaczyć i być może zmodyfikować plik tymczasowy, funkcja ma efekt uboczny.

Gilles „SO- przestań być zły”
źródło