eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingCo jest nie tak z C++ (było: Rust)Re: Co jest nie tak z C++ (było: Rust)
  • X-Received: by 10.31.136.77 with SMTP id k74mr65763vkd.4.1503567513141; Thu, 24 Aug
    2017 02:38:33 -0700 (PDT)
    X-Received: by 10.31.136.77 with SMTP id k74mr65763vkd.4.1503567513141; Thu, 24 Aug
    2017 02:38:33 -0700 (PDT)
    Path: news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!news.cyf-kr.edu.pl!news.nask
    .pl!news.nask.org.pl!news.unit0.net!weretis.net!feeder6.news.weretis.net!feeder
    .usenetexpress.com!feeder-in1.iad1.usenetexpress.com!border1.nntp.dca1.giganews
    .com!nntp.giganews.com!x187no412489ite.0!news-out.google.com!a26ni145qta.0!nntp
    .google.com!v29no283068qtv.0!postnews.google.com!glegroupsg2000goo.googlegroups
    .com!not-for-mail
    Newsgroups: pl.comp.programming
    Date: Thu, 24 Aug 2017 02:38:32 -0700 (PDT)
    In-Reply-To: <6...@g...com>
    Complaints-To: g...@g...com
    Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=213.192.95.134;
    posting-account=f7iIKQoAAAAkDKpUafc-4IXhmRAzdB5r
    NNTP-Posting-Host: 213.192.95.134
    References: <f...@g...com>
    <1...@g...com>
    <7...@g...com>
    <b...@g...com>
    <a...@n...v.pl>
    <2...@g...com>
    <a...@n...v.pl>
    <on23a3$85s$1@node1.news.atman.pl>
    <a...@n...v.pl>
    <on75ke$g4u$1@node2.news.atman.pl>
    <5...@g...com>
    <onfotu$lh6$1@node1.news.atman.pl>
    <0...@g...com>
    <3...@g...com>
    <6...@g...com>
    <c...@g...com>
    <d...@g...com>
    <5...@g...com>
    <c...@g...com>
    <3...@g...com>
    <6...@g...com>
    <c...@g...com>
    <6...@g...com>
    User-Agent: G2/1.0
    MIME-Version: 1.0
    Message-ID: <f...@g...com>
    Subject: Re: Co jest nie tak z C++ (było: Rust)
    From: g...@g...com
    Injection-Date: Thu, 24 Aug 2017 09:38:33 +0000
    Content-Type: text/plain; charset="UTF-8"
    Content-Transfer-Encoding: quoted-printable
    Lines: 262
    Xref: news-archive.icm.edu.pl pl.comp.programming:211273
    [ ukryj nagłówki ]

    W dniu czwartek, 24 sierpnia 2017 10:25:26 UTC+2 użytkownik Maciej Sobczak napisał:
    > > Mogę podać inny przykład, bliższy temu, o czym tutaj jest mowa.
    > >
    > > for (int i = 0; i < ticks_per_frame; i++) {
    > > for_each(in_seq(sectors), bind2nd(mem_fun(&Sector::update), 0.07));
    > > for_each(in_seq(portals), bind2nd(mem_fun(&Portal::update), 0.07));
    > > for_each(in_seq(ropes), bind2nd(mem_fun(&Rope::update), 0.07));
    > > }
    >
    > Faktycznie koszmarek.

    Najgorsze jest to, że Stroustrup sam do czegoś takiego zachęcał.

    > > Dla odmiany taki chociażby Python pozwoliłby wyrazić te konstrukcje
    > > np. tak:
    > >
    > > for instance in range(ticks_per_second):
    > > for sector in sectors:
    > > sector.update(0.07)
    >
    > A gdzieś tak od pół dekady C++ pozwala tak:
    >
    > for (Sector & s : sectors)
    > s.update(0.07);

    Niestety, owe przeboje miały miejsce ponad dekadę temu.
    Z tego co widziałem, w późniejszym kodzie zrobiłem sobie
    coś takiego:

    for_every(body , bodies)
    (*body)->update(0.07);

    gdzie for_every zdefiniowałem sobie jako następujące makro:

    #define for_every(ITERATOR, COLLECTION) \
    for(typeof(COLLECTION.begin()) ITERATOR = COLLECTION.begin(); \
    ITERATOR != COLLECTION.end(); ++ITERATOR)

    aż się dziwię, że byłem wtedy na tyle mądry, żeby nie napisać

    #define in ,

    Ale to był już okres schyłkowy, po którym dałem sobie spokój z C++em
    (poza tym, że czasem go trochę używałem, jak potrzebowałem np. tablicy
    haszującej albo innej kolekcji odmiennej od tablicy i ew. listy linkowanej)

    > > > Ale przecież operatory w Wolframie też można wypowiedzieć.
    > > > Np. operator indeksowania (to te podwójne nawiasy) nazywa się
    > > > Part.
    > >
    > > Dziwne. Nie przyszło mi do głowy, żeby [[_ ;; ;; _]] wymówić "Part".
    >
    > Dziwne. Tak się właśnie ten operator nazywa. Podobnie, + nazywa się Plus. Itd.

    Że + nazywa się Plus, to bym jeszcze może odgadnął.

    > > Prędzej wymówiłbym to jako "otwórz nawias kwadratowy, otwórz nawias
    > > kwadratowy, coś, spacja, średnik, średnik, spacja, średnik, średnik,
    > > spacja, coś, zamknij nawias kwadratowy, zamknij nawias kwadratowy".
    >
    > Jasne. A wywołanie funkcji w SmallTalku wymawiasz "ttl, otwórz
    > nawias okrągły, coś, zamknij nawias okrąły". Nie silmy się na
    > takie trolowanie.

    Akurat w Smalltalku masz zupełnie inną składnię, w której nie ma nawiasów.
    Na matematyce uczono mnie, żeby f(x) czytać jako "f od x" albo
    "wartośćć f w punkcie x". Nie uczono mnie, jak czytać [[_ ;; ;; _]]

    > > Wątpliwości w dalszym ciągu wzbudza rola podkreślnika po argumencie
    > > po lewej stronie znaku ":=",
    >
    > To jest wzorzec, który akceptuje cokolwiek. Czyli jest to definicja funkcji, która
    ma jeden argument dowolnego typu. Można wzorzec ograniczyć np tak:

    Napisałem "wątpliwości", a nie "ciekawość" ;]

    > oddsEvens[x_List] := ...
    >
    > i wtedy jest to funkcja, która ma jeden argument typu List.
    > W tym przypadku można byłoby tak zrobić, ale wtedy taka funkcja działałaby tylko z
    listami, a akurat nie tylko listy mają taką strukturę, którą moglibyśmy chcieć w ten
    sposób uporządkować. Dlatego wolałem zostawić szerszy wzorzec.
    >
    > http://reference.wolfram.com/language/ref/Blank.html
    >
    > > oraz to, dlaczego do wyrażenia tożsamości
    > > użyto symbolu powszechnie używanego w informatyce w roli przypisania.
    >
    > Bo to jest przypisanie. Tak się właśnie definiuje funkcje.
    >
    > http://reference.wolfram.com/language/ref/SetDelayed
    .html

    Może w Mathematice, ale nie w matematyce. W matematyce
    do określania tożsamości używa się symbolu =. Tego samego
    symbolu używa się w ISWIM czy Haskell (w taki sam sposób).

    > > Podwójnych podwójnych średników też nie lubię.
    >
    > To napisz x[[1;;-1;;2]], wtedy będzie widać, że indeksowanie jest od 1 do końca. Ta
    spacja między średnikami to opuszczone -1.

    Włos na głowie jeży się coraz bardziej.

    > > Zgadzam się.
    > > Gdybyśmy zresztą nawet nie dysponowali funkcją Parts, moglibyśmy
    > > ją sobie zdefiniować przy pomocy cons, car, cdr i rekurencji.
    >
    > I to jest właśnie coś, czego nie lubię.
    > Indeksowanie jest naturalną operacją i dla komputera (w sensie: hardware) bardziej
    podstawową. Dlatego wolę, jeśli język ją wspiera bezpośrednio.
    >
    > W ogóle, w naturze nie ma procesów rekurencyjnych.
    > To jest na siłę wciskany ludziom kit, że rekurencja jest
    > podstawą innych rzeczy. Dlatego języki promujące rekurencję
    > jako podstawową konstrukcję są nienaturalne - zarówno w nauce,
    > jak i w wykonaniu.

    To nie jest wciskanie ludziom kitu. Rekurencja w ogólności
    jest prostsza do zrozumienia dla ludzi. Jeżeli spojrzeć na
    rzeczy, które dzieją się w logice, to praktycznie wszystkie
    podstawowe aksjomatyki mają charakter rekurencyjny, a bardzo
    wiele dowodów jest indukcyjnych. Istnieje wiele zagadnień,
    na przykład w kombinatoryce i teorii języków, które
    mają bardzo naturalny sposób wyrazu przy pomocy rekurencji,
    i których wyrażenie bez rekurencji w praktyce wymaga
    "emulowania rekurencji" (np. tworzenia jawnych stosów).

    Z rekurencją jest jednak taki problem, że o ile przy programowaniu
    funkcyjnym jest prosta, o tyle analiza programów proceduralnych
    używających rekurencję potrafi przyprawić o zawrót głowy.

    > > Że języki, które znamy, warunkują sposób, w jaki myślimy,
    >
    > Niezupełnie. Pierwszy język może to warunkować
    > (i Wittgensteinowi chodziło o język naturalny).
    > Natomiast później nasze myślenie może warunkować pozostałe wybory.

    Nie sądzę, żeby Wittgensteinowi chodziło ściśle o język naturalny.
    Wittgenstein pisał "Traktat Logiczno-Filozoficzny" pod silnym wpływem
    pism Fregego, który stworzył swój własny formalizm do precyzyjnego
    zapisywania myśli (który finalnie ewoluował w coś, co dzisiaj znamy
    jako rachunek predykatów). Ciekawostką nieujętą w komiksie jest to,
    że Frege traktował swoją pracę jako realizację idei Leibniza zwanej
    "calculus ratiocinator" albo "characteristica universalis", polegającej
    na stworzeniu rachunku opisującego ludzkie myślenie. (Od innej strony
    -- właśnie języka naturalnego -- do tej idei podszedł profesor Andrzej
    Bogusławski z Uniwersytetu Warszawskiego, którego praca zainspirowała
    Annę Wierzbicką do rozwinięcia systemu zwanego "Naturalnym Metajęzykiem
    Semantycznym", będącego próbą ekstrakcji podstawowych "atomów znaczeniowych"
    pozwalających opisać ludzkie rozumienie. Ot, ciekawostka)

    Nota bene ta historia (tzn. o Fregem i Wittgensteinie) została bardzo
    ładnie opowiedziana w komiksie pt. Logicomix, wydanym również w
    języku polskim (zdaje się że wydawnictwo W.A.B.)

    I oczywiście, ja się z Tobą zgadam, że nie jest tak, że "wszystko
    jest językiem" -- że nasze doświadczenie jest w dużej mierze pozajęzykowe.
    Ale trochę prawdy jest w tym Wittgensteinowskim stwierdzeniu.

    > > Nie wiem zresztą, czy miał przekonać. Raczej miał stanowić
    > > ilustrację tego, w jaki sposób ta maksyma odzwierciedla się
    > > w kontekście języków programowania. Sądzę, że -- mimo wszystkich
    > > zarzutów, jakie wysnułeś, dotyczących rozwiązania wymyślonego
    > > przez Kaya (i które nb nijak się mają do tego, co chciałem
    > > zakomunikować) -- stanowi dobrą ilustrację.
    >
    > Tak. Kiepski język prowadzi do kiepskiego myślenia
    > i w rezultacie do kiepskich programów. :-)

    Tak. To jest wniosek na poziomie ogólnym.
    Z kolei nieznajomość historii prowadzi do tego,
    że nie rozumiemy wartości tego, co posiadamy.
    Allen Newell to naprawdę był niegłupi facet,
    ale w czasach "po wynalezieniu Lispa" trudno
    zrozumieć, jak ktoś mógł wpaść na coś tak pokracznego,
    jak IPL.


    > > Skoro mowa o kontekście, może zamiast pokazywać przykład
    > > w Mathematice, która stosunkowo niewiele różni się od ISWIMa z lat 60.,
    > > może spróbowałbyś pokazać rozwiązanie tego zadania w nowoczesnym
    > > języku, jakim jest C++, żebyśmy zobaczyli
    >
    > Dlaczego? Ty nie pokazałeś przykładu w C++. :-)

    :)
    Ja swoje stanowisko dotyczące C++ staram się jasno artykułować.
    W moim odczuciu to nie jest dobry język do formułowania myśli.
    W jakimś sensie jest to wartościowy eksperyment dla tych, którzy
    potrafią się uczyć na cudzych błędach, bo wydaje mi się, że
    nie ma błędu, którego projektanci C++ by nie popełnili.

    Jeżeli Twój stosunek do C++ jest równie sceptyczny, co mój,
    to może ten apel powinienem skierować do entuzjastów tego
    języka. Ktoś się podejmie?

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

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: