Jako programista Linux (po stronie serwera) nie wiem, gdzie i dlaczego powinienem używać C ++.
Kiedy idę na występ, pierwszym i ostatnim wyborem jest C.
Gdy „wydajność” nie jest głównym problemem, dobrym wyborem są języki programowania takie jak Perl i Python.
Prawie wszystkie aplikacje open source, które znam w tej dziedzinie, zostały napisane w języku C, Perl, Python, skrypt Bash, AWK, a nawet PHP, ale nikt nie używa C ++.
Nie omawiam innych dziedzin, takich jak GUI lub aplikacje internetowe, mówię tylko o Linuksie, CLI i demonach.
Czy istnieje zadowalający powód do używania C ++?
Odpowiedzi:
I tam powinieneś wykonać kopię zapasową. Teraz nie mogę w ogóle mówić za rozwojem serwerów. Być może nie ma istotnego powodu, by preferować C ++ zamiast alternatyw.
Ale ogólnie rzecz biorąc, powodem używania C ++ zamiast innych języków jest rzeczywiście wydajność. Powodem tego jest to, że C ++ oferuje sposób abstrakcji, który, w przeciwieństwie do wszystkich innych języków, które znam, nie ma narzutu wydajności w czasie wykonywania.
Pozwala to na pisanie bardzo wydajnego kodu, który wciąż ma bardzo wysoki poziom abstrakcji.
Rozważ zwykłe abstrakty: funkcje wirtualne, wskaźniki funkcji i idiom PIMPL. Wszystkie opierają się na pośredniczeniu, które w czasie wykonywania jest rozwiązywane przez arytmetykę wskaźnika. Innymi słowy, wiąże się to z kosztem wydajności (jakkolwiek może być niewielkim).
Z drugiej strony C ++ oferuje mechanizm pośredni, który nie wiąże się z żadnymi kosztami (wydajności): szablonów. (Za tę korzyść płaci się (czasem znacznie) dłuższy czas kompilacji.)
Rozważ przykład ogólnej funkcji sortowania.
W C funkcja
qsort
przyjmuje wskaźnik funkcji, który implementuje logikę, według której elementy są uporządkowane względem siebie.Arrays.sort
Funkcja Java występuje w kilku wariantach; jeden z nich sortuje dowolnych obiektów i wymagaComparator
obiekt przekazany do niego, który działa podobnie do wskaźnika funkcji w C użytkownikaqsort
. Ale istnieje jeszcze kilka przeciążeń dla „rodzimych” typów Java. I każdy z nich ma własną kopięsort
metody - okropne kopiowanie kodu.Java ilustruje tutaj ogólną dychotomię: albo masz duplikację kodu, albo nakładasz na siebie czas działania.
W C ++
sort
funkcja działa podobnie jakqsort
w C, z jedną małą, ale zasadniczą różnicą: komparator przekazywany do funkcji jest parametrem szablonu . Oznacza to, że wezwanie może być wstawiane . Do porównania dwóch obiektów nie jest wymagana żadna pośrednictwo. W ciasnej pętli (jak ma to miejsce w tym przypadku) może to naprawdę zrobić znaczącą różnicę.Nic dziwnego, że
sort
funkcja C ++ przewyższa C,sort
nawet jeśli podstawowy algorytm jest taki sam. Jest to szczególnie widoczne, gdy rzeczywista logika porównywania jest tania.Teraz jestem nie mówiąc, że C ++ jest a priori bardziej wydajny niż C (lub innych językach), ani że a priori oferuje większą abstrakcją. To, co oferuje, to abstrakcja, która jest jednocześnie bardzo wysoka i niesamowicie tania, dzięki czemu często nie trzeba wybierać między wydajnym a wielokrotnego użytku kodem.
źródło
Arrays.sort
implementacje Javy ). Tylko Ty tracisz przewagę wysokiej abstrakcji. To nie jest szczególna wada szablonów, to wada duplikacji kodu w ogóle. Co więcej, zwykle nie ma to znaczenia, ponieważ w ciasnych pętlach zwykle jest zawsze ładowany ten sam kod.vector.push_back
dlavector<int>
i inny dlavector<float>
, ale podczas pracy z avector<int>
, nie ma żadnego powodu, dla któregovector<float>
kod byłby w pamięci podręcznej instrukcji. Nie wiem więc, jak to naprawdę ma znaczenie. tworzenie pojedynczych szablonów jest wysoce zoptymalizowane i zazwyczaj bardziej kompaktowe niż ogólne implementacje typu catch-allWidzę zbyt wielu programistów C, którzy nienawidzą C ++. Zajęło mi sporo czasu (lat), aby powoli zrozumieć, co jest dobre, a co złe. Myślę, że najlepszym sposobem na wyrażenie tego jest:
Mniej kodu, brak narzutu w czasie wykonywania, większe bezpieczeństwo.
Im mniej kodu piszemy, tym lepiej. Szybko staje się to jasne u wszystkich inżynierów dążących do doskonałości. Naprawiasz błąd w jednym miejscu, nie w wielu - raz wyrażasz algorytm i ponownie go używasz w wielu miejscach, itd. Grecy mają nawet powiedzenie wywodzące się od starożytnych Spartan: „powiedzieć coś krótszymi słowami, znaczy znaczy że jesteś o tym mądry ”. Faktem jest, że przy poprawnym użyciu C ++ pozwala wyrazić się w znacznie mniejszym kodzie niż C, bez kosztowania szybkości działania, a jednocześnie jest bezpieczniejszy (tzn. Wychwytuje więcej błędów w czasie kompilacji) niż C.
Oto uproszczony przykład z mojego renderera : Podczas interpolacji wartości pikseli na linii skanowania trójkąta. Muszę zacząć od współrzędnej X x1 i osiągnąć współrzędną X x2 (od lewej do prawej strony trójkąta). I na każdym kroku, na każdym mijanym pikselu muszę interpolować wartości.
Kiedy interpoluję światło otoczenia docierające do piksela:
Kiedy interpoluję kolor (nazywany cieniowaniem „Gouraud”, gdzie pola „czerwony”, „zielony” i „niebieski” są interpolowane wartością kroku na każdym pikselu):
Kiedy renderuję w cieniu „Phong”, nie interpoluję już intensywności (ambientLight) ani koloru (czerwony / zielony / niebieski) - interpoluję normalny wektor (nx, ny, nz) i na każdym kroku muszę ponownie -obliczyć równanie oświetlenia w oparciu o interpolowany wektor normalny:
Pierwszym instynktem programistów C byłoby „cholera, napisz trzy funkcje interpolujące wartości i wywołaj je w zależności od ustawionego trybu”. Przede wszystkim oznacza to, że mam problem z typem - z czym mam pracować? Czy moje piksele to PixelDataAmbient? PixelDataGouraud? PixelDataPhong? Och, czekaj, sprawny programista C mówi: użyj unii!
... a następnie masz funkcję ...
Czy odczuwasz chaos?
Po pierwsze, jedna literówka jest wszystkim, co jest potrzebne do awarii mojego kodu, ponieważ kompilator nigdy nie zatrzyma mnie w sekcji „Gouraud” funkcji, aby faktycznie uzyskać dostęp do „.a”. wartości (otoczenia). Błąd, który nie został przechwycony przez system typu C (to znaczy podczas kompilacji), oznacza błąd, który pojawia się w czasie wykonywania i będzie wymagał debugowania. Czy zauważyłeś, że korzystam
left.a.green
z obliczeń „dgreen”? Kompilator na pewno ci tego nie powiedział.Potem wszędzie jest powtórzenie -
for
pętla istnieje tyle razy, ile jest trybów renderowania, cały czas wykonujemy „prawo minus lewo podzielone przez kroki”. Brzydki i podatny na błędy. Czy zauważyłeś, że porównuję za pomocą „i” w pętli Gourauda, kiedy powinienem był użyć „j”? Kompilator znów jest cichy.Co z instrukcją if / else / ladder dla trybów? Co jeśli dodam nowy tryb renderowania za trzy tygodnie? Czy będę pamiętać, aby obsługiwać nowy tryb we wszystkich „if mode ==” w całym moim kodzie?
Teraz porównaj powyższą brzydotę z tym zestawem struktur C ++ i funkcją szablonu:
Teraz spójrz na to. Nie produkujemy już zupy typu uni: mamy określone typy dla każdego trybu. Ponownie używają swoich wspólnych elementów (pola „x”), dziedzicząc po klasie bazowej (
CommonPixelData
). A szablon sprawia, że kompilator UTWORZA (czyli generuje kod) trzy różne funkcje, które sami napisalibyśmy w C, ale jednocześnie bardzo rygorystycznie pod względem typów!Nasza pętla w szablonie nie może goof i uzyskiwać dostępu do nieprawidłowych pól - jeśli to zrobimy, kompilator będzie szczekał.
Szablon wykonuje wspólną pracę (pętla, za każdym razem zwiększając się o „krok”) i może to zrobić w sposób, który po prostu NIE MOŻE powodować błędów w czasie wykonywania. Interpolacja od rodzaju (
AmbientPixelData
,GouraudPixelData
,PhongPixelData
) odbywa się zaoperator+=()
które dodamy w elemencie - co w zasadzie dyktują jak każdy typ jest interpolowana.Czy widzisz, co zrobiliśmy z WorkOnPixel <T>? Chcemy wykonać inną pracę dla każdego typu? Po prostu nazywamy specjalizację szablonu:
To znaczy - funkcja do wywołania jest ustalana na podstawie typu. W czasie kompilacji!
Aby ponownie sformułować:
WorkOnPixel
wersji, kod C ++ będzie SZYBSZY niż C, ponieważ kompilator wprowadziWorkOnPixel
specjalizację szablonu specyficzną dla typu połączenie!Mniej kodu, brak narzutu w czasie wykonywania, większe bezpieczeństwo.
Czy to oznacza, że C ++ jest językiem typu „wszystko na końcu”? Oczywiście nie. Nadal musisz mierzyć kompromisy. Ignoranci używają C ++, kiedy powinni napisać skrypt Bash / Perl / Python. Zadowoleni z wyzwalaczy nowicjusze C ++ utworzą głęboko zagnieżdżone klasy z wirtualnym wielokrotnym dziedziczeniem, zanim będzie można je zatrzymać i wysłać. Będą używać złożonego metaprogramowania Boost, zanim zdadzą sobie sprawę, że nie jest to konieczne. Będą nadal używać
char*
,strcmp
i makr zamiaststd::string
i szablonów.Ale to nic więcej niż ... patrz, z kim pracujesz. Nie ma języka, który chroniłby cię przed niekompetentnymi użytkownikami (nie, nawet Java).
Studiuj i używaj C ++ - po prostu nie przesadzaj.
źródło
RAII dla zwycięskiego dziecka.
Poważnie, deterministyczne zniszczenie w C ++ sprawia, że kod jest znacznie bardziej przejrzysty i bezpieczny, bez żadnych kosztów ogólnych.
źródło
Szablony i STL. Wymieniasz trochę czasu kompilacji (i niektóre potencjalnie niezrozumiałe komunikaty o błędach) na wiele użytecznych narzędzi abstrakcyjnych i oszczędzających pracę, bez zauważalnego spadku wydajności w czasie wykonywania (chociaż binarny ślad może być nieco większy).
Zajmuje trochę czasu (zajęło mi to kilka lat, zanim kliknęło), ale kiedy to zrobisz, życie może być znacznie prostsze.
Przetwarzanie tekstu w C ++ jest o rząd wielkości mniej bolesne niż w C.
źródło
Tak.
Jeśli szukasz wydajności wykonywalnej, wybierasz C lub C ++, więc skupię się na tym.
Nawet zanim szablony stały się popularne, wolałem używać C ++ niż C do rodzajów plików wykonywalnych, które omawiasz już w połowie lat 90. z dwóch bardzo prostych powodów: polimorfizmu obiektów i RAII .
Użyłem polimorficznych obiektów C ++ do wszelkiego rodzaju interesujących rzeczy. Na przykład pracowałem nad wbudowanym systemem Linux z nakładkami bufora ramek na procesorach OMAP i XScale ARM. Dwie architektury sprzętowe mają różne funkcje nakładania z bardzo różnymi interfejsami API. Użyłem wspólnej wirtualnej klasy podstawowej „Nakładka”, aby wyświetlić wyidealizowany widok nakładek, a następnie napisałem klasy „OmapOverlay” i „XScaleOverlay”, które zostały odpowiednio utworzone w czasie wykonywania, w zależności od architektury, na której wykrył kod.
Aby nadmiernie uprościć, RAII jest pomysłem, że alokujesz zasoby podłączone do obiektu podczas konstruktora obiektu, a może później w trakcie życia obiektu, a zasoby są zwalniane lub zwalniane w destruktorze obiektu. To naprawdę miłe w C ++, ponieważ obiekty, które są zmiennymi automatycznymi, są niszczone, gdy wykraczają poza zakres. Dla kogoś, kto jest równie kompetentny w C i C ++, o wiele łatwiej jest uniknąć wycieków zasobów i pamięci w C ++. Nie widzisz również zbyt wiele kodu C ++ z bardzo popularnym memem C etykiety na końcu funkcji poprzedzającej kilka wywołań do
free()
, a różnegoto
w bloku funkcyjnym tam skaczą.Jestem w pełni świadomy, że możesz robić wszystkie te rzeczy za pomocą C - to po prostu dużo więcej pracy, znacznie więcej linii kodu, a to, co kończysz, jest o wiele brzydsze i często trudniejsze do zrozumienia. Istnieje kod polimorfizmu na wszystkich wewnętrznych elementach X serwera , a człowieku, jest niezręcznie i dziwnie i często trudny do prześledzenia.
Dużo pracuję również z technologiami GNOME, takimi jak GTK + i Clutter, z których wszystkie są napisane w C przy użyciu systemu GObject. GObject jest jak system obiektowy C ++ ze zdjętą ładną osłoną i odsłoniętymi wszystkimi brzydkimi elementami wewnętrznymi, i zwykle wymaga pół tuzina wierszy kodu, aby zrobić to, co zrobiłaby jednowierszowa metoda wywołania metody C ++. Obecnie piszę trochę
ClutterActors
i chociaż matematyka jest naprawdę interesująca, ciągle myślę: „To wszystko byłoby o wiele bardziej zwięzłe i zrozumiałe w C ++”.Często też myślę: „Wiesz, gdybym pisał to w C ++ zamiast C, byłbym w salonie, oglądając MythBusters z żoną, zamiast siedzieć w biurze o 21:00”.
źródło
C ++ jest mniej więcej tak szybki jak C (niektóre rzeczy są szybsze, niektóre wolniejsze) i oferuje lepsze abstrakcje i organizację. Klasy działają podobnie jak prymitywne typy, pozwalając na użycie dużej ilości kodu bez konieczności pamiętania o tym. Przeciążenie operatora i szablony umożliwiają pisanie kodu, który działa lepiej w przypadku zmiany reprezentacji danych. Wyjątki mogą umożliwić łatwiejszą obsługę błędów. Kompilatora można używać do sprawdzania większej liczby rzeczy w czasie kompilacji.
Cena za to jest dość nieprzyjemną krzywą uczenia się i łatwiej jest popełnić w niej subtelne błędy niż w większości innych języków, które znam.
Nie mogę więc powiedzieć, czy warto nauczyć się tego, co robisz teraz. Z pewnością można sobie poradzić z kombinacjami Pythona lub Perla i C, ale C ++ oferuje zarówno abstrakcję, jak i wydajność w jednym trudnym do przyzwyczajenia pakiecie.
źródło
restrict
służy do wykluczania optymalizacji aliasingu, więc jak to przyspiesza działanie ? a czym jest „parametr tablicy statycznej”? i jak „styl” wpływa na wydajność?T (&arr)[n]
lubstd::array<T, n>
- będzie musiał to jeszcze zbadać, ponieważ nie ma tam wielu informacji. Ma to sens w przypadku inteligentnych wskaźników, zdecydowanie dobry przykład. Jeśli kodujemy na równych zasadach, nie wykorzystalibyśmy wyjątków, więc żaden potencjalny koszt nie zostałby poniesiony ... jednak podejrzewam, że możesz mieć na myśli aluzje, w jaki sposób, kiedy biblioteki stron trzecich wejdą na obraz, wiele założeń Są zagrożone.Uważam C ++ za język lat 90., język minionej epoki.
Wtedy był duży, ponieważ oferował konstrukcje i mechanizmy języka wyższego poziomu przy niższych kosztach pod względem wydajności. Było to uniwersalne narzędzie do opracowywania wszystkiego, od aplikacji książki adresowej po oprogramowanie awioniki, co zainspirowało szał OO. OOP rozwiązało głód i AIDS, i tak, obwiniam C ++ za próbę prania mózgu pod koniec lat 90., kiedy zacząłem programować, że żaden język inny niż OO nie jest wart nauki.
Teraz, gdy sprzęt jest tak zaawansowany i pojawiły się nowsze, pojawiły się nowoczesne języki, nie widzę, aby C ++ pozostawał odpowiednim wyborem dla większości programowania aplikacji, z wyjątkiem oprogramowania wymagającego intensywnych obliczeń, w którym wciąż potrzebujesz pewnej abstrakcji (gry, symulacje fizyki, systemy CAD itp. ). Tego drugiego można uniknąć, jeśli napiszesz kompaktowy, modułowy silnik w języku C, a logikę aplikacji wyższego poziomu przekażesz porządnemu językowi skryptowemu.
Jeśli chcesz przejść do metalu, użyj C, a kiedy chcesz przejść na wyższy poziom, zrób to w nowoczesnym języku, który nie reklamuje enkapsulacji, podczas gdy możesz swobodnie zmieniać każdy bajt za pomocą wskaźnika.
źródło
Według Linusa nie:
źródło
Nie sądzę, żeby istniał jakiś ważny powód, aby używać C ++. Jeśli chcesz programować OO, możesz zamiast tego użyć Pythona i napisać części wymagające szybkiej wydajności w C.
EDYCJA: Istnieją inne języki, które dobrze współpracują z C, więc jeśli nie lubisz Pythona, istnieją alternatywy.
źródło
Czy istnieje powód do używania C ++? Na pewno.
Niektóre osoby mogą po prostu preferować używanie C ++ niż inne opcje. Pytanie, czy istnieje powód do używania C ++, jest jak pytanie, dlaczego musimy mieć setki smaków lodów. Nie każdy lubi po prostu trzymać się wanilii.
Jeśli programiści są już bardzo biegli w posługiwaniu się C ++, pytanie może nie brzmieć „dlaczego z niego korzystać?”, A raczej „dlaczego nie?”. Wydaje się, że w SO dzieje się teraz modna anty-C ++, ale wierzcie lub nie, nie wszyscy się na to zgadzają. Niektórzy ludzie mogą po prostu lubić C ++ lepiej niż inne języki.
Czy C ++ trzeba być wykorzystywane do aplikacji? Oczywiście nie. Ale to samo dokładne pytanie można zadać również w innym języku. Jest bardzo, bardzo niewiele przypadków, w których należy użyć określonego języka dla aplikacji.
źródło
Właśnie przechodzę z C na C ++ i myślę, że zysk jest znaczny, nawet jeśli nie potrzebujesz szablonów i OOP.
źródło
Dziwię się, że nikt jeszcze o tym nie wspominał, ale C ++ wprowadził nas do referencji , które prawie rozwiązały wszystkie problemy i pułapki wskaźników:
Zamiast:
O wiele bezpieczniejsze i łatwiejsze ... i bez dodatkowych kosztów.
źródło
Gdzie i dlaczego zwykle będą:
Do programowania po stronie serwera często możesz wybierać spośród wielu różnych języków, skompilowanych lub zinterpretowanych. Zwykle wybór języka zależy od platformy, na której Ty lub Twój zespół będziecie najbardziej efektywni. Lub jeśli nie masz jeszcze zespołu, dostępność umiejętności na rynku.
Na marginesie, naprawdę nie rozumiem decydowania o użyciu C / C ++ na podstawie wydajności (tylko), ponieważ wiele języków skryptowych jest rozszerzalnych z C / C ++. Korzyści płynące z szybkiego języka programowania w połączeniu z możliwością migracji wolnych części do rozszerzeń C / C ++. Z pewnością jeśli twoje programowanie systemów, w których liczy się każda operacja, jest zrozumiałe, ale w większości aplikacji nie rozumiem tego.
źródło
C ++ vs Python vs Perl nie można łatwo ocenić. To zależy od projektu i wymagań.
C ++ ma arsenał narzędzi z dawnych czasów, działających na wielu platformach. Ale bolesne jest rozpoczynanie przechodzenia przez strumienie, aby po prostu przekazać String do liczby całkowitej i odwrócić.
Z drugiej strony, C ++ ma okropne problemy z zależnością od bibliotek. Gdy skompilujesz coś w GCC X lub VC ++ Y, nie możesz polegać na tym, że kod będzie działał w następnej wersji tych narzędzi. To samo piekło jest w systemie Windows, to samo piekło jest również w systemie Unix.
Perl czerpie swoją moc ze świata uniksowego, ale przede wszystkim jako narzędzie do wyrażeń regularnych. To jest używane przez większość czasu. Wraz z kilkoma poważnymi narzędziami, których nawet Java nie może zrobić w normalny sposób (sprawdź, jak przesłać plik na serwer WWW), Perl „po prostu zrób to”.
Python jest łatwym, elastycznym i dynamicznym językiem. Skrypt jest tak łatwy, że możesz wysłać liczbę całkowitą do funkcji, oczekuje łańcucha, ale możesz uzyskać wynik! Nieoczekiwany, ale wynik. Dlatego programista musi być bardzo ostrożny. IDLE oferuje pewne debugowanie, ale kiedy masz TELNET do systemu lub SSH'ed na trzech poziomach w dół i chcesz znaleźć swój problem, debugger nie będzie tam, aby stać obok ciebie. Ale potrafi szybko wykonać świetną pracę matematyczną.
Java to ekosystem modnych słów, obcych technologii i wielkich słów, a gdy chcesz po prostu przesłać plik na serwer WWW, możesz to zrobić tylko wtedy, gdy serwer ma JSP . Jeśli chcesz wywoływać biblioteki systemowe lub funkcje systemowe, takie jak monitorowanie, okazuje się, że musisz dużo wykopać. A może, aby dotrzeć do JNI i OK… myślisz wtedy… „Dlaczego, Panie?”
Poza tym Java jest świetnym narzędziem dla pakietów biznesowych, a wielowątkowość bardzo mi się podobała.
Szybko utwórz program i pokaż swoje CV: „Och, ja też wiem, że ta technologia” i twój niedoszły szef, bądźcie zaskoczeni! Chociaż technologia może nie być potrzebna ... (OK, ludzie, nienawidzę Spring Framework ....)
źródło
Wybierając język, należy pamiętać o korzyściach płynących z jego używania oraz o tym, ile czasu to zajmie.
Główną ideą między językami takimi jak Python i Perl jest zrobienie więcej przy mniejszym czasie pracy, ale przy większej ilości procesora. W rzeczywistości poświęcisz więcej czasu na kodowanie skryptu python lub perl, niż zostanie on wykonany, ale rozumiesz.
Zaletą C / C ++ jest to, że są szybkie, ale kosztem składni i silnego pisania: musisz wiele zrobić sam, aby komputer nie wybrał tego w czasie kompilacji.
Kiedy tworzysz kod, niektóre wiersze będą uruchamiane o wiele bardziej niż inne, a te wiersze stanowią problem. Z drugiej strony cała reszta kodu, nad którą spędziłeś dużo czasu, jest wykonywana znacznie rzadziej. Być może słyszałeś o tym, ale jest to niesławna reguła 80/20 i nie będziesz w stanie ominąć takiej reguły.
Rozwiązaniem tego problemu jest użycie prostszego języka (przez łatwiejsze rozumiem bardziej przyjazny dla programistów: mniej pisania, leniwa interpretacja, wiele wcześniejszych procedur i innych rzeczy itp.) Do zrobienia całego kodu.
Zrobisz to tak szybko w porównaniu do tego, co zrobiłbyś z C lub C ++, zajęłoby to znacznie więcej bólu mózgu.
Twój program będzie działał wolno, ale dzięki profilerowi izolujesz część, która jest uruchamiana przez 80% czasu i robisz to za pomocą C lub C ++.
W ten sposób zaoszczędziłeś dużo czasu, a Twój program jest tak samo wydajny, szybki, ma znacznie mniejsze szanse na wyciek pamięci i zaoszczędziłeś czas.
Języki skryptowe zostały zaprojektowane po stronie programisty, ale optymalizacja jest nadal możliwa. Oczywiście możesz być magikiem wzorniczym, voodoo STL, a nawet wojownikiem seplenieckim, a może mnichem haskell. Ale języki zmuszają nas do rozmawiania z komputerami, języki nie są stworzone dla nas, aby być komputerami!
źródło
Linux? Co powiesz na „obiektowy Pascal” lub „D”?
Propozycje:
źródło
Używam C ++ nazywa się C z klasami!
źródło
W rzeczywistości istnieje jedna odpowiedź na wszystkie tak utworzone pytania. Najlepszym powodem, aby użyć technologii X zamiast technologii Y (gdzie X i Y są mniej więcej na tym samym poziomie [jak prawie wszystkie współczesne języki programowania]) jest to, że już znasz X i nie znasz Y.
(ale po przybyciu Haskella nie było powodu, aby używać czegokolwiek innego)
źródło
Nie, wcale nie. Jeśli nie potrzebujesz wydajności i istnieje biblioteka, której możesz użyć w innym języku, nie przejmuj się C / C ++. Robię to teraz tylko wtedy, gdy kieruję reklamy na systemy wbudowane, które nie mogą (łatwo?) Obsługiwać języków. Czasami używam C, ponieważ piszę wtyczkę, ale naprawdę nie.
Jednak nie używałbym Pythona, Perla itp., Aby uniknąć używania C. Moje preferencje to w rzeczywistości C #, ponieważ lubię dobrą bibliotekę (która jest siłą .NET) i lubię języki o typie statycznym. Boo to dobra alternatywa. Ale tak naprawdę Haskell , OCaml , D , ML i takie są w porządku.
źródło