Kiedy po raz pierwszy nauczyłem się C ++ 6-7 lat temu, nauczyłem się w zasadzie „C z klasami”. std::vector
był zdecydowanie zaawansowanym tematem, o którym można się dowiedzieć, gdyby naprawdę chciał. I z pewnością nikt mi nie powiedział, że destruktory można wykorzystać do zarządzania pamięcią. Dziś wszędzie, gdzie spojrzę, widzę RAII i SFINAE, STL i Boost, a także, cóż, nowoczesne C ++. Nawet osoby, które dopiero rozpoczynają naukę języka, wydają się być uczone tych pojęć niemal od pierwszego dnia.
Moje pytanie brzmi: czy to po prostu dlatego, że widzę tylko „najlepsze”, czyli pytania tutaj na SO i na innych stronach programistycznych, które mają tendencję do przyciągania początkujących (gamedev.net), czy też jest to faktycznie reprezentatywne dla C ++ społeczność jako całość?
Czy nowoczesny C ++ naprawdę staje się domyślnym? Czy zamiast być jakąś wymyślną rzeczą, o której piszą eksperci, staje się „takim, jakim jest C ++”? A może po prostu nie widzę tysięcy ludzi, którzy wciąż uczą się „C z klasami” i piszą własne tablice dynamiczne zamiast używać std::vector
, i zarządzają pamięcią, ręcznie wywołując new / delete z ich kodu najwyższego poziomu?
Choć bardzo chcę w to wierzyć, wydaje się niewiarygodne, że cała społeczność C ++ rozwinęła się tak bardzo w ciągu kilku lat. Jakie są Twoje doświadczenia i wrażenia?
(zastrzeżenie: ktoś niezaznajomiony z C ++ może błędnie zinterpretować tytuł jako pytanie, czy C ++ zyskuje na popularności w porównaniu z innymi językami. To nie jest moje pytanie. „Współczesny C ++” to popularna nazwa dialektu lub stylu programowania w C ++, nazwana na cześć książki. Nowoczesny projekt C ++: Zastosowano ogólne programowanie i wzorce projektowe ”, a interesuje mnie wyłącznie to w porównaniu ze„ starym C ++ ”. Nie ma więc potrzeby mówić mi, że czas C ++ minął i wszyscy powinniśmy używać Pythona;))
Odpowiedzi:
Oto, jak moim zdaniem ewoluowało.
Pierwszą generacją programistów C ++ byli programiści C, którzy w rzeczywistości używali C ++ jako C z klasami. Poza tym STL nie był jeszcze na miejscu, więc zasadniczo tym był C ++.
Kiedy pojawił się STL, było to zaawansowane, ale większość ludzi piszących książki, składających programy nauczania i prowadzących zajęcia nauczyła się najpierw C, a potem dodatkowych rzeczy C ++, więc drugie pokolenie uczyło się z tej perspektywy. Jak zauważono w innej odpowiedzi, jeśli czujesz się komfortowo, pisząc regularnie w pętlach, zmiana na użycie
std::for_each
nie kupi ci wiele, z wyjątkiem ciepłego, rozmytego wrażenia, że robisz rzeczy w „nowoczesny” sposób.Teraz mamy instruktorów i autorów książek, którzy używali całego C ++ i otrzymywali instrukcje z tej perspektywy, na przykład Accelerated C ++ firmy Koenig & Moo i nowy podręcznik Stroustrupa. Więc nie uczą
char*
potemstd::strings
.To interesująca lekcja na temat tego, ile czasu zajmuje zastąpienie „starszych” metod, zwłaszcza jeśli mają one udokumentowaną skuteczność.
źródło
Zdecydowanie tak. Dla mnie, jeśli nie programujesz C ++ w stylu „nowoczesnego C ++”, jak to określasz, to nie ma sensu używać C ++! Równie dobrze możesz po prostu użyć C. „Nowoczesne C ++” powinno być moim zdaniem jedynym sposobem programowania C ++ i spodziewałbym się, że każdy, kto używa C ++ i programuje w ten „nowoczesny” sposób, zgodzi się ze mną. W rzeczywistości zawsze jestem całkowicie zszokowany, gdy słyszę o programistę C ++, który nie jest świadomy takich rzeczy, jak auto_ptr lub ptr_vector. Jeśli o mnie chodzi, te pomysły są podstawowe i fundamentalne dla C ++, więc nie wyobrażam sobie tego w żaden inny sposób.
źródło
W czasach Windows 3.1 C było standardem. Kiedy C ++ trafił na rynek deweloperów, a później stał się standardem ANSI, był to nowy trend. Spopularyzował akronim OOP i niektóre z podstawowych wzorców projektowych wykorzystujących polimorfizm.
Teraz, przy większej akceptacji platform zarządzanych o niskich barierach wejścia, takich jak C # / .NET, nie ma powodu, aby używać C ++. Tak duża część programistów będzie miała wybór i bądźmy szczerzy: C ++ to niedźwiedź, którego trzeba się nauczyć dla nowicjusza. Dzięki C # możesz po prostu z tym biegać.
To pozostawia tylko platformy, które POTRZEBUJĄ C ++ i zagorzałych ewangelistów C ++ do kontynuowania ćwiczenia tej sztuki. To społeczność, która potrzebuje i chce wszystkich warstw abstrakcji, które są uważane za „nowoczesne C ++”.
Więc tak, uważam, że „nowoczesny C ++”, jak to określasz, staje się coraz bardziej rozpowszechniony. Chociaż jest to powszechne w przypadku innych odbiorców niż w przeszłości.
źródło
Jestem jednym z tych gości, którzy nauczyli się pracować z STL i słyszeli dużo o RAII i dobrych praktykach programowania w C ++ od pierwszego dnia. Wygląda na to, że niektóre z najbardziej polecanych książek do nauki języka C ++ dzisiaj (jak Accelerated C ++ i Effective C ++ ) skup się na używaniu narzędzi STL zamiast zwijania własnych rzeczy, a także podaj wiele „reguł” efektywnego (lub „nowoczesnego”) programowania.
Ale rozmawiając ze znajomymi zauważyłem również, że niektóre firmy nadal używają „C with Classes”, a nie „Modern C ++”. Może kiedyś zapanuje kultura proponowana przez autorów i użytkowników „Nowoczesnego C ++” :)
źródło
Myślę, że zaczynasz od złego doświadczenia.
Musisz zdobyć książki Scott Meyers Effective C ++. Zacząłem od C ++ w złości w 1999 roku, mój szef zespołu kazał mi siedzieć i czytać Efektywny C ++ i Bardziej efektywny C ++, zanim pozwolono mi sprawdzić JAKIEKOLWIEK kod.
Większość jego rad brzmi „Nie używaj tej funkcji , ale jeśli musisz, miej to na uwadze”
Jeśli zastosujesz się do jego rad, napiszesz dobry lub „nowoczesny” C ++.
Ma teraz też książkę o STL, ale jej nie czytałem.
źródło
Podczas moich prac w C ++ odkryłem, że nowoczesne funkcje są coraz częściej używane i więcej osób pytało mnie o nie podczas pokazów telefonicznych i wywiadów. O ile wiem, przyjmują.
Nauczyłem się C ++ początkowo jako coś w rodzaju C z klasami; chociaż język znacznie się rozwinął, książki, które czytałem i ludzie, z którymi pracowałem, mocno utknęli na „starym C ++”. RAII coś, o czym ludzie pomyśleliby, zamiast robić automatycznie, i pamiętam, że czytałem niektóre z wczesnych artykułów na temat problemów bezpieczeństwa wyjątków.
Jak już wspomniano, są teraz dostępne nowe książki. Wiele starych nadal jest aktualnych, ale wydaje się, że coraz częściej zawierają one wyjaśnienia, dlaczego oczywiście złe pomysły są złe. (Podobnie, współczesnym czytelnikom trudno jest zrozumieć, jak rewolucyjne były idee Freuda dotyczące nieświadomego umysłu, ponieważ jest to teraz konwencjonalna mądrość).
Stroustrup właśnie wydał podręcznik, Programming: Principles and Practice Using C ++ . Kupiłem go, ponieważ jeszcze nie zawiodłem się w nauce dobrych rzeczy z książki Stroustrupa, ale nie udało mi się przejść przez kilka pierwszych rozdziałów. Jak dotąd, wszystko, co mogę powiedzieć, to to, że podoba mi się sposób, w jaki zaczął, i jest to przynajmniej dobre wprowadzenie do tego, jak powinno się używać C ++.
źródło
Podczas pracy nad projektem, w którym jestem obecnie zaangażowany, jest dużo kodu C ++, który ewoluował przez znaczny okres czasu (ponad 10 lat). Ewolucja, o której mówisz, jest tam wyraźnie widoczna: starszy kod to często „C z klasami” - surowe wskaźniki,
char*
ciągi znaków i użycie powiązanych funkcji C, tablic itp .; nowszy kod wykorzystuje inteligentne wskaźniki ATL i tym podobne do zarządzania zasobami, ale przez większość czasu trzyma się ręcznie zakodowanych pętli, a iterator jest rzadkim widokiem; a najnowszy jest pełen kontenerów STL, algorytmów,shared_ptr
(w tym niestandardowe narzędzia do usuwania do zarządzania uchwytami itp.), mocno uogólnione szablony funkcji i klas itd. Większość tradycyjnych technik kodowania „C z klasami”, takich jak surowe wskaźniki niezakapsułkowane z ręcznym zarządzaniem okresem życia, jest obecnie bardzo źle widziana w recenzjach kodu. Sądząc po tym, wydaje się, że twoja obserwacja jest dokładna.Najnowszy rozwój wydaje się być modą dla lambd C ++ 0x - co ma pozytywną stronę, ponieważ przechyla równowagę na korzyść stosowania standardowych algorytmów zamiast ręcznie kodowanych pętli, ponieważ teraz możesz mieć cały kod w linii algorytmy.
źródło
Nie powiedziałbym, że obecnie std :: vector kwalifikuje się jako „nowoczesny”. To jest naprawdę proste.
Ogólnie mam wrażenie, że ludzie zdobyli pewne doświadczenie z nowoczesnym stylem C ++ i trochę otrzeźwili. Aby wziąć prosty przykład, STL for_each był interesujący, ale w praktyce nie dodaje strasznej wartości do zwykłej pętli C. Debugowanie jest trudniejsze, a czasami nie zapewnia najlepszej wydajności. Również konstrukcje programowania funkcjonalnego w aktualnym STL są ogólnie bardzo uciążliwe, zwłaszcza jeśli masz doświadczenie z prawdziwym językiem funkcjonalnym, takim jak ML.
źródło
Z mojego doświadczenia (Uniwersytet Hiszpański) niestety wynika, że normą jest nie branie pod uwagę języków jako takich. Używają najłatwiejszych języków do nauki programowania (tj. Java), ponieważ ma to być łatwe dla nauczycieli i uczniów, a potem używają C do zajęć z OS i tym podobnych.
C ++ jest wprowadzany bardzo nieznacznie (w każdym razie w każdym kursie), aby zapewnić C z klasami. Nie dostają doładowania ani nawet STL. Myślę, że nadążanie za wszystkimi cechami i sposobem myślenia C ++ jest kosztowne zarówno dla nauczycieli, jak i dla uczniów. Ilu z obecnych tutaj programistów C ++ wie wystarczająco dużo o wszystkich bibliotekach Boost, aby używać ich do oferowania lepszych rozwiązań lub ich projektowania? Trzeba mieć zainteresowanie nadążaniem za wszystkimi nowymi bibliotekami i idiomami.
Jednak, jak powiedziałem, wydaje się, że programowanie w ogóle (a języki programowania w szczególności) nie są traktowane zbyt poważnie, ponieważ wydaje się, że jest to zadanie czasowe, gdy rozpoczynają pracę, a potem zapominają, jak programować, gdy idą w górę w drzewo przedsiębiorstw. Wiele przedsiębiorstw tutaj i sam uniwersytet ma poczucie, że programowanie może być zrobione przez każdego.
Jeśli zastosujesz się do tej filozofii, to dla większości ludzi, których znam, C ++ będzie zawsze „C z klasami”.
Pozdrowienia,
źródło
Z mojego doświadczenia wynika, że w dużej mierze zależy to od wieku produktu / projektu oprogramowania. Większość nowych projektów, o których wiem, używa nowoczesnego C ++ (RAII, STL, Boost). Jednak istnieje wiele projektów C ++, które mają więcej niż 10 lat i nie widać tam nowoczesnego C ++.
Należy również pamiętać, że niektóre z najpopularniejszych implementacji STL były prawie zepsute do może 5 lat temu (MSVC <7,0 i GNU <3,00)
źródło
Myślę, że największą barierą, jaką napotkałem, jest obsługa toolchain, zwłaszcza w projektach wieloplatformowych. Jeszcze kilka lat temu często spotykało się notatki dotyczące kompilacji, które mówiły, że „platforma x potrzebuje do działania STLport, ponieważ ich kompilator jest zepsuty”. Nawet teraz widzę problemy z ludźmi próbującymi używać wielu zależności innych firm powiązanych z różnymi wersjami BOOST. To sprawia, że linkowanie jest niemożliwe, co oznacza, że musisz wrócić i odbudować swoje deps od zera.
Teraz, gdy prawie wszyscy przestali używać MSVC ++ 6, bałagan STLport jest za nami. Ale gdy tylko TR1 wyjdzie na zewnątrz, wrócimy do „które wersje i środowiska obsługują go i poprawią” i po raz kolejny spowolni to adopcję.
Pracuję nad projektem rozpoczętym w C (nie C ++) w 1992 roku. Wdrażanie nowoczesnych praktyk w starym kodzie byłoby niemożliwe. Podobnie pracuję nad innym projektem, który jest znacznie bliższy nowatorskiemu językowi C ++.
źródło
Wiele zespołów, w których byłem i o których słyszałem, uważa, że „czy używamy wyjątków?” pytanie. To jest kod „czy używamy nowoczesnego C ++?”
Gdy nie używasz wyjątków, nie możesz korzystać z pełnej mocy języka i jego bibliotek.
Ale wiele starszych baz kodów jest pozbawionych wyjątków i uważa się, że trudno jest wprowadzić wyjątki do bazy kodu, która ich nie oczekuje, lub do zespołu, który nie wie, jak ich używać, więc w takich przypadkach odpowiedź brzmi: często „nie”.
Z mojego doświadczenia wynika, że współczesny C ++ potrzebuje kogoś, kto jest tym pasjonatem w zespole, który nie może znieść widoku niczego mniej, aby to popchnąć. Musi także przezwyciężyć obiekcje tych, którzy chcą, aby był bardziej podobny do starego kodu.
Chociaż nie sądzę, aby stare bazy kodów C ++ znikały bardzo szybko, uważam, że na świecie jest więcej takich pełnych pasji ludzi niż pięć lat temu. Stają w obliczu tej samej żmudnej bitwy, jaką stoczyli pięć lat temu, ale są bardziej skłonni do znalezienia pokrewnych duchów.
źródło
Zanim odpowiesz na takie pytanie, musisz zgodzić się, czym jest „nowoczesny”. Tak się nie stanie, ponieważ „nowoczesny” jest słabo zdefiniowanym słowem i oznacza różne rzeczy dla różnych ludzi. Tytuł książki Alexandrescu (Modern C ++ Design) również nie pomaga, ponieważ jest to w dużej mierze książka o metaprogramowaniu szablonów, która jest specyficznym obszarem C ++, ale bynajmniej nie jedynym.
Dla mnie „Nowoczesne C ++”! = „Metaprogramowanie szablonów”. Powiedziałbym, że funkcje C ++ ponad C należałyby do następujących kategorii:
Żaden z nich nie jest szczególnie nowoczesny, ponieważ wszystkie mają już prawie 10 lat lub więcej. Większość z tych funkcji jest przydatna i w wielu przypadkach pozwoli Ci być bardziej produktywnym niż zwykłe C. Dobry programista powinien i będzie używał ich wszystkich w solidnym projekcie, ale jedna z tych rzeczy nie jest podobna do drugiej:
Metaprogramowanie szablonów.
Krótka odpowiedź na metaprogramowanie szablonów brzmi po prostu nie. Niestety dla niektórych ludzi jest to synonim „nowoczesnego programowania w C ++”, z powodu książki, ale ostatecznie stwarza więcej problemów niż rozwiązuje. O ile C ++ nie rozwinie lepszych ogólnych mechanizmów programowania, takich jak odbicie, będzie źle dostosowany do programowania ogólnego, a języki wyższego poziomu, takie jak Python, będą lepiej pasować do tych przypadków użycia. Z tego i wielu innych powodów zobacz C ++ FQA
źródło
Najlepsza książka do nauki C ++. „Accelerated C ++” autorstwa Koenig & Moo uczy tego, co określasz jako współczesne C ++, więc myślę, że obecnie większość ludzi go używa. Dla tych z nas, którzy używają C ++ od dłuższego czasu (od połowy lat 80. w moim przypadku), nowoczesny C ++ jest wielką ulgą od żmudnych zadań pisania własnych tablic, ciągów znaków, tablic mieszających (powtarzaj do znudzenia).
źródło
Zajrzałem do C ++ Jobs w rzeczywistości i „nowoczesne” biblioteki są coraz częściej używane w opisach zadań, MFC, które jest dość „staromodną” biblioteką c ++, jest rzadziej używane.
źródło
Standaryzacja języka pod koniec lat 90. była pierwszym krokiem, pozwoliła twórcom kompilatorów skupić się na „standardowym” zestawie funkcji, a także pozwoliła językowi naprawić niektóre nierówności, które pojawiły się w procesie standaryzacji.
To z kolei pozwoliło na tworzenie frameworków opartych na standardowych cechach języka, a nie na funkcjach dostarczanych przez konkretną implementację kompilatora. Biblioteka Boost jest szczególnie pod tym względem. Pozwoliło to również na oparcie nowego rozwoju na wcześniejszych pracach, umożliwiając w ten sposób rozwiązania bardziej złożonych problemów.
Istotną zmianą w tym miejscu jest sposób, w jaki wcześniej platformy były oparte na pojęciu klas bazowych i klas pochodnych (funkcja czasu wykonywania). Jednak obecnie najbardziej zaawansowane funkcje są często w dużym stopniu oparte na szablonach „rekurencyjnych” (funkcja czasu kompilacji).
STL ma swoje wady i zalety, ale przetrwał próbę czasu, jeśli chcesz czegoś, co działa i jest proste, STL z pewnością ma coś, co pomoże Ci zacząć. Nie ma sensu odkrywać koła od nowa (chyba że ze względów dydaktycznych).
Sprzęt komputerowy również zrobił wielkie postępy w stosunku do lat 90. XX wieku, wtedy pamięć i procesor nie są już ograniczeniem dla kompilatora. Zatem większość teoretycznych optymalizacji z książek jest teraz możliwa.
Kolejne kroki języka to wsparcie programowania wielordzeniowego, które jest częścią standardowych wysiłków 0x.
źródło
Tak i nie. Z pewnością w przypadku nowych projektów jest coraz bardziej popularny. Jednak nadal istnieją bariery praktyczne, a nie polityczne, o których inni nie wspominali. Istnieje wiele komercyjnych bibliotek C ++, które używają ABI ze starożytnych kompilatorów, które nie obsługują poprawnie funkcji występujących w nowoczesnym C ++, a wiele firm polega na tych bibliotekach. Na przykład Sun Studio w systemie Solaris nie może współpracować z Boost bez użycia STLport, ale każda komercyjna biblioteka innej firmy, której chcesz użyć, będzie wymagać wersji STL firmy Sun. Ta sama historia z GCC 2.95 i Redhat Enterprise Linux.
źródło
To niesamowite, jak mało wysiłku wymaga uczynienie c ++ bardziej stabilnym. System ostrzegania jest na miejscu, ale niewiele się zmienia. Jeszcze łatwiej jest strzelić sobie w stopę niż 10 lat temu. Nie wiem dlaczego, ale c ++ jest nadal moim ulubionym językiem. :)
źródło