Jaka jest dzisiaj rola C ++?

41

Obecnie jestem studentem informatyki i zastanawiam się, co jest dziś ważne w C ++, do czego służy? Ukończyłem podstawowy kurs języka C ++ na moim uniwersytecie, ale nie mogę sobie wyobrazić, gdzie mogę wykorzystać moją wiedzę i w jakim kierunku powinienem uczyć się języka C ++.

Innymi słowy, czego powinienem nauczyć się, jak zostać programistą C ++?

Obecnie uczę się języka Java tylko dlatego, że nie widzę jasno, w którym obszarze C ++ może być dziś przydatny, ale wyraźnie wiem, jaką pracę będę wykonywać jako programista Java. Ale nadal mam nadzieję, że C ++ nie jest martwy.

Hades
źródło
2
To jest mój punkt widzenia. C ++ jest bardzo przydatny w sytuacji czasu rzeczywistego (i gier wideo). Używam również C ++ do aplikacji komputerowych (nie zapomnij o Qt) ze względu na wydajność.
hosomaki
1
@stign IMO prawdopodobnie umrze, ponieważ prawdopodobnie nadejdzie czas, kiedy wszystkie języki będą przestarzałe (prawdopodobnie z powodu ogromnych zmian w używanym sprzęcie).
Kenneth
17
C ++ jest daleki od śmierci (piszę w nim nowy kod każdego dnia), a jeśli COBOL jest jakąkolwiek wskazówką, będę miał pracę przez wiele, wiele lat.
Michael Kohne
2
Spójrz na The Programming Languages ​​Beacon i wyciągnij własne wnioski: lextrait.com/vincent/implementations.html
Nemanja Trifunovic
1
Ostatnio obejrzałem kilka interesujących filmów na kanale 9 Microsoftu . Microsoft wydał miliony na badania rynku i na podstawie swoich badań mówi o renesansie C ++. Zobacz ten film .
grokus

Odpowiedzi:

57

Zabójczą funkcją C ++ jest zarządzanie zasobami ograniczone do zakresu , SBRM (bardziej znane jako „ RAII ”). Jest to jedyny przemysłowy język programowania oparty na tej koncepcji. W C ++ czasy życia wszystkich obiektów są dokładnie znane, a (dobrze napisane) programy C ++ gwarantują, że zasoby są pozyskiwane i zwalniane w całkowicie deterministyczny sposób. Dla porównania, języki wyrzucane przez śmieci lub w inny sposób zarządzane nie dają żadnych takich gwarancji; w rzeczywistości obiekty w tych językach mogą pozostać po zakończeniu ich życia.

To jest powód, dla którego C ++ jest stosowany w finansach, grach wideo, wysoko wydajnych systemach wbudowanych i systemach czasu rzeczywistego, transporcie, produkcji i innych branżach, w których ważny jest determinizm i precyzja. Nie ma alternatywy.

To prawda, że ​​był używany do znacznie większej liczby zadań niż te, a zadania te są tracone do C #, Pythona i innych bardziej odpowiednich języków, ale to nie wpływa na jego niszę podstawową.

Cubbi
źródło
20
Każdy, kto korzysta z malloc w C ++, chciałbym uderzyć się w głowę twardym przedmiotem. Istnieje również mniej znana funkcja operatora neww C ++, nazywana umieszczaniem. Pozwala ponownie wykorzystać aktualnie zajęte miejsce w pamięci. Więc jeśli ktoś chciał uniknąć (lub zminimalizować) fragmentację, może to teoretycznie zrobić. A przewidywalność nie jest tym samym deterministycznym.
Tamás Szelei
4
@Apalala C ++ również ma liczenie referencji, ale jest znacznie gorsza niż SBRM pod względem zarządzania czasem życia obiektu. Nie mówię tylko o determinizmie twardym RT, mówię o deterministycznym zachowaniu modelu obiektowego.
Cubbi
4
Kiedy nauczyłem się C ++, RAII nie była szczególnie znana; Nauczyłem się nowego, usuwania i zarządzania wskaźnikami opartego na mózgu. Nie sądzę więc, aby można go scharakteryzować jako „zbudowany wokół koncepcji”. Biblioteki i inne struktury wsparcia, które są obecnie używane, mogą mieć, ale nie podstawowy język lub składnię.
jprete
7
@jprete Prawda, że ​​wiele mocnych stron C ++ zostało odkrytych, a nie zaprojektowanych. Ten post dotyczy języka po 2005 roku.
Cubbi
5
RAII został zaprojektowany w C ++. Ale większość programistów C ++ po prostu pisała C, zastępując Malloc nowymi i bezpłatnymi usuwaniem.
kevin cline
40

Istnieje kilka rynków dla C i C ++ (według mojego, choć ograniczonego zrozumienia)

  1. Istniejący kod C i C ++ mają jedne z największych istniejących baz kodu. Tego rozmiaru kodu nie można po prostu wyrzucić, ponieważ pojawił się „nowy gorący język”. Powiązania C są w zasadzie standardem interakcji między językami na większości platform, więc możliwość tworzenia (przynajmniej) bibliotek opakowujących w C lub C ++ jest przydatna.
  2. Aplikacje o wysokiej wydajności (np. Finansowanie o wysokiej częstotliwości). C i C ++ nadal osiągają lepszą ogólną wydajność niż większość innych języków programowania. Co najważniejsze, w C ++ często buduje się abstrakcje za pomocą tylko kompilatora, takiego jak szablony, które przenoszą obliczenia z czasu wykonywania na czas kompilacji (przyspieszając ogólną aplikację).
  3. (Podobne do 2) Aplikacje o niskim opóźnieniu. Języki, które działają np. Na CLR lub JVM, często mogą być prawie tak szybkie jak C ++ w zależności od aplikacji, ale nadal trzeba załadować CLR lub JVM do pamięci, zanim Twój program będzie mógł działać. Jest to ważne, jeśli masz trudne wymagania dotyczące uruchamiania. EDYTUJ Z KOMENTARZA : W tym przypadku należy zwrócić uwagę na wymagania dotyczące opóźnień w dowolnym opisie. Języki działające na maszynach wirtualnych rzadko oferują ograniczenia czasowe, ponieważ uruchomienie np. Wyrzucania elementów bezużytecznych nie jest procesem deterministycznym.
  4. Systemy wbudowane. Niektóre systemy wbudowane mają sprzęt do uruchomienia, np. JVM (Android Google (OK, to naprawdę nie jest JVM, ale jest blisko), RIM Blackberry) lub CLR (Windows Phone), ale większość systemów wbudowanych nie ma mocy uruchamiaj języki, które wymagają większego wsparcia dla środowiska wykonawczego niż wymagane dla C lub C ++ (który w ogóle nie obsługuje żadnego środowiska wykonawczego).
  5. Aplikacje ograniczone do wdrażania. Czasami wymaganie instalacji JVM lub CLR jest ogromną przesadą, jeśli cały program ma tylko kilkaset KB. (Np. Większość programów, nad którymi pracuję, musi być wdrożona jako pojedynczy .EXEplik bez żadnego instalatora lub czegoś podobnego; do tego nie ma alternatyw)
Billy ONeal
źródło
2
Opóźnienie przy uruchamianiu nie jest jedynym rodzajem opóźnienia, o które należy się martwić: Trudne wymagania w czasie rzeczywistym mogą być znacznie większym problemem.
greyfade
1
Dodaj wszystko, w czym nie chcesz być zamknięty w konkretnym twórcy (C # lub Objective-C) lub nie chcesz, aby Twój język zniknął w szeregu procesów (Java)
Martin Beckett
@greyfade: Właśnie to miałem na myśli (2), ale zgadzam się, że to nie jest jasne. Edytowane. @Martin: Chociaż uważam, że jest to dobra siła dla C ++, nie sądzę, że odpowiada na pytanie - na jakich rynkach powszechnie używa się C ++. Również nie sądzę, żebym zadzwonił do C # zablokowanego dla konkretnego producenta, gdy istnieje licencjonowana wersja CLR <S> BSD </S> (OOPS: It's LGPL) (mono).
Billy ONeal
1
Również 5. Systemy operacyjne i podstawowe ramy. Możesz dużo zrobić na maszynie wirtualnej, ale maszyna wirtualna wciąż musi zostać zaimplementowana w C i / lub C ++.
Jan Hudec
1
@Jan: Tak. Rzeczy takie jak refleksja i przyjaciele spowodują problemy 2-4. Jedynym podzbiorem, którego naprawdę potrzebujesz, aby napisać śmietnik, będzie jakiś obiekt reprezentujący pamięć fizyczną.
Billy ONeal,