Dlaczego C ++ nadal preferuje tworzenie ciężkich aplikacji GUI zamiast najnowszych dynamicznych języków? [Zamknięte]


46

Widzę, że większość aplikacji, które zawierają ciężką treść GUI, jest zwykle rozwijana w C ++. Większość gier / przeglądarek jest napisana w C ++.

Czy nie możemy po prostu opracować lepszych aplikacji GUI z najnowszymi dynamicznymi językami? Wiem, że Java nie byłaby dobrym wyborem. Ale co z takimi językami jak python, które są natywnie zbudowane na C? Czy najnowsze języki nie powinny być lepsze niż ich przodkowie? Dlaczego wciąż wolimy starszą wersję C ++ od najnowszych języków?

Chciałbym również wiedzieć, co jest odpowiedzialne w C ++ za lepszą szybkość przetwarzania GUI? Z drugiej strony, czego brakuje w innych najnowszych językach?


22
Jeśli uważasz, że Java jest językiem „dynamicznym”, to jesteś głęboko zdezorientowany, co oznacza to słowo w tym kontekście.
Mike Baranczak

15
@Mike Baranczak: To długa historia. Zasadniczo w Stanford był projekt badawczy, później w Sun Research o nazwie Self. Self to język programowania w rodzinie Smalltalk, który jest prostszy, mocniejszy, bardziej ekspresyjny i co najważniejsze znacznie bardziej dynamiczny niż Smalltalk. Ponieważ został zaprojektowany jako język programowania do opracowywania całych systemów (jak wszystkie dialekty Smalltalk), w tym (ale nie wyłącznie) aplikacji komputerowych, serwerów, systemów operacyjnych, sterowników urządzeń, sam musiał być niesamowicie szybki. Tak więc zespół Self wymyślił całą masę nowych ...
Jörg W Mittag

15
... techniki optymalizacji, a kiedy Self VM pojawiło się w 1987 roku (a tym bardziej w drugiej generacji w 1992 roku), było szybkie. To było szybsze niż jakakolwiek inna maszyna wirtualna Smalltalk. System Self został dostarczony z wieloma przykładowymi kodami, a jednym z tych przykładów był interpreter Smalltalk napisany w Self, a nawet to było szybsze niż jakakolwiek inna maszyna wirtualna Smalltalk. Self był szybszy niż wiele implementacji C ++ w tym czasie, a nawet konkurował z C. Cóż, rozumiesz. To było szybkie . Jednak Sun zdecydował, że nie potrzebują obiektowego języka programowania ani szybkiej maszyny wirtualnej, więc ...
Jörg W Mittag

15
... w zasadzie umarł z głodu projekt Self, wysychając fundusze. Kiedy inżynierowie Self VM opuścili firmę Sun z frustracji, szybko zostali porwani przez startup Smalltalk o nazwie LongView (bardziej znany pod nazwą ich najbardziej produktu, opcjonalny system statyczny dla Smalltalk: StrongTalk). LongView wiedział, że nigdy nie będą w stanie sprzedawać statycznego pisania na Smalltalk, więc pomyśleli, że wolą sprzedać najszybszy Smalltalk na planecie, a następnie włączyć StrongTalk do pakietu w rodzaju gry typu koń trojański. Zdali sobie również sprawę, że żaden z fajnych ...
Jörg W Mittag

15
... optymalizacje wykonane przez Self VM były w jakikolwiek sposób specyficzne dla Self, ale dotyczyły praktycznie dowolnego języka obiektowego (lub nawet dowolnego języka w ogóle ). Inżynierowie Self VM rozpoczęli pracę nad maszyną wirtualną Smalltalk o nazwie Animorphic VM. Ponownie, Animorphic VM była niesamowicie szybka (i nadal tak jest, mimo że baza kodów nie została dotknięta przez około 15 lat, nadal może konkurować z nowoczesnymi wysokowydajnymi Smalltalks, JVM i .NET, szczególnie jeśli weźmiesz biorąc pod uwagę, że zużywa o wiele mniej zasobów niż te, ponieważ został zaprojektowany na 486 z 20 megapikselami ...
Jörg W Mittag

Odpowiedzi:


58

Jestem jedną z osób, które piszą aplikacje GUI C ++ (głównie dla systemu Windows). Dokładnie z Qt. Moje powody:

  • Lubię C ++. Jestem freelancerem i zazwyczaj mogę wybrać swoje narzędzia (na szczęście!)
  • W środowisku zarządzanym możesz mieć trudności z koniecznością użycia niezarządzanego kodu (długo rozwijane deklaracje WinAPI w C #, czy ktoś?)
  • Mniej zależności, które można łatwiej wdrożyć
  • Większa kontrola nad wszystkim.
  • RAII (vs. GC). I nawet jeśli przydzielam new, rzadko kiedy deletecoś wyraźnie, bo używam inteligentnych wskaźników lub QObjecthierarchii.
  • C ++ jest obecnie bardzo ekscytujący, nie mogę się doczekać, aż kompilator będzie w pełni obsługiwał nowy standard.
  • Szybkość (tylko na końcu listy. Wiem, że to nie jest tak ważne dla samego GUI, ale zwykle jest szybsze, ponieważ programy C ++ nie cierpią z powodu narzutu, który powodują środowiska uruchomieniowe, kompilacja bajtów JIT i podobne technologie program.)

Jak widać, są to głównie osobiste preferencje. Uważam, że ważne jest, aby moja praca była przyjemna, a C ++ mi to zapewnia.


11
+1 Prędkość jest zdecydowanie najważniejszym powodem tutaj, oprócz osobistych preferencji. Lubię jednak „C ++ jest obecnie bardzo ekscytujące”. Aby odpowiedzieć na pytanie , a nie @ Tamás Szelei: Jasne, obliczenia zmieniają się szybko dzięki nowym pomysłom, paradygmatom, technologiom, produktom, ale najnowsze i najlepsze nie są zaletą. C ++ istnieje już od jakiegoś czasu i nie oznacza to, że jest przestarzały, ma raczej długą historię w porównaniu z nowszymi technologiami. Oryginalny tekst Stroustrupa (książka wynalazcy) jest ciężki, ale są też fajne książki innych - na przykład oreilly.com.
therobyouknow

1
@Tarnas Myślę, że „zawsze będzie szybciej” jest nieco zawężony / autorytatywny, ale niewystarczający, aby uzasadnić opinię negatywną ...
Max

2
Jako anegdotyczne wsparcie: brałem udział w różnych projektach tworzenia GUI o znacznych rozmiarach w systemie Windows przy użyciu C ++ i JavaScript. Brałem również udział w różnych projektach konsol do gier w C ++ i JavaScript. W obu przypadkach było znacznie więcej problemów z prędkością i pamięcią w JavaScript.
Gort the Robot

2
Spóźniasz się na imprezę, ale czy możesz rozwinąć kwestię „zależności, które są trudniejsze do wdrożenia”?
weberc2

2
Używam C ++ od ponad 20 lat. Wiele nowych i wspaniałych funkcji zostało dodanych od 11, 14 i 17. Możesz prawie używać C ++ jako języka skryptowego i nadal korzystać z dużej prędkości. Kiedy pracuję z DUŻYMI ​​danymi, prawie muszę używać C ++, ponieważ każdy inny język będzie wolniejszy o 10-1000.
Kemin Zhou,

32

Ponieważ prędkość ma znaczenie.

  • Gry używają C ++ do podstawowych zadań, w których ważna jest wydajność. Używają języków dynamicznych do zadań skryptowych, w których ważna jest elastyczność.

  • Desktopowe aplikacje GUI : na przykład Visual Studio jest napisane w .NET, a nie w natywnym C ++. Wydaje się, że działa całkiem dobrze dla IDE, ponieważ samo IDE nie musi wykonywać wielu zadań wymagających dużej wydajności. (Kompilator, linker i inne narzędzia niekoniecznie są napisane w .NET - choć jak wskazuje wawa w komentarzu, niektóre wydają się być (np. VB.NET))

  • Przeglądarki też muszą być szybkie. W końcu stanowią one dodatkowy system operacyjny. Z drugiej strony możesz argumentować, że duże części Firefoksa są w rzeczywistości „napisane” w javascript, ponieważ framewor Mozilla wydaje się w dużej mierze zależeć od javascript.

Podsumowując: nie powiedziałbym, że C ++ jest koniecznie preferowany, ale jeśli masz wąskie gardło w wydajności, musisz zbliżyć się do metalu, a następnie spotkać C ++ (cóż, lub C). Czasami łatwiej będzie zrobić wszystko w C ++ - jednym języku.


1
+1 Najlepsza odpowiedź: Chodzi wyłącznie o szybkość jako główny powód używania C ++. Nawet sam Microsoft przyznaje, że C ++ jest najlepszy pod względem wydajności w porównaniu do C # i Visual Basic - zobacz ich na swoich stronach Visual Studio. Bardzo bliska jest przenośność - jeśli korzystasz z bibliotek międzyplatformowych, takich jak Qt. Najlepsza odpowiedź również dlatego, że jest obiektywna, a nie subiektywna.
therobyouknow

2
Twój drugi punkt nie jest do końca prawdą. Kompilator VB.NET jest napisany w VB.NET, a kompilator F # jest napisany w języku F #. Kompilator C # nie jest, ale z tego, co wydano na temat projektu Roslyn, myślę, że kompilator C # jest przepisywany w C #.
Wesley Wiser

5
GUI Visual Studio (chrom) jest napisane (od vs2010) w języku C # i WPF. Eksplorator rozwiązań, system kompilacji, przeglądarka kodów i zestaw narzędzi są napisane w c # / c ++ w winforms. Kompilator napisany jest w c ++.
Martin Beckett

W przypadku większości aplikacji komputerowych tylko silniki renderowania i układu (tj. Widok) muszą być szybkie. Model i tak nie spędza dużo czasu, a kontroler spędza większość czasu, czekając, aż użytkownik coś zrobi (a niewielu użytkowników może klikać tak często, jak 10 razy na sekundę z dowolną niezawodnością).
Donal Fellows

@MartinBa: Chciałbym zauważyć, że obecny kompilator dla C # i VB (Roslyn) jest napisany w C #.
jmoreno,

17

Aplikacje GUI, które widzisz napisane w C ++, są generalnie wykonywane z powodów starszych. Python (z Qt lub Gtk) jest bardzo opłacalny dla aplikacji GUI, podobnie jak C #, jeśli pracujesz w domu z systemem Windows. Gdy zaczyna coś nowego, albo jest bardzo dużo wolał C ++ ze względu na brak prac instalacyjnych, które ma być wykonane.


5
+1 istniejący kod jest ważny. Rzadko zaczyna się całkowicie od zera podczas opracowywania nowych programów

7
w jaki sposób używanie Pythona z Qt jest bardziej preferowane niż używanie C ++ z Qt? Gdybym miał dzisiaj rozpocząć nowy projekt, nadal używałbym C ++ jako GUI. Ponieważ: a) to wiem, b) dobrze spełnia swoją funkcję. To, że C ++ istnieje już jakiś czas, nie czyni go „przestarzałym”.
TZHX

2
@TZHX: „To, co wiem” to realny argument. Jeśli nie zostanie to podane, nie trzeba już zajmować się zarządzaniem pamięcią, co stanowi ogromny wzrost wydajności i może zrównoważyć wysiłek związany z nauką języka Python nawet dla jednego projektu. Innym powodem używania Pythona może być wieloplatformowość - w C ++ musisz zachować ostrożność i podjąć specjalne środki, podczas gdy Python prawdopodobnie po prostu działa.
tdammers

4
Nie widzę żadnych korzyści z używania PyQt zamiast Qt z C ++ dla kogoś, kto zna C ++.
BenjaminB

13
C ++ też prawdopodobnie będzie działał. W Pythonie musisz się martwić, którą wersję Pythona zainstalował użytkownik, lub martwić się o dołączenie go do pakietu. Naprawdę nie ma zbyt wiele pracy do „opieki nad pamięcią”, chyba że popełnisz głupie błędy. Myślę, że wiele osób traktuje „zarządzanie pamięcią” jako dużą przeszkodę w pracy z C ++, nie wiedząc, jak wiele to robi.
TZHX

16

Ponieważ bez względu na to, ile testów wydajności .NET i podobne tłumy pokazują, bez względu na to, jak blisko są testów wydajności, w końcu aplikacja C ++ wychodzi na wierzch. Jest szybszy przy zimnym rozruchu, jest szybszy i ma więcej sposobów na ulepszenie.

Słyszałem wiele dowodów na początkowych etapach projektu, że .NET jest właściwą drogą, ale kiedy już zostanie wybrany, zawsze kończą się ciężką gratką.

Ponadto C ++ jest obecnie dość bezpieczny i łatwy w użyciu, szczególnie w ramach takich jak Qt lub WTL.


2
+1: „Ponadto, C ++ jest obecnie dość bezpieczny i łatwy w użyciu, szczególnie z frameworkami takimi jak Qt ...” Całkowicie się zgadzam: Myślę, że dużą siłą nie jest (tylko) C ++ sam w sobie, ale fakt, że (1 ) jest skompilowany do natywnego kodu, (2) ma rozsądny zestaw funkcji (OOP, szablony), (3) ma bardzo dobre frameworki, takie jak Qt. To rekompensuje fakt, że język jest dość duży i trudny do nauczenia: gdy opanujesz przyzwoity podzbiór języka i kilka dobrych bibliotek, możesz być naprawdę produktywny.
Giorgio,

10

Większość silników gier jest kodowana w C ++. Również wiele silników przeglądarek jest kodowanych w C ++. Ale GUI przeglądarki jest często kodowane przy użyciu lekkiego skryptu (JavaScript, Python). Z wyjątkiem silnika Source, większość silników gier używa także języków skryptowych (takich jak Lua lub Python). [dla odniesienia: lista skryptowanych gier Lua ]

Weź również popularną bibliotekę GUI C ++, taką jak Qt. W bieżącej wersji (4.7) używa QML dla GUI. QML to w zasadzie JavaScript z powiązaniami Qt.

Więc naprawdę nie ma C ++ w porównaniu z dynamicznymi językami, jest mieszany.


[Wymagany cytat]. Wiem, że wiele gier używa języków skryptowych, aby użytkownicy mogli je rozszerzać, ale o ile wiem, tak naprawdę nie ma wielu gier używających języków skryptowych ze względu na ich funkcjonalność binarną wydania.
ProdigySim

1
@ProdigySim: Znam kilka takich. Z góry mojej głowy, World of Warcraft (Lua + XML), seria Naughty Dog's Uncharted (Lisp), seria Unreal (UnrealScript), gry oparte na silnikach Torque i Unity, Dungeon Siege, NeverWinter Nights i wiele innych. Gry oparte na danych stają się normą, w której gospodarz skryptów przejmuje większość (jeśli nie wszystkie) funkcje interfejsu użytkownika i stan gry od góry do dołu.
greyfade

@ProdigySim: nawet jeśli jest ukryty przed zwykłymi użytkownikami, nie oznacza to, że wewnętrznie nie używają silników skryptowych. Zasadniczo twórcy gier mają dwie opcje - utwórz własny język skryptowy dla modeli lub użyj jednego z języków ogólnego przeznaczenia. Lua jest szczególnie dobra do gier, ponieważ ogólnie jest dobra do systemów czasu rzeczywistego.
vartec

Silnik źródłowy używa języka skryptowego Squirrel.
cubuspl42

6

Pierwszym powodem będzie: (stary) nawyk

Drugi powód: mniejsza niezawodność na maszynach wirtualnych, tłumaczach, które należy zainstalować itp.

I wciąż istnieje kilka doskonałych IDE do opracowania kodu w C ++.


1
wciąż doskonałe IDE”. Twierdzę, że Visual Studio i Eclipse są najnowocześniejsze i już od dłuższego czasu.
JBRWilkinson

@JBRWilkinson: Nie powiedziałem, że inny język też ich nie ma.
Roalt

6

Powodem jest to, że masz znacznie większą kontrolę nad wszystkim, co się dzieje. Jeśli miałbyś pisać Photoshop w języku C #, miałbyś poważne problemy z wydajnością w przypadku niektórych zadań. W języku niższego poziomu z większą kontrolą możesz wybierać skróty i optymalizować je tam, gdzie jest to potrzebne, w przypadku bardziej intensywnych rzeczy. Oczywiście zakłada to, że używasz C ++ w niezarządzanym kodzie, a nie C ++ w .NET.

Zobacz tutaj szybki przykład.


2
Adobe Lightroom, który jest zasadniczo podzbiorem Photoshopa, jest napisany w Lua.
Jörg W Mittag

4
@ Jörg: a reszta to C ++. w rzeczywistości jest to prawdopodobnie najlepsza dostępna kombinacja, C ++ dla fundacji, Lua dla reszty (chociaż nadal wolę C niż C ++ dla rzeczy niskiego poziomu).
Javier

2
@Javier: Tak, Lightroom to w zasadzie algorytmy manipulacji obrazami z Photoshopa (które są prawdopodobnie napisane głównie w asemblerze MMX / SSE) i SQLite3 (który jest napisany w prehistorycznej wersji ANSI C dla przenośności) sklejonych razem z Luą. Adobe opracowało także własne Lua IDE, całkowicie w Lua. Czy ktoś wie, jakiego zestawu narzędzi graficznych używa? AFAIR Photoshop wyprzedza prawie wszystkie nowoczesne zestawy narzędzi, więc prawdopodobnie jest to coś domowego?
Jörg W Mittag

4
bez obrazy, ale jeśli uważasz, że ANSI C jest prehistoryczny, czytasz nieprawidłowe próbki kodu
Javier

6

C ++ jest typowany statycznie. Pozwala to wcześniej zoptymalizować wykonanie kodu, kompilator dopasowuje swoje abstrakcje do dostępnego procesu systemowego na danej platformie. Do tej pory dynamiczne języki wymagały dodatkowej warstwy oprogramowania (interpretera), która spowalnia dostęp do zasobów systemowych.


4

Większość podanych powodów to kwestie techniczne lub „nad stołem” ... oto powody biznesowe lub „pod stołem”:

rozpowszechnianie skompilowanego kodu vs dystrybucja kodu źródłowego. podczas programowania w c / c ++ dystrybuujesz pliki binarne. jeśli rozwijasz się w jednym z nowoczesnych języków, rozpowszechniasz źródło. trudno jest sprzedać pomysł zaciemniaczy kierownictwu, którzy muszą odpowiadać akcjonariuszom / inwestorom, więc nie zawracaj sobie głowy.

głupi użytkownicy: przynajmniej w myślach kierownictwa. nadal widzą, że ich użytkownicy ledwo są w stanie kliknąć dwukrotnie plik „setup.exe”. Jeśli włączysz instalację tłumacza ustnego, potrząsną oni głowami na boki.

dawni programiści: większość ludzi z doświadczeniem istnieje od dawna i nie aktualizuje się. programują w C ++, a nie w nowszych językach, ponieważ nie znają nowych języków.


Twierdziłbym, że rozpraszasz kod źródłowy, gdy wypuszczasz aplikację .NET. Spójrz na Visual Studio, większość interfejsu została zaprojektowana z wykorzystaniem formularzy WPF. Niektóre z twoich punktów są oczywiście ważne, większość dzisiejszego zarządzania była wczoraj programistami, zła wiadomość, że wiele dzisiejszych frameworków prawdopodobnie nie będzie ważnych z powodu dzisiejszych zmian w komputerach.
Ramhound

Wiele osób z dużym doświadczeniem zdobyło doświadczenie, aktualizując się. Zwykle nie uczą się nowych, gorących języków (takich jak Pascal na początku lat 80.) tylko dlatego, że są gorące, ale tylko wtedy, gdy mają dla nich zastosowanie lub mają ciekawe pomysły (na przykład Haskell).
David Thornley

4

Rozszerzyłbym zakres problemu z GUI na oprogramowanie, które ma być konkurencyjne. C ++ nie nakłada podatku na platformę docelową, ponieważ dotyczy mocy obliczeniowej, zainstalowanego środowiska uruchomieniowego, ram itp. Będzie więc działał na bardziej ograniczonym sprzęcie klienta niż podobne rozwiązanie napisane w języku zarządzanym / interpretowanym. W przypadku udanego oprogramowania komercyjnego koszty rozwoju (potencjalnie wyższe w przypadku C ++) są amortyzowane przez liczbę sprzedaży.

Dodatkowo C ++ zwykle oferuje bezpośredni dostęp do apis systemowych (takich jak GUI), co daje najlepszą okazję do optymalizacji wykorzystania i odróżnienia się od podobnych rozwiązań.


3

Myślę, że wiele ma to związek z interfejsami API dla zestawów narzędzi GUI. Wszystkie mają API C / C ++, ale nie wszystkie mają (powiedzmy) powiązania Pythona. Czasami same zestawy narzędzi zostały napisane z myślą o C ++, więc nawet jeśli obsługują inne języki, nie obsługują ich w pełni (np. Nie obsługują Pythona tuplejako argumentu).


Och, nie w pełni ich wspierają, ponieważ nie chcą lub nie mają czasu na ich wdrożenie. Nie dlatego, że to niemożliwe.
cubuspl42

2

Jako przykłady podajesz przeglądarki i gry. Oba są aplikacjami krytycznymi pod względem wydajności, więc sensowne jest posiadanie ich w języku niskiego poziomu.

Wiele innych aplikacji jest mniej zależnych od wydajności i można je łatwo napisać w innych językach. W szczególności C # wydaje się być często używany. (I Obj-C, ale tak naprawdę nie kwalifikuje się jako wysoki poziom. Chyba lepszy niż C ++.)

Istnieje jednak pewien brak ram dla najnowszych języków programowania. Na przykład tak naprawdę nie ma realnej natywnej biblioteki GUI dla Pythona. Jasne, możesz użyć PyQt lub PyGtk i działają one dobrze, ale ostatecznie jest to tylko interfejs z kodem C. Ponownie C # (i prawdopodobnie Obj-C) wydaje się być wyjątkiem i być może MacRuby lub IronPython mogą zmienić tę grę.


0

Aby język zastąpił C ++ lub Javę, musi robić to, czego tak bardzo brakuje w tych językach, oprócz wykonywania ich we własnych siłach. Ponadto na te języki zainwestowano ogromne inwestycje. Oznacza to, że na wielu platformach istnieje standardowa biblioteka C ++, z której łatwo mogą korzystać przeglądarki, gry i takie programy. Więc musi być pewna bezwładność. Języki zdejmują się powoli w przeciwieństwie do innych programów.

Jeśli na to spojrzysz, Anaconda (program instalacyjny RedHata) istnieje od około 10 lat, pisana w Pythonie od samego początku. Python nie był tak popularny, gdy Anaconda była nowa.

Google's Go (golang.org) ewoluuje bardzo szybko. Kompilator nie został jeszcze załadowany. Aby jego popularność mogła wystartować, jego biblioteka musi się ustabilizować, kompilator powinien zostać załadowany i więcej osób musi go używać. Słyszałem, że jeden program produkcyjny poza Google jest napisany w Go i według doniesień nie miał jeszcze przestojów w swoim życiu przez nieco ponad rok.


1
Faktycznie, nie jest komercyjnym kompilator Go dla Windows, który jest napisany w Go, więc nie jest bootstrapped kompilator Go. (Nadal jest w zamkniętej wersji beta.)
Jörg W Mittag

Och, więc nie miałem kontaktu. Dziękujemy za poinformowanie :)
vpit3833

2
Nazywa się erGo i jest produkowany przez firmę o nazwie Newquist Solutions .
Jörg W Mittag
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.