eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programming › Optymalizacja struktur danych dla programów funkcyjnych
Ilość wypowiedzi w tym wątku: 39

  • 21. Data: 2017-10-03 20:01:47
    Temat: Re: Optymalizacja struktur danych dla programów funkcyjnych
    Od: g...@g...com

    W dniu wtorek, 3 października 2017 18:56:43 UTC+2 użytkownik Maciej Sobczak napisał:
    > > > Nie, nie jest. I w ogóle co to miałoby znaczyć - "czysto funkcyjnym"?
    > >
    > > Miałoby znaczyć tyle, że dla danego wejścia daje zawsze to samo wyjście.
    >
    > Biorąc pod uwagę deterministyczny sposób działania układów cyfrowych, każdy program
    wykonany na takich układach tak działa. W każdym języku.
    > Ale to oznacza też, że określenie "czysto funkcyjny" jest niepraktyczne, bo niczego
    nie rozstrzyga - bo skoro każdy program jest "czysto funkcyjny", to szkoda literek na
    określanie wszystkiego w ten sposób.

    Nie. Na przykład unixowe polecenia takie jak mkdir czy rm nie są czysto
    funkcyjne, bo ich istotą jest wykonanie pewnego skutku ubocznego -- zmiana
    pewnego stanu.

    Podobnie wspomniany przeze mnie system do algorytmów genetycznych
    (można sobie o nim poczytać w rozdziale drugim książki
    https://github.com/panicz/pamphlet/) -- bazuje na operacji niedeterministycznej,
    ponieważ losuje pewien obiekt. Zatem nie jest ze swojej istoty czysto
    funkcyjny.

    Określenie "czysto funkcyjny" jest bardzo praktyczne, ponieważ
    wyznacza środki analizy potrzebne do tego, żeby analizować dany
    system. Systemy czysto funkcyjne można analizować w terminach
    podstawień wartości wyrażeń za wyrażenia.

    > > Nie każdy program tak robi. Na przykład system czasu rzeczywistego
    > > ma się odpowiednio zachować w określonych okolicznościach.
    >
    > Te okoliczności to też wejście (bo niby skąd program ma wiedzieć o tych
    okolicznościach? informacja o otoczeniu musi jakoś wpłynąć do programu a to jest
    właśnie wejście). Podobnie jak interwały upływającego czasu - to też jest wejście.
    >
    > > > Nie jest w taki sposób implementowany, bo w istocie rzeczy nie jest czysto
    funkcyjny (cokolwiek to znaczy).
    > >
    > > Jeżeli nie wiesz co to znaczy, to skąd wiesz, że w istocie
    > > rzeczy nie jest czysto funkcyjny?
    >
    > Bo określenie "czysto coś" ma zawsze wadę bycia niedookreślonym. I zwykle tak czy
    siak nie jest prawdą.

    Jest całkowicie dookreślone. W jakimś sensie, w każdym razie.
    Bo rzeczywiście, wiele kompilatorów działa tak, że wykonuje pewien
    efekt uboczny, np. sprawia, że na dysku pojawiają się jakieś pliki
    (i czasem też znikają). Ale to nie należy do jego istoty, tylko
    jest szczegółem implementacyjnym (w mojej pracy kompilatory nie robią
    takich obrzydliwych rzeczy).

    > Poza tym, obowiązuje zasada "nie wiem o co chodzi, ale chętnie się wypowiem".

    A, to przepraszam :)


  • 22. Data: 2017-10-04 00:21:37
    Temat: Re: Optymalizacja struktur danych dla programów funkcyjnych
    Od: Maciej Sobczak <s...@g...com>

    > Nie. Na przykład unixowe polecenia takie jak mkdir czy rm nie są czysto
    > funkcyjne, bo ich istotą jest wykonanie pewnego skutku ubocznego -- zmiana
    > pewnego stanu.

    Dokładnie to samo można powiedzieć o każdym programie, który cokolwiek produkuje na
    swoim wyjściu - bo operacje I/O (czyli również pisanie na stdout) to skutki uboczne.
    Nawet dokładnie tak się to nazywa w standardzie np. języka C.

    Czyli przeginając argument w drugą stronę, można powiedzieć, że wszystkie
    interesujące programy produkują jakieś skutki uboczne (w przeciwnym razie nie ma po
    co ich uruchamiać), więc zgodnie z Twoją definicją nie są "czysto funkcyjne". Czy
    znowu to pojęcie nie jest użyteczne.

    > bazuje na operacji niedeterministycznej,
    > ponieważ losuje pewien obiekt.

    "Losowanie" generatorem liczb pseudolosowych jest deterministyczne, tak jak każda
    inna sekwencja operacji arytmetycznych. A odwoływanie się do zewnętrznych źródeł
    szumu jest operacją wejścia, czyli znowu mówimy o deterministycznym programie, który
    przetwarza wejście na wyjście - i który dla takiego samego szumu da zawsze te same
    wyniki. Czyli który dla takiego samego wejścia da takie same wyjście. Sorry.

    > Zatem nie jest ze swojej istoty czysto
    > funkcyjny.

    I dalej nie wiemy, co to niby miałoby oznaczać.
    Podsumujmy co wiemy do tej pory:
    - wszystkie programy deterministycznie przetwarzają wejście na wyjście i produkują
    przy tej okazji skutki uboczne.

    > Określenie "czysto funkcyjny" jest bardzo praktyczne, ponieważ
    > wyznacza środki analizy potrzebne do tego, żeby analizować dany
    > system.

    Łomatko.

    > Systemy czysto funkcyjne można analizować w terminach
    > podstawień wartości wyrażeń za wyrażenia.

    Czyli wszystkie programy można tak analizować. Każdy program jest deterministyczną
    funkcją Input -> Output.
    Dlatego to pojęcie nie jest użyteczne.

    > Bo rzeczywiście, wiele kompilatorów działa tak, że wykonuje pewien
    > efekt uboczny, np. sprawia, że na dysku pojawiają się jakieś pliki
    > (i czasem też znikają). Ale to nie należy do jego istoty, tylko
    > jest szczegółem implementacyjnym

    W ten sposób można opisać każdy program - tzn. że owszem, robi efekty uboczne przy
    okazji operacji I/O (które są potrzebne, że przeczytać wejście i wyprodukować coś na
    wyjściu), ale one nie należą do jego istoty, tylko są szczegółem implementacyjnym,
    więc...

    Więc znowu albo każdy program jest "czysto cośtam", albo każdy nie jest.

    > > Poza tym, obowiązuje zasada "nie wiem o co chodzi, ale chętnie się wypowiem".
    >
    > A, to przepraszam :)

    Proszę. :-)

    --
    Maciej Sobczak * http://www.inspirel.com


  • 23. Data: 2017-10-04 08:15:07
    Temat: Re: Optymalizacja struktur danych dla programów funkcyjnych
    Od: g...@g...com

    W dniu środa, 4 października 2017 00:21:38 UTC+2 użytkownik Maciej Sobczak napisał:
    > > Nie. Na przykład unixowe polecenia takie jak mkdir czy rm nie są czysto
    > > funkcyjne, bo ich istotą jest wykonanie pewnego skutku ubocznego -- zmiana
    > > pewnego stanu.
    >
    > Dokładnie to samo można powiedzieć o każdym programie, który cokolwiek produkuje na
    swoim wyjściu - bo operacje I/O (czyli również pisanie na stdout) to skutki uboczne.
    Nawet dokładnie tak się to nazywa w standardzie np. języka C.
    >
    > Czyli przeginając argument w drugą stronę, można powiedzieć, że wszystkie
    interesujące programy produkują jakieś skutki uboczne (w przeciwnym razie nie ma po
    co ich uruchamiać), więc zgodnie z Twoją definicją nie są "czysto funkcyjne". Czy
    znowu to pojęcie nie jest użyteczne.

    Otóż nie. Ale widzę, że po raz kolejny zamiast spróbować zrozumieć
    pojęcie, starasz się je strolować i wmówić, że nie jest użyteczne.

    Można sobie pomyśleć program, który oblicza wartość jakiegoś programu
    czysto funkcyjnego i wyświetla ją na ekran. (Na przykład takie coś
    robi interpreter). Interpreter nie jest czysto funkcyjny, a obliczany
    przez niego program jest.

    > > bazuje na operacji niedeterministycznej,
    > > ponieważ losuje pewien obiekt.
    >
    > "Losowanie" generatorem liczb pseudolosowych jest deterministyczne, tak jak każda
    inna sekwencja operacji arytmetycznych. A odwoływanie się do zewnętrznych źródeł
    szumu jest operacją wejścia, czyli znowu mówimy o deterministycznym programie, który
    przetwarza wejście na wyjście - i który dla takiego samego szumu da zawsze te same
    wyniki. Czyli który dla takiego samego wejścia da takie same wyjście. Sorry.

    Widzę, że nie rozumiesz.
    To, czy liczba jest pseudolosowa, czy nie jest, czy pochodzi z wejścia,
    czy z kosmosu, nie ma znaczenia dla *ISTOTY* danego programu. Na tym
    właśnie polega abstrakcja niedeterminizmu.

    > > Zatem nie jest ze swojej istoty czysto
    > > funkcyjny.
    >
    > I dalej nie wiemy, co to niby miałoby oznaczać.

    No, jeżeli usilnie staramy się nie zrozumieć, co to oznacza,
    to nie wiemy.

    > > Określenie "czysto funkcyjny" jest bardzo praktyczne, ponieważ
    > > wyznacza środki analizy potrzebne do tego, żeby analizować dany
    > > system.
    >
    > Łomatko.

    Może sobie poczytaj https://mitpress.mit.edu/sicp/full-text/sicp/book/no
    de10.html

    > > Systemy czysto funkcyjne można analizować w terminach
    > > podstawień wartości wyrażeń za wyrażenia.
    >
    > Czyli wszystkie programy można tak analizować. Każdy program jest deterministyczną
    funkcją Input -> Output.
    > Dlatego to pojęcie nie jest użyteczne.

    Dałem kilka kontrprzykładów. Systemy kolejkowe czasu rzeczywistego
    nie są deterministyczną funkcją input->output. Być może mają komponenty,
    które można w taki sposób analizować, ale ich istotą jest działanie
    w czasie rzeczywistym, i reagowanie na zdarzenia w zależności od
    jakiegoś ich wewnętrznego stanu.

    Natomiast programy w rodzaju kompilatorów, konwerterów LaTeXa,
    sedów, są w istocie czysto funkcyjne w takim sensie, że dla określonego
    wejścia dają określone wyjście i kropka. Pojęcie "wewnętrznego
    stanu" nie należy do ich opisu.

    > > Bo rzeczywiście, wiele kompilatorów działa tak, że wykonuje pewien
    > > efekt uboczny, np. sprawia, że na dysku pojawiają się jakieś pliki
    > > (i czasem też znikają). Ale to nie należy do jego istoty, tylko
    > > jest szczegółem implementacyjnym
    >
    > W ten sposób można opisać każdy program - tzn. że owszem, robi efekty uboczne przy
    okazji operacji I/O (które są potrzebne, że przeczytać wejście i wyprodukować coś na
    wyjściu), ale one nie należą do jego istoty, tylko są szczegółem implementacyjnym,
    więc...

    Nie, nie można.
    Podałem podczas tej rozmowy kilka przykładów.
    Istnieją programy, których istotą jest interakcja (np. gry komputerowe,
    przeglądarki internetowe), takie, których istotą jest wykonanie
    skutku ubocznego (np. mkdir albo rm), takie, które są w istocie
    niedeterministyczne (jak wspomniany framework do algorytmów genetycznych).
    A oprócz nich są programy czysto funkcyjne, które po prostu wyznaczają
    przekształcenia jakichs wejść w jakieś wyjścia.
    Dla mnie taki podział jest użyteczny. Jeżeli dla Ciebie nie jest,
    to Twoja sprawa.


  • 24. Data: 2017-10-04 18:36:14
    Temat: Re: Optymalizacja struktur danych dla programów funkcyjnych
    Od: "M.M." <m...@g...com>

    On Wednesday, October 4, 2017 at 8:15:08 AM UTC+2, g...@g...com wrote:
    > W dniu środa, 4 października 2017 00:21:38 UTC+2 użytkownik Maciej Sobczak napisał:
    > > > Nie. Na przykład unixowe polecenia takie jak mkdir czy rm nie są czysto
    > > > funkcyjne, bo ich istotą jest wykonanie pewnego skutku ubocznego -- zmiana
    > > > pewnego stanu.
    > >
    > > Dokładnie to samo można powiedzieć o każdym programie, który cokolwiek produkuje
    na swoim wyjściu - bo operacje I/O (czyli również pisanie na stdout) to skutki
    uboczne. Nawet dokładnie tak się to nazywa w standardzie np. języka C.
    > >
    > > Czyli przeginając argument w drugą stronę, można powiedzieć, że wszystkie
    interesujące programy produkują jakieś skutki uboczne (w przeciwnym razie nie ma po
    co ich uruchamiać), więc zgodnie z Twoją definicją nie są "czysto funkcyjne". Czy
    znowu to pojęcie nie jest użyteczne.
    >
    > Otóż nie. Ale widzę, że po raz kolejny zamiast spróbować zrozumieć
    > pojęcie, starasz się je strolować i wmówić, że nie jest użyteczne.
    >
    > Można sobie pomyśleć program, który oblicza wartość jakiegoś programu
    > czysto funkcyjnego i wyświetla ją na ekran. (Na przykład takie coś
    > robi interpreter). Interpreter nie jest czysto funkcyjny, a obliczany
    > przez niego program jest.
    >
    > > > bazuje na operacji niedeterministycznej,
    > > > ponieważ losuje pewien obiekt.
    > >
    > > "Losowanie" generatorem liczb pseudolosowych jest deterministyczne, tak jak każda
    inna sekwencja operacji arytmetycznych. A odwoływanie się do zewnętrznych źródeł
    szumu jest operacją wejścia, czyli znowu mówimy o deterministycznym programie, który
    przetwarza wejście na wyjście - i który dla takiego samego szumu da zawsze te same
    wyniki. Czyli który dla takiego samego wejścia da takie same wyjście. Sorry.
    >
    > Widzę, że nie rozumiesz.
    > To, czy liczba jest pseudolosowa, czy nie jest, czy pochodzi z wejścia,
    > czy z kosmosu, nie ma znaczenia dla *ISTOTY* danego programu. Na tym
    > właśnie polega abstrakcja niedeterminizmu.
    >
    > > > Zatem nie jest ze swojej istoty czysto
    > > > funkcyjny.
    > >
    > > I dalej nie wiemy, co to niby miałoby oznaczać.
    >
    > No, jeżeli usilnie staramy się nie zrozumieć, co to oznacza,
    > to nie wiemy.
    >
    > > > Określenie "czysto funkcyjny" jest bardzo praktyczne, ponieważ
    > > > wyznacza środki analizy potrzebne do tego, żeby analizować dany
    > > > system.
    > >
    > > Łomatko.
    >
    > Może sobie poczytaj https://mitpress.mit.edu/sicp/full-text/sicp/book/no
    de10.html
    >
    > > > Systemy czysto funkcyjne można analizować w terminach
    > > > podstawień wartości wyrażeń za wyrażenia.
    > >
    > > Czyli wszystkie programy można tak analizować. Każdy program jest
    deterministyczną funkcją Input -> Output.
    > > Dlatego to pojęcie nie jest użyteczne.
    >
    > Dałem kilka kontrprzykładów. Systemy kolejkowe czasu rzeczywistego
    > nie są deterministyczną funkcją input->output. Być może mają komponenty,
    > które można w taki sposób analizować, ale ich istotą jest działanie
    > w czasie rzeczywistym, i reagowanie na zdarzenia w zależności od
    > jakiegoś ich wewnętrznego stanu.
    >
    > Natomiast programy w rodzaju kompilatorów, konwerterów LaTeXa,
    > sedów, są w istocie czysto funkcyjne w takim sensie, że dla określonego
    > wejścia dają określone wyjście i kropka. Pojęcie "wewnętrznego
    > stanu" nie należy do ich opisu.
    >
    > > > Bo rzeczywiście, wiele kompilatorów działa tak, że wykonuje pewien
    > > > efekt uboczny, np. sprawia, że na dysku pojawiają się jakieś pliki
    > > > (i czasem też znikają). Ale to nie należy do jego istoty, tylko
    > > > jest szczegółem implementacyjnym
    > >
    > > W ten sposób można opisać każdy program - tzn. że owszem, robi efekty uboczne
    przy okazji operacji I/O (które są potrzebne, że przeczytać wejście i wyprodukować
    coś na wyjściu), ale one nie należą do jego istoty, tylko są szczegółem
    implementacyjnym, więc...
    >
    > Nie, nie można.
    > Podałem podczas tej rozmowy kilka przykładów.
    > Istnieją programy, których istotą jest interakcja (np. gry komputerowe,
    > przeglądarki internetowe), takie, których istotą jest wykonanie
    > skutku ubocznego (np. mkdir albo rm), takie, które są w istocie
    > niedeterministyczne (jak wspomniany framework do algorytmów genetycznych).
    > A oprócz nich są programy czysto funkcyjne, które po prostu wyznaczają
    > przekształcenia jakichs wejść w jakieś wyjścia.
    > Dla mnie taki podział jest użyteczny. Jeżeli dla Ciebie nie jest,
    > to Twoja sprawa.

    Pytanie, czy dla ogółu jest użyteczny? Póki co, ja to nawet nie widzę
    wyraźnej granicy podziałów ani korzyści z dzielenia - ale to pewnie
    coś ze mną nie tak.

    Pozdrawiam


  • 25. Data: 2017-10-04 20:02:27
    Temat: Re: Optymalizacja struktur danych dla programów funkcyjnych
    Od: Roman Tyczka <n...@b...no>

    On Wed, 4 Oct 2017 09:36:14 -0700 (PDT), M.M. wrote:

    > On Wednesday, October 4, 2017 at 8:15:08 AM UTC+2, g...@g...com wrote:
    >> W dniu środa, 4 października 2017 00:21:38 UTC+2 użytkownik Maciej Sobczak
    napisał:
    >>> > Nie. Na przykład unixowe polecenia takie jak mkdir czy rm nie są czysto
    >>> > funkcyjne, bo ich istotą jest wykonanie pewnego skutku ubocznego -- zmiana
    >>> > pewnego stanu.
    >>>
    >>> Dokładnie to samo można powiedzieć o każdym programie, który cokolwiek produkuje
    na swoim wyjściu - bo operacje I/O (czyli również pisanie na stdout) to skutki
    uboczne. Nawet dokładnie tak się to nazywa w standardzie np. języka C.
    >>>
    >>> Czyli przeginając argument w drugą stronę, można powiedzieć, że wszystkie
    interesujące programy produkują jakieś skutki uboczne (w przeciwnym razie nie ma po
    co ich uruchamiać), więc zgodnie z Twoją definicją nie są "czysto funkcyjne". Czy
    znowu to pojęcie nie jest użyteczne.
    >>
    >> Otóż nie. Ale widzę, że po raz kolejny zamiast spróbować zrozumieć
    >> pojęcie, starasz się je strolować i wmówić, że nie jest użyteczne.
    >>
    >> Można sobie pomyśleć program, który oblicza wartość jakiegoś programu
    >> czysto funkcyjnego i wyświetla ją na ekran. (Na przykład takie coś
    >> robi interpreter). Interpreter nie jest czysto funkcyjny, a obliczany
    >> przez niego program jest.
    >>
    >>> > bazuje na operacji niedeterministycznej,
    >>> > ponieważ losuje pewien obiekt.
    >>>
    >>> "Losowanie" generatorem liczb pseudolosowych jest deterministyczne, tak jak każda
    inna sekwencja operacji arytmetycznych. A odwoływanie się do zewnętrznych źródeł
    szumu jest operacją wejścia, czyli znowu mówimy o deterministycznym programie, który
    przetwarza wejście na wyjście - i który dla takiego samego szumu da zawsze te same
    wyniki. Czyli który dla takiego samego wejścia da takie same wyjście. Sorry.
    >>
    >> Widzę, że nie rozumiesz.
    >> To, czy liczba jest pseudolosowa, czy nie jest, czy pochodzi z wejścia,
    >> czy z kosmosu, nie ma znaczenia dla *ISTOTY* danego programu. Na tym
    >> właśnie polega abstrakcja niedeterminizmu.
    >>
    >>> > Zatem nie jest ze swojej istoty czysto
    >>> > funkcyjny.
    >>>
    >>> I dalej nie wiemy, co to niby miałoby oznaczać.
    >>
    >> No, jeżeli usilnie staramy się nie zrozumieć, co to oznacza,
    >> to nie wiemy.
    >>
    >>> > Określenie "czysto funkcyjny" jest bardzo praktyczne, ponieważ
    >>> > wyznacza środki analizy potrzebne do tego, żeby analizować dany
    >>> > system.
    >>>
    >>> Łomatko.
    >>
    >> Może sobie poczytaj https://mitpress.mit.edu/sicp/full-text/sicp/book/no
    de10.html
    >>
    >>> > Systemy czysto funkcyjne można analizować w terminach
    >>> > podstawień wartości wyrażeń za wyrażenia.
    >>>
    >>> Czyli wszystkie programy można tak analizować. Każdy program jest
    deterministyczną funkcją Input -> Output.
    >>> Dlatego to pojęcie nie jest użyteczne.
    >>
    >> Dałem kilka kontrprzykładów. Systemy kolejkowe czasu rzeczywistego
    >> nie są deterministyczną funkcją input->output. Być może mają komponenty,
    >> które można w taki sposób analizować, ale ich istotą jest działanie
    >> w czasie rzeczywistym, i reagowanie na zdarzenia w zależności od
    >> jakiegoś ich wewnętrznego stanu.
    >>
    >> Natomiast programy w rodzaju kompilatorów, konwerterów LaTeXa,
    >> sedów, są w istocie czysto funkcyjne w takim sensie, że dla określonego
    >> wejścia dają określone wyjście i kropka. Pojęcie "wewnętrznego
    >> stanu" nie należy do ich opisu.
    >>
    >>> > Bo rzeczywiście, wiele kompilatorów działa tak, że wykonuje pewien
    >>> > efekt uboczny, np. sprawia, że na dysku pojawiają się jakieś pliki
    >>> > (i czasem też znikają). Ale to nie należy do jego istoty, tylko
    >>> > jest szczegółem implementacyjnym
    >>>
    >>> W ten sposób można opisać każdy program - tzn. że owszem, robi efekty uboczne
    przy okazji operacji I/O (które są potrzebne, że przeczytać wejście i wyprodukować
    coś na wyjściu), ale one nie należą do jego istoty, tylko są szczegółem
    implementacyjnym, więc...
    >>
    >> Nie, nie można.
    >> Podałem podczas tej rozmowy kilka przykładów.
    >> Istnieją programy, których istotą jest interakcja (np. gry komputerowe,
    >> przeglądarki internetowe), takie, których istotą jest wykonanie
    >> skutku ubocznego (np. mkdir albo rm), takie, które są w istocie
    >> niedeterministyczne (jak wspomniany framework do algorytmów genetycznych).
    >> A oprócz nich są programy czysto funkcyjne, które po prostu wyznaczają
    >> przekształcenia jakichs wejść w jakieś wyjścia.
    >> Dla mnie taki podział jest użyteczny. Jeżeli dla Ciebie nie jest,
    >> to Twoja sprawa.
    >
    > Pytanie, czy dla ogółu jest użyteczny? Póki co, ja to nawet nie widzę
    > wyraźnej granicy podziałów ani korzyści z dzielenia - ale to pewnie
    > coś ze mną nie tak.

    Z tego co zrozumiałem to taki program wykonuje sekwencyjnie* rozkazy wg
    zadanego schematu/algorytmu, jedzie od A do Z i się kończy.

    Tylko z tego nic nie wynika poza samym tym faktem. Ale może taki podział ma
    gdzieś zastosowanie praktyczne.

    *sekwencyjnie w sensie kolejnych kroków, które oczywiście może rozdzielać
    na np. wątki


    --
    pozdrawiam
    Roman Tyczka


  • 26. Data: 2017-10-04 20:58:40
    Temat: Re: Optymalizacja struktur danych dla programów funkcyjnych
    Od: g...@g...com

    W dniu środa, 4 października 2017 20:02:27 UTC+2 użytkownik Roman Tyczka napisał:

    > > Pytanie, czy dla ogółu jest użyteczny? Póki co, ja to nawet nie widzę
    > > wyraźnej granicy podziałów ani korzyści z dzielenia - ale to pewnie
    > > coś ze mną nie tak.
    >
    > Z tego co zrozumiałem to taki program wykonuje sekwencyjnie* rozkazy wg
    > zadanego schematu/algorytmu, jedzie od A do Z i się kończy.

    Nie. Tutaj w ogóle nie chodzi o sekwencyjność ani o algorytmy.
    Chodzi o funkcję w rozumieniu matematycznym, czyli o skojarzenie
    wartości z argumentami. Te wartości można obliczyć na różne sposoby
    -- w szczególności, wcześniej wyliczone wartości można sobie
    cache'ować, żeby nie musieć ich wyliczać ponownie. Oczywiście takie
    cache'owanie nie zawsze ma sens -- zwłaszcza w sytuacji, gdy dziedzina
    funkcji jest bardzo duża.

    > Tylko z tego nic nie wynika poza samym tym faktem. Ale może taki podział ma
    > gdzieś zastosowanie praktyczne.

    Dla mnie ten podział ma sens ze względu na klasy optymalizacji
    oraz różnorakość sposobów interpretacji, jakie można stosować
    do wykonywania programów.


  • 27. Data: 2017-10-05 01:37:43
    Temat: Re: Optymalizacja struktur danych dla programów funkcyjnych
    Od: Maciej Sobczak <s...@g...com>

    > Można sobie pomyśleć program, który oblicza wartość jakiegoś programu
    > czysto funkcyjnego

    Ale nie ustaliliśmy jeszcze, co to znaczy, że program jest czysto funkcyjny. Twoje
    argumenty to machanie rękami, bo każdy z nich da się rozciągnąć w dowolną stronę, co
    pokazałem w obu kierunkach. W tej sytuacji określenie "program, który oblicza wartość
    prograamu czysto funkcyjnego" to machanie rękami do kwadratu, jeszcze bardziej
    nieużyteczne.

    > To, czy liczba jest pseudolosowa, czy nie jest, czy pochodzi z wejścia,
    > czy z kosmosu, nie ma znaczenia dla *ISTOTY* danego programu.

    I właśnie tej istoty szukamy. Jeżeli istotą jest przetwarzanie wejścia na wyjście, to
    wszystkie programy w istocie takie są. Natomiast jeśli jest nią generowanie efektów
    ubocznych, to też wszystkie takie są.

    > > I dalej nie wiemy, co to niby miałoby oznaczać.
    >
    > No, jeżeli usilnie staramy się nie zrozumieć, co to oznacza,
    > to nie wiemy.

    A może staramy się ujawnić dziury w definicji? Bo skoro nie potrafimy przekonująco
    wyjaśnić co jakieś pojęcie oznacza, to może problem jest z samym pojęciem albo z
    naszym przekonaniem, że je rozumiemy?

    > Może sobie poczytaj https://mitpress.mit.edu/sicp/full-text/sicp/book/no
    de10.html

    Nie zakładaj, że jeszcze nie czytałem. Nie każdy troll jest niekompetentny. :-)

    > Dałem kilka kontrprzykładów. Systemy kolejkowe czasu rzeczywistego
    > nie są deterministyczną funkcją input->output. Być może mają komponenty,
    > które można w taki sposób analizować, ale ich istotą jest działanie
    > w czasie rzeczywistym, i reagowanie na zdarzenia w zależności od
    > jakiegoś ich wewnętrznego stanu.

    No to robimy ćwiczenie na wyobraźnię:

    1. *Narysuj* zdarzenia w środowisku i otoczeniu programu, w ich rozciągłości
    czasowej. Oś czasu, od lewej do prawej, z zaznaczonymi zdarzeniami, wartościami, itd.
    2. Zrób z tego obrazka plik, np. w formacie PNG. Czyli *jedną wartość*.
    3. Podobnie narysuj na osi czasu odpowiedź systemu na taką stymulację. Znowu, z
    odpowiednią skalą czasu, wartościami (tak, żeby po złożeniu tych dwóch obrazków
    powstał opis działania programu w czasie), itd.
    4. Z tego drugiego obrazka też zrób plik.

    Otóż okazuje się, że Twój "system czasu rzeczywistego" przetwarza pliki graficzne.
    Czyli przetwarza pojedyncze wartości. To, czy wczyta od razu cały plik z wejścia i
    wypluje cały plik na wyjściu, czy też będzie je przetwarzał po jednym pikselowym
    pasku wzdłuż jednego boku obrazka (czyli np. wzdłuż osi czasu, co odpowiada naszej
    percepcji działania w kontekście upływającego czasu) nie ma znaczenia dla istoty tego
    programu, którą jest transformacja jednego obrazka w drugi.
    Co ciekawe, ze względu na kwantyzację wszystkiego (łącznie z zegarem), takich
    obrazków jest duża, ale jednak skończona ilość (czyli użyteczne rozmiary i
    rozdzielczość obrazków są skończone). Czyli dałoby się nawet zrobić ten program jako
    jedną mapę.

    To teraz ten program jest "czysto funkcyjny", czy nie jest?

    > Natomiast programy w rodzaju kompilatorów, konwerterów LaTeXa,
    > sedów, są w istocie czysto funkcyjne w takim sensie, że dla określonego
    > wejścia dają określone wyjście i kropka.

    O, to program przetwarzający obrazki też się łapie.

    > Podałem podczas tej rozmowy kilka przykładów.

    A ja każdy z nich wygiąłem tam, gdzie chciałem.
    Dlatego twierdzę, że pojęcia, którymi operujesz, są nieużyteczne.

    > Istnieją programy, których istotą jest interakcja (np. gry komputerowe,
    > przeglądarki internetowe), takie, których istotą jest wykonanie
    > skutku ubocznego (np. mkdir albo rm), takie, które są w istocie
    > niedeterministyczne (jak wspomniany framework do algorytmów genetycznych).
    > A oprócz nich są programy czysto funkcyjne, które po prostu wyznaczają
    > przekształcenia jakichs wejść w jakieś wyjścia.

    I teraz ten cały podział nie dotyczy istoty działania programu (bo ta istota jest
    zawsze taka sama), tylko sposobu, w jaki my, ludzie, danego programu użyjemy. Możemy
    odpalić program jednym strzałem albo też delektować się powolnym budowaniem wyniku,
    ale to jest ten sam program. Czyli dotyczy naszej percepcji a nie jest fundamentalnym
    atrybutem problemu, który dany program rozwiązuje. Bo problem jest zawsze ten sam.
    Dlatego rzeczy "czysto cośtam" zwykle nimi nie są.

    --
    Maciej Sobczak * http://www.inspirel.com


  • 28. Data: 2017-10-05 08:28:44
    Temat: Re: Optymalizacja struktur danych dla programów funkcyjnych
    Od: g...@g...com

    W dniu czwartek, 5 października 2017 01:37:44 UTC+2 użytkownik Maciej Sobczak
    napisał:
    > > Można sobie pomyśleć program, który oblicza wartość jakiegoś programu
    > > czysto funkcyjnego
    >
    > Ale nie ustaliliśmy jeszcze, co to znaczy, że program jest czysto funkcyjny.

    Z tego co patrzę na historię tej rozmowy, ustaliliśmy to na dość
    wczesnym etapie.

    > > To, czy liczba jest pseudolosowa, czy nie jest, czy pochodzi z wejścia,
    > > czy z kosmosu, nie ma znaczenia dla *ISTOTY* danego programu.
    >
    > I właśnie tej istoty szukamy. Jeżeli istotą jest przetwarzanie wejścia na wyjście,
    to wszystkie programy w istocie takie są. Natomiast jeśli jest nią generowanie
    efektów ubocznych, to też wszystkie takie są.

    Otóż właśnie nie, na co również dawałem przykłady.

    > > Dałem kilka kontrprzykładów. Systemy kolejkowe czasu rzeczywistego
    > > nie są deterministyczną funkcją input->output. Być może mają komponenty,
    > > które można w taki sposób analizować, ale ich istotą jest działanie
    > > w czasie rzeczywistym, i reagowanie na zdarzenia w zależności od
    > > jakiegoś ich wewnętrznego stanu.
    >
    > No to robimy ćwiczenie na wyobraźnię:
    >
    > 1. *Narysuj* zdarzenia w środowisku i otoczeniu programu, w ich rozciągłości
    czasowej. Oś czasu, od lewej do prawej, z zaznaczonymi zdarzeniami, wartościami, itd.
    > 2. Zrób z tego obrazka plik, np. w formacie PNG. Czyli *jedną wartość*.
    > 3. Podobnie narysuj na osi czasu odpowiedź systemu na taką stymulację. Znowu, z
    odpowiednią skalą czasu, wartościami (tak, żeby po złożeniu tych dwóch obrazków
    powstał opis działania programu w czasie), itd.
    > 4. Z tego drugiego obrazka też zrób plik.
    >
    > Otóż okazuje się, że Twój "system czasu rzeczywistego" przetwarza pliki graficzne.
    Czyli przetwarza pojedyncze wartości. To, czy wczyta od razu cały plik z wejścia i
    wypluje cały plik na wyjściu, czy też będzie je przetwarzał po jednym pikselowym
    pasku wzdłuż jednego boku obrazka (czyli np. wzdłuż osi czasu, co odpowiada naszej
    percepcji działania w kontekście upływającego czasu) nie ma znaczenia dla istoty tego
    programu, którą jest transformacja jednego obrazka w drugi.

    Problem polega na tym, że mylisz w tej chwili istotę programu ze środkami
    analizy. Owszem, każdy program można analizować przy pomocy pojęcia funkcji,
    albo przy pomocy pojęcia maszyny stanu, albo czegoś jeszcze innego.
    Ale to nie znaczy, że te środki analizy zawsze pokrywają się z istotą programu.
    W szczególności, na przykład, częścią opisu maszyny stanu jest funkcja
    przejścia w inny stan -- toteż używamy pojęcia funkcji pomocniczo do
    opisania maszyny stanów. Ale diagram przejść stanu jest czymś istotnie
    różnym od pojęcia funkcji.

    > I teraz ten cały podział nie dotyczy istoty działania programu (bo ta istota jest
    zawsze taka sama), tylko sposobu, w jaki my, ludzie, danego programu użyjemy. Możemy
    odpalić program jednym strzałem albo też delektować się powolnym budowaniem wyniku,
    ale to jest ten sam program. Czyli dotyczy naszej percepcji a nie jest fundamentalnym
    atrybutem problemu, który dany program rozwiązuje. Bo problem jest zawsze ten sam.

    Problem nie jest zawsze ten sam. Projektanci kompilatorów muszą zwracać
    uwagę na zupełnie inne rzeczy, niż projektanci gier komputerowych albo
    stron internetowych, po w pierwszym przypadku kluczowy jest wynik, a w
    pozostałych -- interakcja.
    Rzeczywiście, istniał kiedyś np. program do dowodzenia twierdzeń autorstwa
    Boyera-Moore'a NQTHM, który dawał użytkownikom możliwość "delektowania się
    powolnym budowaniem wyniku", ale to nie należało do jego istoty.


  • 29. Data: 2017-10-05 13:48:57
    Temat: Re: Optymalizacja struktur danych dla programów funkcyjnych
    Od: Maciej Sobczak <s...@g...com>

    > > Ale nie ustaliliśmy jeszcze, co to znaczy, że program jest czysto funkcyjny.
    >
    > Z tego co patrzę na historię tej rozmowy, ustaliliśmy to na dość
    > wczesnym etapie.

    Bez przesady. Nawet nie podałeś definicji, tylko przykład, z którym ja się nie
    zgodziłem. To mi się nie kwalifikuje jako "ustaliliśmy".

    > > Jeżeli istotą jest przetwarzanie wejścia na wyjście, to wszystkie programy w
    istocie takie są. Natomiast jeśli jest nią generowanie efektów ubocznych, to też
    wszystkie takie są.
    >
    > Otóż właśnie nie, na co również dawałem przykłady.

    Bez wejścia program nie ma danych do przetwarzania (albo ma zawsze te same, co jest
    nieciekawe), bez wyjścia nie ma wyników (co też jest nieciekawe), a bez efektów
    ubocznych nie może się komunikować (co też jest nieciekawe). Nie podałeś żadnego
    przykładu, który by się z tych reguł wyłamywał.

    Ogólnie, oodwoływanie się do takich pojęć jak "istota czegoś" jest trochę...
    nieinżynierskie.

    > Problem polega na tym, że mylisz w tej chwili istotę programu

    No i znowu ta istota. Z ciekawości wpisałem w wyszukiwarkę i... nic. Ani w wikipedii,
    ani nigdzie indziej. Po angielsku to pewnie "the essence of the program" i... znowu
    nic.

    Skoro to pojęcie nigdzie nie jest zdefiniowane i nikt go w branży nie używa, to chyba
    nie świadczy o mnie bardzo źle, że *nadal* nie rozumiem, o co konkretnie chodzi?

    > Owszem, każdy program można analizować przy pomocy pojęcia funkcji,
    > albo przy pomocy pojęcia maszyny stanu, albo czegoś jeszcze innego.

    Tak. Dlatego pojęcie "czysto funkcyjny" nie ma sensu.

    > Projektanci kompilatorów muszą zwracać
    > uwagę na zupełnie inne rzeczy, niż projektanci gier komputerowych albo
    > stron internetowych, po w pierwszym przypadku kluczowy jest wynik, a w
    > pozostałych -- interakcja.

    Tak, i stosuje się różne metody do optymalizacji tych różnych celów. Ale nic nie jest
    "czyste", bo bez interakcji nie da się pobrać danych ani podać wyników a bez wyniku
    interakcja jest bezcelowa - a przez proste zmiany w formacie i sposobie uruchomienia
    można zmienić jeden rodzaj programu w drugi. I o braku tej "czystości" właśnie tu
    piszę.

    --
    Maciej Sobczak * http://www.inspirel.com


  • 30. Data: 2017-10-05 18:58:39
    Temat: Re: Optymalizacja struktur danych dla programów funkcyjnych
    Od: g...@g...com

    W dniu czwartek, 5 października 2017 13:48:58 UTC+2 użytkownik Maciej Sobczak
    napisał:
    > > > Ale nie ustaliliśmy jeszcze, co to znaczy, że program jest czysto funkcyjny.
    > >
    > > Z tego co patrzę na historię tej rozmowy, ustaliliśmy to na dość
    > > wczesnym etapie.
    >
    > Bez przesady. Nawet nie podałeś definicji, tylko przykład, z którym ja się nie
    zgodziłem. To mi się nie kwalifikuje jako "ustaliliśmy".

    Pozwolę sobie wkleić:
    W dniu poniedziałek, 2 października 2017 14:20:39 UTC+2 użytkownik Maciej Sobczak
    napisał:
    > > (Warto zwrócić uwagę, że kompilator
    > > w istocie rzeczy jest programem czysto funkcyjnym,
    >
    > Nie, nie jest. I w ogóle co to miałoby znaczyć - "czysto funkcyjnym"?

    Miałoby znaczyć tyle, że dla danego wejścia daje zawsze to samo wyjście.

    (koniec cytatu)

    > Ogólnie, oodwoływanie się do takich pojęć jak "istota czegoś" jest trochę...
    nieinżynierskie.

    Owszem. Ale dlaczego miałoby to być problemem?

    > > Problem polega na tym, że mylisz w tej chwili istotę programu
    >
    > No i znowu ta istota. Z ciekawości wpisałem w wyszukiwarkę i... nic. Ani w
    wikipedii, ani nigdzie indziej. Po angielsku to pewnie "the essence of the program"
    i... znowu nic.
    >
    > Skoro to pojęcie nigdzie nie jest zdefiniowane i nikt go w branży nie używa, to
    chyba nie świadczy o mnie bardzo źle, że *nadal* nie rozumiem, o co konkretnie
    chodzi?

    Stwierdzenie, że kompilator jest w istocie programem czysto funkcyjnym
    oznacza tyle, że kompilacja jest rodzajem transformacji (przekształcenia).

    > > Owszem, każdy program można analizować przy pomocy pojęcia funkcji,
    > > albo przy pomocy pojęcia maszyny stanu, albo czegoś jeszcze innego.
    >
    > Tak. Dlatego pojęcie "czysto funkcyjny" nie ma sensu.

    Ma dokładnie taki sens, jak powiedziałem.

    > > Projektanci kompilatorów muszą zwracać
    > > uwagę na zupełnie inne rzeczy, niż projektanci gier komputerowych albo
    > > stron internetowych, po w pierwszym przypadku kluczowy jest wynik, a w
    > > pozostałych -- interakcja.
    >
    > Tak, i stosuje się różne metody do optymalizacji tych różnych celów. Ale nic nie
    jest "czyste", bo bez interakcji nie da się pobrać danych ani podać wyników a bez
    wyniku interakcja jest bezcelowa - a przez proste zmiany w formacie i sposobie
    uruchomienia można zmienić jeden rodzaj programu w drugi. I o braku tej "czystości"
    właśnie tu piszę.

    Piszesz błędnie.

    Jeżeli mamy np. program

    int square(int x) {
    return x*x;
    }

    void main(int argc, char *argv[]) {
    assert(argc > 1);
    int n = atoi(argv[1]);
    printf("kwadrat liczby %d wynosi %d\n", n, square(n));
    }

    to square jest czystą funkcją.

strony : 1 . 2 . [ 3 ] . 4


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: