•  

    #codziennylinustorvalds 6/32

    C++ is a horrible language. It's made more horrible by the fact that a lot
    of substandard programmers use it, to the point where it's much much
    easier to generate total and utter crap with it. Quite frankly, even if
    the choice of C were to do nothing but keep the C++ programmers out,
    that in itself would be a huge reason to use C.


    gmane.comp.version-control.git, 2007-09-06
    #linux #programista15k #komputery #cytatywielkichludzi #cytaty #heheszki #programowanie #cpp

    źródło: torvalds6.jpg

    •  

      @yuim: Miał trochę racji, bardziej przydałoby się Meta-C przynajmniej 30lat temu, bo teraz są leprze języki jak przykładowo Go albo Rust.

    •  

      @lionbest: ty się najpierw naucz języka polskiego

    •  

      @yuim: trochę jest w tym racji. Linus powiedział to w latach 90; wtedy królowal C++ z ultra korporacyjnym OO. Jakby jądro linuxa było tak napisane, to nikt by go nie używał.

    •  

      @Saly: jak dla mnie C++ to jest jakieś nieporozumienie, ten język jest tak złożony ze zastanawiam się czy ktokolwiek go tak zna xD

    •  

      @yuim: "C++ to jest jakieś nieporozumienie" Dlaczego?

    •  

      @ProtossTassadar: bo moim zdaniem C++ jest zajebiście dużym i złożonym jezykiem mającym aż za dużo ficzerow. Te ficzery C++ mają różne przypadki brzegowe które niespodziewanie mogą eksplodować w trudny do zrozumienia sposób.

      Ja nie jestem żadnym programistą C++, to tylko moja opinia oparta na próbie nauki tego języka jakieś 8 lat temu. Jak sobie przypomnę templaty to mnie do dzisiaj skręca.

      Dla porowniania C z którym na codzien mam styczność, jest bardzo prostym, zwartym i eleganckim językiem. Po tygodniu nawet małpa byłaby w stanie ogarnąć ten język.

      Jeśli programujesz w C++ to jestem ciekawy Twoich przemyśleń na ten temat.

    •  

      C++ jest zajebiście dużym i złożonym jezykiem mającym aż za dużo ficzerow

      @yuim: To prawda. Na szczęście nikt nie każe nikomu ze wszystkiego korzystać. Wiele złych osób maczało palce w standardzie i wiele napsuło. To jednak programista decyduje o tym, czego użyje. Osobiście nie uważam, że wysrać okropny kod jest łatwiej z C++, niż w C. Oba języki pod tym względem są siebie warte.

      jakieś 8 lat temu. Jak sobie przypomnę templaty to mnie do dzisiaj skręca.

      Jak 8 lat temu, gdzie jeszcze nie było działającego kompilatora z C++11, czyli miałeś stare template'y z C++98, to jeśli ich nie zrozumiałeś, to znaczy, że nie rozumiałeś jak działa kompilator i linker. Od C++11 faktycznie dobrze jest wiedzieć więcej, ale przed C++11 templatey po prostu działały. Ot, dajesz definicję do headera i tyle.

      C++ to (niestety) jest język, którego podstawy należy nauczyć się od kogoś, a resztę poznać z dobrych książek.

      C (...) jest bardzo prostym, zwartym i eleganckim językiem.

      Prosty tak, wręcz prostacki, ale na pewno nie elegancki. Surowy malloc z monotonnym wklepywnaiem sizeof() wygląda obrzydliwie. Do tego musimy ręcznie wywoływać free(), gdyż w tym języku nie ma destruktorów. Prosta funkcja z kilkoma wyjściami zamienia nam się w klepanie free() w każdej z nich. Ściąganie locków również robi się upierdliwe z tego samego powodu, a zwykły RAII załatwiły sprawę.

      Inne wady, które bolą i przychodzą mi teraz na myśl:
      brak scoped enumów
      brak możliwości ustawienia domyślnych wartości dla elementów structa
      bez templejtów zrobienie czegoś tak prostego, jak tablica, która nie scastuje mi się przy pierwszej okazji do wskaźnika jest upierdliwe
      MSVC nie wspiera C, a Visual Studio to bardzo dobre IDE (nie jest to wada samego języka, ale jednak warto o tym wspomnieć)

      C obecnie nie ma żadnych zalet nad C++. Aggregate initialization jest w G++ dostępna od dawna, więc nawet tego nie można powiedzieć, że C++ nie ma. ¯\_(ツ)_/¯
      Deklarowanie funkcji w funkcji można obejść poprzez lambdę.

    •  

      @Gwynblade:

      Osobiście nie uważam, że wysrać okropny kod jest łatwiej z C++, niż w C.

      Hmm, chujowy kod można stworzyć w każdym języku, moim zdaniem w C jednak ciężej stworzyć kod który działa w magiczny sposób, właśnie ze względu na prostackość języka.

      z C++98, to jeśli ich nie zrozumiałeś, to znaczy, że nie rozumiałeś jak działa kompilator i linker.

      Ja nie byłem nawet w stanie zrozumiec błędu który kompilator wysral, milion linii które chuja mówią xD To był taki dramat że stwierdziłem że nigdy więcej tego języka.

      Prosta funkcja z kilkoma wyjściami zamienia nam się w klepanie free() w każdej z nich.

      Tutaj nie masz racji, popatrz sobie jak to rozwiązano w kernelu. Przy pomocy goto można uzyskać takie trochę bieda-RAII. To jest całkiem czytelne podejście i jest nagminnie stosowane w kernelu.

      https://www.systutorials.com/5311/raii-like-error-handling-and-resource-management-in-c/

    •  

      moim zdaniem w C jednak ciężej stworzyć kod który działa w magiczny sposób, właśnie ze względu na prostackość języka.

      @yuim: Nie zgadzam się. System typów w C++ jest o wiele bardziej szczelny i pozwala przesunąć część błędów z runtimeu na compile time. Osobiście nie przychodiz mi na myśl sytuacja, w której jakąś rzecz z C++ (która nie jest w C) potrafi sprawić, że wadliwy kod w magiczny sposób działa przez jakiś czas, w danym konkretnym przypadku.

      Ja nie byłem nawet w stanie zrozumiec błędu który kompilator wysral, milion linii które chuja mówią

      No cóż, nie ukrywam, że przy templejtach takie rzeczy się zdarzają. Najlepiej zawsze jest mieć MSVC, GCC i Clanga pod ręką.

      Przy pomocy goto można uzyskać takie trochę bieda-RAII. To jest całkiem czytelne podejście i jest nagminnie stosowane w kernelu.

      Czy ja wiem, czy czytelne. Funkcja, która powinna mieć 6 linijek ma ich 12.
      Używają tego pewnie dlatego, że nie mają innego wyjścia. Idzie się pewnie do tego przyzwyczaić jak do każdego innego wzorca, ale na pewno nie jest to ładne.

    •  

      @Gwynblade:

      Osobiście nie przychodiz mi na myśl sytuacja, w której jakąś rzecz z C++ (która nie jest w C) potrafi sprawić, że wadliwy kod w magiczny sposób działa przez jakiś czas, w danym konkretnym przypadku.

      Może exceptions?

      Używają tego pewnie dlatego, że nie mają innego wyjścia

      Jest rozszerzenie w GCC attribute cleanup, ja nie kojarzę żeby to było używane. Niestety przez najbliższy czas nie będę miał dostępu do komputera więc nie sprawdzę czy gdzieś z tego korzystaja w kernelu. Też pytanie jak to jest zaimplementowane i czy nie ma jakiegoś narzutu. Z ciekawości jak wrócę z urlopu to sprawdzę w deasemblerze jak to jest zrobione.

    •  

      Może exceptions?

      @yuim: A konkretnie? Bo to, że np. każda alokacja może wywalić std::bad_aloc, a nikt tego nie obsługuje (bo najczęściej nie ma jak), to jak dla mnie nie podpada pod "magiczne działanie". Ignorować błędy można zarówno poprzez niesprawdzanie error codeów jak i nie łapanie wyjątków.

      Jest rozszerzenie w GCC attribute cleanup

      Ta, było o tym w artykule, co zalinkowałeś. Jak to jest zaimplementowane? Pewnie tak jak destruktory w C++. Zakładając, że nie jest to zapomniany ficzer, to pewnie nie jest on gorszy od rozwiązania, które by się napisało samemu.

    •  

      jeśli ich nie zrozumiałeś, to znaczy, że nie rozumiałeś jak działa kompilator i linker. Od C++11 faktycznie dobrze jest wiedzieć więcej, ale przed C++11 templatey po prostu działały. Ot, dajesz definicję do headera i tyle.

      C++ to (niestety) jest język, którego podstawy należy nauczyć się od kogoś, a resztę poznać z dobrych książek.

      A możesz polecić jakieś książki? Właśnie takie które tłumaczą jak działa kompilator i linker? Bo z tego co widziałem autorzy bardziej skupiają się na abstrakcjach które daje język zamiast na szczegółach technicznych.