Wątek przeniesiony 2023-09-20 14:17 z Off-Topic przez Riddle.

Dlaczego C++ jest tak skomplikowany?

0

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?

10
lester29 napisał(a):

Hej. Ciekawi mnie czy są dobre powody przemawiające za poziomem skomplikowania języka C++ czy raczej ten język jest over-engineered?

40 lat zbierania feature'ów. Jak będziesz mieć 40 lat to też tak będziesz wyglądać

Warto uczyć się tego języka jeśli kogoś interesuje programowanie systemowe pod Linux czy lepiej C?

C dla małych procesorów (ośmiobitowych) lub jak piszez kernel systemy operacyjnego jak kernel Linuksa. Jak nie to Rusta polecam. Taki C++ 2.0

2

Jest dużo powodów:

  • strasznie stare dziedzictwo tj. język C z 1970 roku, dużo dziwactw z C słabo współgra z tym co mamy teraz w C++
  • C++ jest po prostu stary, każdy stary język po jakimś czasie staje się dziwadłem
  • C++ był mocno eksperymentalny, wiele ficzerów pojawiło się najpierw w C++. Taka Java np. została stworzona jako próba posprzątania tego co ma C++ a nawet te 20 lat póżniej raczej niechętnie dodaje nowe ficzery, jeśli nie zostały dobrze przetestowane w innych językach. Mocno eksperymentalne ficzery mają tą cechę, że większość z nich okazuje się pomyłką
  • ciężki rozwój języka spowodowany dużą ilością niezależnych od siebie kompilatorów, zamrożonym ABI (w przypadku Linuxa, ale to rzutuje na inne platformy) czy terażniejszą złożonością języka, która nie ułatwia
  • trochę brakuje standaryzacji i spójności. C++ to chyba jedyny język (poza lipsami), gdzie da się pisać na tyle różnych sposobów. Do tego dochodzi brak standardowego zarządzania zależnościami, dziwactwa systemów do budowania, różne zachowania kompilatorów

Co do nauki: naucz się C, bo jest proste a będzie jeszcze długo używany. Jak chcesz coś z dużą ilością ficzerów to Rust, który naprawia dużo błędów projektowych języka C++

0

Kiedy warto uczyć się C++? Jakie są zastosowania, w których rzeczywiście C++ wyśmienicie sobie radzi?

2
lester29 napisał(a):

Kiedy warto uczyć się C++? Jakie są zastosowania, w których rzeczywiście C++ wyśmienicie sobie radzi?

c++ ma rozbudowany ekosystem, tzn. biblioteki, silniki, etc (zwał jak zwał) napisane w c++. dla przykładu duże gry w wielu przypadkach robi się pod unreal engine, a ten jest napisany w c++, więc siłą rzeczy trzeba klepać w c++, bo c++ nie jest kompatybilny z innymi językami (no chyba, że językami wprost nastawionymi na kompatybilność z c++, jak np. google carbon). jeśli nie musisz pisać w c++, bo nie jesteś przywiązany do softu napisanego w c++, a nadal chcesz pisać w języku niezarządzanym, to wybierz rusta.

0

Oprócz gier gdzie jeszcze używa się C++? Aplikacje GUI, przeglądarki, dobrze zgaduję?

jeśli nie musisz pisać w c++, bo nie jesteś przywiązany do softu napisanego w c++, a nadal chcesz pisać w języku niezarządzanym, to wybierz rusta.

Nie dzięki, na razie wolę skupić się na jednym języku i uczyć się reszty w zależności od potrzeb. Aktualnie chcę pocisnąć Pythona na porządnie a potem zastanawiać się nad tym, jaki drugi język ogarnąć. O C i C++ pytam wyłącznie przez ciekawość. Próbowałem coś eksperymentować z Ruby też ale to była chwilowa fascynacja i jednak myślę że Python będzie moim głównym językiem programowania przez dłuższy czas.

0

Embedded ?
Budujesz cały system i dodajsze swoje projekty w c/c++ i masz gotowy obraz.
Teoretycznie można uzyć .net , pascal, rust ale wtedy masz dodatkowa walkę z integracja z resztą projektu/systemu
@lester29 jeżeli uważasz że c++ jest skomplikowany to znaczy że nie jest to narzędzie dla Ciebie i wybierasz sobie inny, ja niedawno migrowałem z pascal w kierunku c++ i skomlikowanie C++ mi pasuje :D

1

C++ się okopał w niszach de facto. Teraz to embeeded małe i duże(plus C), gry, backendy, albo fragmenty backendów(były historie ze przepisywali fragmenty z java->c++). Jakieś aplikacje real time chyba systemy giełdowe klepali w c++.
C++ się po prostu pokomplikował, są takie powiedzmy konstrukcje(na szablonach) że jak na nie popatrzysz to jakaś masakra ale mają sens. UB w C++ tez to jest problem. Toolchain niby jest ale cmake to też nie jest marzenie.
C++ zostanie z nami długo. jest pełno libek, toolchainów, kompilatory dojrzałe. A niekßóre stosy żyją dekadmai patrz BTS noki.

1

Precyzja w operowaniu na pamięci, pełna kontrola nad obszarem roboczym. Jak dla mnie milion zalet. Po prostu w C i C++ "widzisz"
tą pamięć. A jak "widzisz" 1 bit, to możesz zobaczyć 1 gigabajt - a jak widzisz i bit i gigabajt to umiesz ocenić rozmiar wszystkiego.

0

Nie wystarczy samo C?

0

Backed do python, node, javy, tworzenie modów do gier, cheatów wszystkiego co niebezpiecznie zarządza pamięcią.
Programowanie bez kodu źródłowego, można po krótkiej analizie zrzutować dowolny frament pamięci na klasę/struturę i używać tego.

C++ zapewnia dużo struktur danych w standardowej bibliotece i dzięki temu można normalnie większość problemów algorytmicznych rozwiązać optymalnie.
Różnica jest i tak niewielka w C i C++, chodź ludzie będą się kłócić, tak jak w C uruchamiasz funkcję i podajesz strukturę, tak w C++ kompilator za ciebie wywołuje daną metodę strutury i przekazuje twoją strukturę w this rejestrze, różnie w zależności od procesora i kompilatora.
Jak spojrzysz w assembler to zwyczajnie wygląda jak wrzucenie adresu struktury i odpalenie funkcji.
Name mangling powoduje, że mamy namespace, gdzie w C brakuje i C++ jest kompatybilny z C, więc możesz sobie w kernelu windowsa pisać i w C i w C++.

A tak i tak musisz wybrać target co chcesz robić.
Jak drivery i embedded to czemu nie, teraz można jeszcze z micropythona korzystać, ale wygodniej i tak jest w C czy C++.

Jak skrypty pisać to lepiej python/javascript, szybciej prościej wygodniej.

Jak webówka to backendy będą pewnie wszyscy klepać w spring, net, fastapi, django, nextjs etc.

Wejście w opensource takiej stronki w React, a jakiegoś projektu w C, to w przypadku pierwszego po paru minutach ogarniesz co i jak działa, bo struktura projektu jest prosta.
A w drugim przypadku będziesz pewnie zaprzęgał debuggera, grepa, regexy, cross reference i myślał jak ugryźć problem żeby dotrzeć do tego co chcesz.

0

W jakich zastosowaniach lepiej sprawdzi się podejście polegające na robieniu aplikacji w całości w C++/Rust a kiedy podejście polegające na robieniu interfejsu aplikacji w Pythonie i pisaniu tego co w wymaga wydajności w C/C++/Rust sprawdzi się lepiej?

0

Większość bibliotek w pythonie ma backend w C/C++/Rust, numpy, pytorch, tensorflow, cuda, wszystko co jest intense computing.

A w pythonie sklejasz poszczególne części systemu więc nawet jak z pythona korzystasz to bardzo duża część jego bibliotek jest niskopoziomowo napisana w innym języku.
Dlatego do deep learningu się nadaje, bo i tak na GPU wykonujesz wszystko z użyciem backendu cuda w C/C++.

1

Jak ktoś jest bardzo mądry to zarabia 30k w embedded c/c++, jak ktoś jest średnio inteligentny to klepie backend c#/Java, a jak ktoś nie jest bardzo mądry i średnio inteligentny to klepie skrypty w JavaScript/python

0

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ę?

0

@lester29 Lepszy czysty C, C++ to (jak napisał @KamilAdam) 40 lat zamieszania. Jak dla mnie C jest nie tylko do embedded. Rusta nie za bardzo znam, więc nie mogę się wypowiedzieć, ale w każdym razie polecam C. Zresztą wiele innych języków - m. in. Java - zostało zaprojektowanych (częściowo) na podstawie C, więc sama nauka C ma sens nawet jak nie będziesz go bespośrednio używać.

0

" Jak spytałem na forum programistycznym czemu przeglądarki nie mają opcji odpalenia DOM bez trybu graficznego to się na mnie patrzyli jak na szaleńca. Wcześniej czy później będę chciał to napisać, tylko trzeba obsłużyć JS który jest językiem większym od C++. Chwilowo nie robię w C++ bo pielgrzymki, krucjaty i palenie czarownic było ok, ale z JS mam ledy, mtv i GSM." by johnny_Be_good

1
lester29 napisał(a):

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

C++ używa się powszechnie w pewnego rodzaju aplikacjach (np. do robienia gier), plus ma duży ekosystem.

Natomiast jest to język z bagażem i wieloma wadami i jeśli startujesz od zera i nie jesteś uzależniony od C++ (IMO ludzie piszą w C++ głównie dlatego, że muszą, bo rozwijają soft który jest pisany w C++, korzystają z bibliotek napisanych w C++ i po prostu znają C++), to bardziej przyjemny będzie Rust, ponieważ Rust chroni cię przed wieloma błędami czasu wykonywania po prostu nie doprowadzając do kompilacji takiego kodu (czyli trudniej skompilować coś, co jest wadliwie zaprojektowane, czyli wymusza lepszy design).

W Rust również wygodnie się pisze, jest dużo przydatnych rzeczy jak pattern matching, enumy, traity itp.

Tyle, że Rust jest dość trudnym językiem, ale na szczęście kompilator często sam ci mówi, co masz źle i jak to poprawić. Poza tym jak chcesz łatwy język, to możesz się jakiegoś skryptowego nauczyć np. JS, Python itp. W sumie dobrze znać jakiś język skryptowy, żeby móc szybko prototypować rozwiązania, zanim się je napisze w "poważnym" języku.

0
lester29 napisał(a):

Kiedy warto uczyć się C++? Jakie są zastosowania, w których rzeczywiście C++ wyśmienicie sobie radzi?

C++ to wymagane narzędzie jeżeli chcesz robić jakieś konkretne rzeczy. Np embedded, gamedev, telecomy, grafika 2D/3D, duże systemy do zarządzania sprzętem czy biblioteki matematyczne do wysokowydajnych obliczeń (to jest najciekawsze, ale rozchwytywane i w PL ciężko znaleźć coś z dobrą pensja jeżeli w ogóle jest).

Czyli jeżeli chcesz pracować w jednym z tych to tylko wtedy uczysz się C++. Sam z siebie w ciemno bym nie szedł, bo później jest dużo utrzymaniowki, dużo więcej nauki, mało programowania i statystycznie gorsza pensja, więc jeżeli Cię coś nie pasjonuje to łatwiej o wypalenie.

3

C++ jest workiem hacków dodanych do C. Im dłużej programuję tym mniejszy jest to dla mnie problem. Długi czas wolałem C ze względu na prostotę i przewidywalność, którą traciłem w C++ i nie za bardzo mi się to kalkulowało. Na szczęście odkąd jest Rust nie ma już powodu się zastanawiać, bo mamy dobry język, świetnie zaprojektowany, który ma porównywalną wydajność co C (i podobne możliwości programowania niskopoziomowego), nie mniej łatwego do łączenia z C i jednocześnie jest nowoczesny jeśli chodzi o styl programowania. Dodatkowo ze swoim unikalnym podejściem do zarządzania pamięcią, pozwala mieć zarządzanie pamięcią w czaie kompilacji. C i C++ to dla mnie legacy, mogę robić to za pieniądze. Dla siebie tylko Rust (jeśli chodzi o programowanie systemowe ofc). :)

0
lester29 napisał(a):

Jakie są zastosowania, w których rzeczywiście C++ wyśmienicie sobie radzi?

Radzi sobie w licznych branżach - za WYJĄTKIEM słowa "wyśmienicie".
Rzetelny poziom (choć liczne wady i uwierajace szwy), zakorzeniony, wiele lepszy od C dla złożonych produktów, ale z akcentem na "zakorzeniony" a nie na "wyśmienicie"

1 użytkowników online, w tym zalogowanych: 0, gości: 1