• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dlaczego C++ jest tak skomplikowany?

Object Storage Arubacloud
+2 głosów
418 wizyt
pytanie zadane 20 września 2023 w C i C++ przez whiteman808 Obywatel (1,820 p.)
Hej. Ciekawi mnie czy są dobre powody przemawiające za poziomem skomplikowania języka C++ czy raczej ten język jest over-engineered? Warto uczyć się tego języka jeśli kogoś interesuje programowanie systemowe pod Linux czy lepiej C?
komentarz 20 września 2023 przez reaktywny Nałogowiec (41,090 p.)
Oscar w ten sposób udowodniłeś, że nie ma rzeczy trudnych ;)
komentarz 20 września 2023 przez whiteman808 Obywatel (1,820 p.)
Moja zaniżona opinia na temat c++ wynika poniekąd z tego co usłyszałem od gościa hejtującego systemd, wolącego void linux itd.
On narzekał że c++ to g**no bo skomplikowane
Czy jest sens sugerować się nim czy olać jego opinię?
komentarz 20 września 2023 przez tkz Nałogowiec (42,000 p.)
Oczywiście, że nie. Nie ma co słuchać się ignorantów.
komentarz 20 września 2023 przez TOWaD Mądrala (6,000 p.)
Ale i tak dużo prostszy od JS (szególne jak jest dużo wzorów matematycznych).

Pewnie to wszystko zależy od źródeł lub nauczyciela.
1
komentarz 22 września 2023 przez Oscar Nałogowiec (29,320 p.)

@reaktywny, wspomniałem o VHDL bo on "odziedziczył" składnie Ady.

1 odpowiedź

–1 głos
odpowiedź 20 września 2023 przez jankustosz1 Nałogowiec (35,880 p.)
Moim zdaniem problemem c++ jest właśnie to, że nie jest on rozbudowany, a nie że jest. C# jest bardzo rozbudowany a jest prościutki. Wiele rzeczy które są w C#/Javie wbudowane w język i są wspierane przez twórców języka w c++ nie istnieją, albo są na dużo niższym poziomie, przez co trzeba napisać 3x więcej kodu by coś zrobić, który w dodatku będzie cięższy w zrozumieniu i utrzymaniu. Do tego ma dużo mniej wygodnych bibliotek.

C++ nie jest jakiś strasznie skomplikowany, jest w paru miejscach niepotrzebnie zagmatwany, ale nie sprawia to że jest on skomplikowany. Skomplikowane jest natomiast tworzenie w nim programów, np. gdy porównamy sobie do robienia takiego samego programu np. w pythonie. W dodatku jak natrafisz na jakiś błąd w c++ to powodzenia w debugowaniu, bo cuda potrafią się w tam dziać, np. wywołujesz jedną funkcję, a uruchamia się inna (takie coś może nastąpić gdy w którymś miejscu programu wyjdziesz poza tablicę). Już pomijam jakie cyrki potrafią się dziać w c++ z wielowątkowością, zdecydowanie nie polecam w nim robić dużych projektów, natomiast do np. algorytmów nadaje się idealnie.
komentarz 21 września 2023 przez tkz Nałogowiec (42,000 p.)

Moim zdaniem problemem c++ jest właśnie to, że nie jest on rozbudowany 

 Czyli nie znasz C++...

wywołujesz jedną funkcję, a uruchamia się inna (takie coś może nastąpić gdy w którymś miejscu programu wyjdziesz poza tablicę)

Podasz proszę przykład?

 zdecydowanie nie polecam w nim robić dużych projektów, natomiast do np. algorytmów nadaje się idealnie.

Powiedz to wszystkim telcomom, systemom wbudowanym, wszystkim programom nastawianych na low latency. 

komentarz 21 września 2023 przez jankustosz1 Nałogowiec (35,880 p.)

Moim zdaniem problemem c++ jest właśnie to, że nie jest on rozbudowany 

 Czyli nie znasz C++...

Choćby żeby głupi http request wysłać musisz instalować zewnętrzne biblioteki, albo babrać się w socketach, a to wierzchołek góry lodowej. O braku ORMów już nawet nie wspomnę :). Dodatkowo w c++ nie ma refleksji co znacznie ogranicza jego możliwości (pod względem prostoty kodu)

wywołujesz jedną funkcję, a uruchamia się inna (takie coś może nastąpić gdy w którymś miejscu programu wyjdziesz poza tablicę)

Podasz proszę przykład?

 Nie podam teraz dokładnego przykładu, bo nie pamiętam. Ale miałem dokładni ten błąd który opisałem. Być może był on spowodowany jakimś zamieszaniem z wielowątkowością i zwalnianiem pamięci wątku zanim zakończył swoje działanie, już nie pamiętam dokładnie. W każdym razie masę czasu spędziłem, żeby dojść do tego, że funkcja która się nie powinna wywoływać powoduje błąd, a jeszcze więcej czasu, żeby znaleźć jakim cudem to jest możliwe że ona się wywołuje. Takie cuda tylko w c/c++ :)

zdecydowanie nie polecam w nim robić dużych projektów, natomiast do np. algorytmów nadaje się idealnie.

Powiedz to wszystkim telcomom, systemom wbudowanym, wszystkim programom nastawianych na low latency. 

No dobra, jest więcej wyjątków nie tylko algorytmy. C/C++ się przydaje tam gdzie bardzo ważna jest wydajność / są bardzo ograniczone zasoby sprzętowe / trzeba wykonywać wiele niskopoziomowych operacji blisko hardwaru. Jest jeszcze Rust, ale nic w nim nie robiłem wiec się nie wypowiem. Gry niby też się robi w c++ ze względu na wydajność. Jeżeli masz jednak dowolność wyboru języka to z c++ napracujesz się 2x bardziej niż w c# robiąc duży biznesowy projekt, a współczynnik ten będzie tylko rósł w miarę rozwoju projektu o ile nie będziesz bardzo dbał o jakość kodu.

komentarz 21 września 2023 przez Ehlert Ekspert (212,710 p.)

Choćby żeby głupi http request wysłać musisz instalować zewnętrzne biblioteki, albo babrać się w socketach, a to wierzchołek góry lodowej. O braku ORMów już nawet nie wspomnę :).

Wynika to z tego że C++ nie jest do tego przeznaczony. 

Nie podam teraz dokładnego przykładu, bo nie pamiętam

xD

C# jest bardzo rozbudowany a jest prościutki. 

W sensie masz też na myśli cały ekosystem .NET'a? Bo chyba w tym też za dużo nie pisałeś. 

komentarz 21 września 2023 przez tkz Nałogowiec (42,000 p.)

@jankustosz1, 

Choćby żeby głupi http request wysłać musisz instalować zewnętrzne biblioteki, albo babrać się w socketach, a to wierzchołek góry lodowej. O braku ORMów już nawet nie wspomnę :). Dodatkowo w c++ nie ma refleksji co znacznie ogranicza jego możliwości (pod względem prostoty kodu)

To jest bardziej dyskusja na temat rozbudowana biblioteka standardowa vs zaciągnij co tylko chcesz. ORM-y są, nawet jednego z bardziej popularnych jest Polak. Co do ostatniego zdania, są biblioteki dynamiczne. Abstrahując, że niby to podejście ma jakkolwiek uprościć kod.

   Nie podam teraz dokładnego przykładu, bo nie pamiętam. Ale miałem dokładni ten błąd który opisałem. Być może był on spowodowany jakimś zamieszaniem z wielowątkowością i zwalnianiem pamięci wątku zanim zakończył swoje działanie, już nie pamiętam dokładnie. W każdym razie masę czasu spędziłem, żeby dojść do tego, że funkcja która się nie powinna wywoływać powoduje błąd, a jeszcze więcej czasu, żeby znaleźć jakim cudem to jest możliwe że ona się wywołuje. Takie cuda tylko w c/c++ :)

Nie podasz, bo dostaniesz segmentation fault, system nie jest taki głupi by pozwolił Ci grzebać po czyjejś pamięci. 

Jeżli mówisz o pamięci i używasz "c/c++", to nie masz zielonego pojęcia jak to działa w tych językach. 

No dobra, jest więcej wyjątków nie tylko algorytmy. C/C++ się przydaje tam gdzie bardzo ważna jest wydajność / są bardzo ograniczone zasoby sprzętowe / trzeba wykonywać wiele niskopoziomowych operacji blisko hardwaru. Jest jeszcze Rust, ale nic w nim nie robiłem wiec się nie wypowiem. Gry niby też się robi w c++ ze względu na wydajność. Jeżeli masz jednak dowolność wyboru języka to z c++ napracujesz się 2x bardziej niż w c# robiąc duży biznesowy projekt, a współczynnik ten będzie tylko rósł w miarę rozwoju projektu o ile nie będziesz bardzo dbał o jakość kodu.

Czyli python z sdk od nvidi nie będzie działał blisko hardwaru? Sam język nie jest wyznacznikiem abstrakcji. 

komentarz 21 września 2023 przez jankustosz1 Nałogowiec (35,880 p.)

No dobrze, postaram się wszystkim odpisać :)

Wynika to z tego że C++ nie jest do tego przeznaczony.  

Prawda, nie jest.

xD

 Cóż tu komentować. Twierdzisz, że kłamę?

W sensie masz też na myśli cały ekosystem .NET'a? Bo chyba w tym też za dużo nie pisałeś. 

Pracuję jako .Net developer. Wszystko jest na tyle intuicyjnie zaprojektowane, że bardzo często nawet dokumentacji nie trzeba czytać. Porównaj to sobie do c++.

To jest bardziej dyskusja na temat rozbudowana biblioteka standardowa vs zaciągnij co tylko chcesz. ORM-y są, nawet jednego z bardziej popularnych jest Polak. Co do ostatniego zdania, są biblioteki dynamiczne. Abstrahując, że niby to podejście ma jakkolwiek uprościć kod.

Języki wysokopoziomowe jak c# czy js zawierają informację w obiekcie o tym jakie są pola i jakie mają wartości, można się po tych polach przeiterować, a nawet struktura obiektu może nie być znana w momencie kompilacji. W c++ obiekt to same dane, nie ma żadnych metadanych. Powoduje to, że możliwości znacznie się ograniczają. Np. w c# może z użyciem Dappera zrobić sobie zapytanie sql i podać dowolny obiekt. Dapper sam ogarnie jakie trzyma on dane i prześle je w parametrach. Nie wierzę że takie coś jest możliwe w c++. Pewnie jeżeli by się dało, to jakimś dzikim hakiem i kod byłby dużo brzydszy.

Nie podasz, bo dostaniesz segmentation fault, system nie jest taki głupi by pozwolił Ci grzebać po czyjejś pamięci. 

Zrób kilka funkcji, ustaw wskaźnik do funkcji na jedną z nich, a następnie dodaj do niego np. 50 i sprawdź co się stanie po wywołaniu. Moim zdaniem duża szansa że wskoczy Ci do środka jakieś innej funkcji i to nawet nie na początek a gdzieś w połowie. 

Czyli python z sdk od nvidi nie będzie działał blisko hardwaru? Sam język nie jest wyznacznikiem abstrakcji. 

Nie korzystałem, z żadnego sdk od Nvidii więc nie wiem co masz na myśli, ale pewnie wiesz jak działają te wszystkie biblioteki od ML w python. Python jest bardzo wolny i wykonywanie w nim obliczeń pod AI byłoby bardzo nieefektywne. Wszystkie te wysokopoziomowe funkcje z bibliotek od ML w python, uruchamiają szybkie programiki napisane w C/C++ i oddelegowują im zadania, a następnie wypluwają ich wynik.

 

komentarz 21 września 2023 przez tkz Nałogowiec (42,000 p.)

Pracuję jako .Net developer. Wszystko jest na tyle intuicyjnie zaprojektowane, że bardzo często nawet dokumentacji nie trzeba czytać. Porównaj to sobie do c++. 

Porównujesz framework do języka? Jaki to ma cel? 

Języki wysokopoziomowe jak c# czy js zawierają informację w obiekcie o tym jakie są pola i jakie mają wartości, można się po tych polach przeiterować, a nawet struktura obiektu może nie być znana w momencie kompilacji. W c++ obiekt to same dane, nie ma żadnych metadanych. Powoduje to, że możliwości znacznie się ograniczają. Np. w c# może z użyciem Dappera zrobić sobie zapytanie sql i podać dowolny obiekt. Dapper sam ogarnie jakie trzyma on dane i prześle je w parametrach. Nie wierzę że takie coś jest możliwe w c++. Pewnie jeżeli by się dało, to jakimś dzikim hakiem i kod byłby dużo brzydszy.

Generalnie mam wrażenie, że siedzisz w samochodzie i mówisz jakie to proste i piękne. To, że coś działa na tym poziomie, nie znaczy, że pod spodem nie ma dzikich haków. I jest możliwe w C++, mamy na przykład szablony. 

Zrób kilka funkcji, ustaw wskaźnik do funkcji na jedną z nich, a następnie dodaj do niego np. 50 i sprawdź co się stanie po wywołaniu. Moim zdaniem duża szansa że wskoczy Ci do środka jakieś innej funkcji i to nawet nie na początek a gdzieś w połowie. 

Myk w tym, że to się nie skompiluje, bo standard tego nie uwzględnia, a nawet zabrania.

komentarz 21 września 2023 przez jankustosz1 Nałogowiec (35,880 p.)

 To, że coś działa na tym poziomie, nie znaczy, że pod spodem nie ma dzikich haków. I jest możliwe w C++, mamy na przykład szablony

Z tymi szablonami to też ostro zaszaleli w c++.

Ogólnie mam wrażenie, że uwielbiasz C++, piszesz w nim pewnie już bardzo długo i pewnie jesteś w nim zajebisty. Jednak jak ma się młotek to wszystko wygląda jak gwóźdź nawet jak nim nie jest. 

komentarz 21 września 2023 przez tkz Nałogowiec (42,000 p.)

 Jednak jak ma się młotek to wszystko wygląda jak gwóźdź nawet jak nim nie jest. 

Zawodowo pisałem w 3 językach i masie narzędzi. Od czysto obiektowych typu Java, po funkcyjne typu Haskell. Udało mi się też używać VHDL. Udało mi się też stworzyć własny język na potrzeby pracy inżynierskiej. Więc narzędzi w mojej skrzyneczce mam kilka. 

Nie podoba mi się wyłącznie podejście, że coś jest ble, bo w czymś innym jest łatwiej/prościej; bo tego nie znam. Fakt, próg wejścia jest zdecydowanie wyższy niż w innych językach, ale taka jego natura. Wybierasz go z innych powodów niż zestaw narzędzi out of the box.

Podobne pytania

0 głosów
0 odpowiedzi 165 wizyt
pytanie zadane 12 sierpnia 2020 w OpenGL, Unity przez tonn204 Mądrala (7,440 p.)
0 głosów
0 odpowiedzi 241 wizyt
0 głosów
0 odpowiedzi 1,843 wizyt
pytanie zadane 7 czerwca 2017 w C i C++ przez Postal192 Początkujący (270 p.)

92,588 zapytań

141,439 odpowiedzi

319,688 komentarzy

61,974 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...