Perché C ++ è ancora preferito per creare app GUI pesanti sugli ultimi linguaggi dinamici? [chiuso]


46

Vedo che la maggior parte delle app che includono contenuti con GUI pesanti sono generalmente sviluppate in C ++. La maggior parte dei giochi / browser sono codificati in C ++.

Non possiamo semplicemente sviluppare app GUI migliori con le ultime lingue dinamiche? So che Java non sarebbe un'ottima scelta. Ma che dire di linguaggi come Python che sono nativamente costruiti su C? Le ultime lingue non dovrebbero essere migliori dei loro antenati? Perché dobbiamo ancora preferire il vecchio C ++ rispetto alle ultime lingue?

E vorrei anche sapere, qual è il responsabile in C ++ per la migliore velocità di elaborazione della GUI? D'altra parte, cosa manca alle altre ultime lingue?


22
Se pensi che Java sia un linguaggio 'dinamico', allora sei profondamente confuso su cosa significhi quella parola in questo contesto.
Mike Baranczak,

15
@Mike Baranczak: questa è una lunga storia. Fondamentalmente, c'era un progetto di ricerca prima a Stanford, poi a Sun Research chiamato Self. Self è un linguaggio di programmazione della famiglia Smalltalk che è più semplice, più potente, più espressivo e, soprattutto, significativamente più dinamico di Smalltalk. Perché è stato progettato come un linguaggio di programmazione per sviluppare sistemi interi (come tutti i dialetti Smalltalk sono), tra cui (ma non solo) applicazioni desktop, server, sistemi operativi, driver di periferica, si, è dovuto al incredibilmente veloce. Quindi, il team Self ha inventato un sacco di nuovi ...
Jörg W Mittag

15
... tecniche di ottimizzazione, e quando il Self VM uscì nel 1987 (e ancor più la seconda generazione nel 1992), fu veloce. Era più veloce di qualsiasi altra VM Smalltalk. Il sistema Self veniva fornito con un sacco di codice di esempio, e uno di quegli esempi era un interprete Smalltalk scritto in Self, e anche quello era più veloce di qualsiasi altra VM Smalltalk. L'auto era più veloce di molte implementazioni C ++ in quel momento, e persino competitivo con C. Bene, lo capisci. È stato veloce . Tuttavia, Sun decise che non avevano bisogno di un linguaggio di programmazione orientato agli oggetti o di una VM veloce, quindi ...
Jörg W Mittag

15
... fondamentalmente ha fatto morire di fame il progetto del Sé prosciugando il finanziamento. Quando gli ingegneri di Self VM hanno lasciato Sun per la frustrazione, sono stati rapidamente raccolti da una startup Smalltalk chiamata LongView (più comunemente conosciuta con il nome del loro prodotto più grande, un sistema di tipo statico opzionale per Smalltalk: StrongTalk). LongView sapeva che non sarebbero mai stati in grado di vendere la tipizzazione statica per Smalltalk, quindi hanno pensato che avrebbero preferito vendere lo Smalltalk più veloce del pianeta e quindi includere StrongTalk nel pacchetto in una sorta di gioco di tipo Trojan Horse. Si resero anche conto che nessuno dei fighi ...
Jörg W Mittag

15
... ottimizzazioni VM Sé ha fatto erano in alcun modo particolare di auto, ma erano applicabili a praticamente qualsiasi linguaggio orientato agli oggetti (o anche solo qualsiasi lingua a tutti ). Quindi, gli ingegneri di Self VM hanno potuto lavorare su una VM Smalltalk chiamata Animorphic VM. Ancora una volta, la VM animorfa è stata incredibilmente veloce (e lo è, in realtà, anche se la base di codice non è stata toccata da circa 15 anni, può ancora competere con i moderni Smalltalks, JVM e .NET ad alte prestazioni, soprattutto se si prende considerando che utilizza molte meno risorse rispetto a quelle, poiché è stato progettato per 486s con 20 mega ...
Jörg W Mittag

Risposte:


58

Sono una di quelle persone che scrivono app GUI C ++ (principalmente per Windows). Con Qt, per essere precisi. Le mie ragioni:

  • Mi piace il C ++. Sono un libero professionista e di solito posso scegliere i miei strumenti (fortunato a me!)
  • In un ambiente gestito potresti avere dei momenti difficili quando devi usare del codice non gestito (dichiarazioni WinAPI a lungo termine in C #, chiunque?)
  • Meno dipendenze che possono essere implementate più facilmente
  • Più controllo su tutto.
  • RAII (vs. GC). E anche se mi allocare con new, raramente mai deletequalcosa di esplicitamente, perché utilizzo i puntatori intelligenti o la QObjectgerarchia.
  • Il C ++ è molto eccitante in questi giorni, non vedo l'ora che un compilatore supporti completamente il nuovo standard.
  • Velocità (solo alla fine dell'elenco. So che non è così importante per la GUI stessa, ma tende ad essere più veloce perché i programmi C ++ non soffrono del sovraccarico che i runtime, la compilazione del codice byte JIT e tecnologie simili aggiungono a il programma.)

Come puoi vedere, si tratta principalmente di preferenze personali. Trovo importante che il mio lavoro sia divertente e C ++ me lo fornisce.


11
La velocità +1 è sicuramente il motivo principale qui, a parte le preferenze personali. Tuttavia, mi piace "Il C ++ è molto eccitante in questi giorni". Per rispondere a chi fa domande , non a @ Tamás Szelei: certo, il calcolo cambia rapidamente con nuove idee, paradigmi, tecnologie, prodotti ma l'ultimo e il più grande non è una virtù. Il C ++ è in circolazione da un po 'di tempo e non significa che sia obsoleto, ma ha una comprovata esperienza rispetto alle nuove tecnologie. Il testo originale di Stroustrup (il libro dell'inventore) è pesante ma ci sono alcuni bei libri là fuori da parte di altri - controlla ad esempio oreilly.com.
therobyouknow,

1
@Tarnas Penso che "sarà sempre più veloce" è un po 'ristretto / autorevole, ma non abbastanza per giustificare un downvote ...
Max

2
Come supporto aneddotico: sono stato coinvolto in diversi progetti per creare GUI di dimensioni significative su Windows usando C ++ e JavaScript. Sono stato anche coinvolto in diversi progetti di console di gioco in C ++ e JavaScript. In entrambi i casi, ci sono stati molti più problemi di velocità e memoria con JavaScript.
Gort il robot

2
In ritardo alla festa, ma puoi approfondire le "dipendenze meno / facilmente implementabili"?
weberc2,

2
Uso C ++ da oltre 20 anni. Molte nuove e fantastiche funzionalità sono state aggiunte da 11, 14 e 17. Puoi quasi usare C ++ come linguaggio di scripting e ottenere comunque i vantaggi della velocità elevata. Quando lavoro con dati GRANDI, devo quasi usare C ++ perché qualsiasi altra lingua sarà 10-1000 più lenta.
Kemin Zhou,

32

Perché la velocità conta.

  • I giochi usano il C ++ per le attività principali, dove le prestazioni sono importanti. Usano linguaggi dinamici per attività di scripting in cui la flessibilità è importante.

  • App per GUI desktop : Visual Studio, ad esempio, è scritto in .NET e non in C ++ nativo. Sembra funzionare abbastanza bene per un IDE, poiché l'IDE stesso non ha bisogno di svolgere molte attività intense. (Il compilatore, il linker e altri strumenti non sono necessariamente scritti in .NET - anche se come sottolinea wawa in un commento, alcuni sembrano essere (ad es. VB.NET))

  • Anche i browser devono essere veloci. Dopotutto sono una specie di sistema operativo secondario. D'altra parte, si può sostenere che ampie parti di Firefox sono in realtà "scritte in" javascript, poiché il framework Mozilla sembra dipendere fortemente da javascript.

Per riassumere: non direi che il C ++ è necessariamente preferito, ma se hai un collo di bottiglia nelle prestazioni devi avvicinarti al metal e quindi incontrare C ++ (bene, o C). A volte sarà più semplice fare tutto in C ++ - una lingua.


1
+1 Migliore risposta: ha a che fare con la velocità come motivo principale per l'utilizzo del C ++. Perfino la stessa Microsoft ammette che C ++ è il migliore per prestazioni rispetto a c # e Visual Basic - guardali nelle loro pagine di Visual Studio. Un secondo molto vicino è la portabilità - se si utilizzano librerie multipiattaforma come Qt. La migliore risposta anche perché è oggettiva piuttosto che soggettiva.
therobyouknow,

2
Il tuo secondo punto non è del tutto vero. Il compilatore VB.NET è scritto in VB.NET e il compilatore F # è scritto in F #. Il compilatore C # non è, ma da quanto è stato rilasciato sul progetto Roslyn, penso che il compilatore C # sia stato riscritto in C #.
Wesley Wiser,

5
Il visual studio gui (il chrome) è scritto (da vs2010) in c # e WPF. Esplora soluzioni, build system, browser di codice e toolbox è scritto in c # / c ++ con winforms. Il compilatore è scritto in c ++.
Martin Beckett,

Per la maggior parte delle app desktop, solo i motori di rendering e layout (ovvero la vista) devono essere veloci. Il modello non tende comunque a trascorrerci molto tempo e il controller trascorre la maggior parte del suo tempo solo aspettando che l'utente faccia qualcosa (e pochi utenti possono fare clic fino a 10 volte al secondo con affidabilità).
Donal Fellows,

@MartinBa: noterei che l'attuale compilatore per C # e VB (Roslyn) è scritto in C #.
jmoreno,

18

Le app della GUI che vedi scritte in C ++ vengono generalmente eseguite per motivi legacy. Python (con Qt o Gtk) è molto praticabile per le applicazioni GUI, così come C # se lavori in una casa Windows. Quando si inizia qualcosa di nuovo, uno dei due è molto preferito al C ++ a causa della mancanza di lavori idraulici che devono essere fatti.


5
+1 codice esistente è importante. È raro iniziare completamente da zero quando si sviluppano nuovi programmi

7
come è più preferibile utilizzare Python con Qt rispetto a C ++ con Qt? Se dovessi iniziare un nuovo progetto oggi, utilizzerei comunque C ++ per la GUI. Perché: a) È quello che so, b) fa bene il lavoro. Solo perché il C ++ esiste da un po 'non lo rende "obsoleto".
TZHX,

2
@TZHX: "È quello che so" è un argomento valido. Se ciò non viene fornito, non dover più occuparsi della gestione della memoria è un enorme aumento delle prestazioni e può compensare lo sforzo di apprendimento di Python anche per un singolo progetto. Un altro motivo per usare Python sarebbe la multipiattaforma - con C ++, devi stare attento e prendere misure speciali, mentre è probabile che python funzioni.
tdammers,

4
Non vedo alcun vantaggio nell'usare PyQt invece di Qt con C ++ per qualcuno che conosce C ++.
BenjaminB,

13
È probabile che anche il C ++ funzioni. Con Python devi preoccuparti di quale versione di Python è stata installata dall'utente o preoccuparti di raggrupparla. Non c'è davvero molto lavoro da fare "occupandosi della memoria" se non si commettono errori stupidi. Penso che molte persone diano "gestione della memoria" come un grande ostacolo a lavorare con C ++ senza sapere davvero quanto differenza faccia.
TZHX,

16

Poiché non importa quanti test delle prestazioni .NET e simili folle mostrano, non importa quanto si avvicinino ai benchmark, alla fine, l'app C ++ esce in cima. È più veloce all'avvio a freddo, è più scattante e ha più modi in cui può essere migliorato.

Ho sentito numerose prove nelle fasi iniziali del progetto secondo cui .NET è la strada da percorrere, ma una volta scelta, hanno sempre finito per essere un grosso cludge.

Inoltre, C ++ al giorno d'oggi è abbastanza sicuro e abbastanza facile da usare, specialmente con framework come Qt o WTL.


2
+1: "Inoltre, il C ++ al giorno d'oggi è abbastanza sicuro e abbastanza facile da usare, specialmente con framework come Qt ..." Sono totalmente d'accordo: penso che un grande punto di forza non sia (solo) il C ++ in sé, ma il fatto che (1 ) è compilato in codice nativo, (2) ha un ragionevole set di funzionalità (OOP, template), (3) ha framework molto buoni come Qt. Ciò compensa il fatto che la lingua è piuttosto grande e difficile da imparare: una volta padroneggiato un discreto sottoinsieme della lingua e alcune buone librerie, puoi essere veramente produttivo con esso.
Giorgio,

10

La maggior parte dei motori di gioco sono codificati in C ++. Inoltre molti motori di browser sono codificati in C ++. Ma la GUI del browser è spesso codificata utilizzando alcuni script leggeri (JavaScript, Python). Con notevole eccezione di Source Engine, la maggior parte dei motori di gioco utilizza anche linguaggi di scripting (come Lua o Python). [per riferimento: elenco di giochi con script Lua ]

Prendi anche la popolare libreria GUI C ++ come Qt. Nella versione corrente (4.7) utilizza QML per la GUI. QML è fondamentalmente JavaScript con collegamenti Qt.

Quindi davvero non c'è C ++ rispetto a linguaggi dinamici, è misto.


[Citazione necessaria]. So che molti giochi usano linguaggi di scripting per consentire agli utenti di estenderli, ma per quanto ne so non ci sono molti giochi che usano linguaggi di scripting per la loro funzionalità binaria di rilascio.
ProdigySim

1
@ProdigySim: ne conosco diversi. Fuori dalla mia testa, World of Warcraft (Lua + XML), la serie Uncharted di Naughty Dog (Lisp), la serie Unreal (UnrealScript), i giochi basati sui motori Torque e Unity, Dungeon Siege, NeverWinter Nights e molti altri. I giochi basati sui dati stanno diventando la norma, in cui l'host di script assume la maggior parte (se non tutte) le funzionalità dell'interfaccia utente e lo stato del gioco dall'alto verso il basso.
greyfade,

@ProdigySim: anche se nascosto agli utenti normali, non significa che internamente non utilizzino i motori di scripting. Fondamentalmente gli sviluppatori di giochi hanno due opzioni: creare il proprio linguaggio di scripting per i modelli o utilizzare uno di quelli di uso generale. Lua è particolarmente utile per i giochi, in quanto è generalmente buono per i sistemi in tempo reale.
vartec,

Il motore di origine utilizza il linguaggio di script di Squirrel.
cubuspl42,

6

La prima ragione sarà: (vecchia) abitudine

Secondo motivo: minore affidabilità su macchine virtuali, interpreti che devono essere installati, ecc.

E ci sono ancora alcuni IDE eccellenti per sviluppare codice in C ++.


1
" IDE ancora eccellenti". Direi che Visual Studio ed Eclipse sono all'avanguardia e lo sono praticamente da molto tempo.
JBR Wilkinson,

@JBRWilkinson: non ho detto che anche altre lingue non li hanno.
Roalt,

6

Il motivo è che hai molto più controllo su tutto ciò che accade. Se avessi intenzione di scrivere Photoshop in C #, avresti avuto seri problemi di prestazioni per alcune attività. In una lingua di livello inferiore con maggiore controllo, puoi prendere scorciatoie, ottimizzare dove necessario per cose che sono più intense. Naturalmente questo presuppone che tu stia usando C ++ in codice non gestito, non C ++ in .NET.

Vedi qui per un rapido esempio.


2
Adobe Lightroom, che è fondamentalmente un sottoinsieme di Photoshop, è scritto in Lua.
Jörg W Mittag,

4
@ Jörg: e il resto è C ++. in effetti questa è probabilmente la migliore combinazione disponibile, C ++ per la fondazione, Lua per il resto (anche se preferisco ancora C su C ++ per cose di basso livello).
Javier

2
@Javier: Sì, Lightroom è fondamentalmente gli algoritmi di manipolazione delle immagini di Photoshop (che sono probabilmente scritti principalmente in MMX / SSE assembly) e SQLite3 (che è scritto in ANSI C preistorico per la portabilità) incollati insieme a Lua. Adobe ha inoltre sviluppato il proprio IDE Lua, completamente in Lua. Qualcuno sa quale toolkit grafico usano? AFAIR Photoshop precede praticamente tutti i toolkit moderni, quindi è probabilmente qualcosa di coltivato in casa?
Jörg W Mittag,

4
senza offesa, ma se pensi che ANSI C sia preistorico, stai leggendo esempi di codice sbagliato
Javier

6

C ++ è tipicamente statico. Ciò consente di ottimizzare in anticipo l'esecuzione del codice facendo in modo che un compilatore adatti le proprie astrazioni al processo di sistema disponibile su una determinata piattaforma. Fino ad ora, i linguaggi dinamici hanno bisogno di un livello software aggiuntivo (= l'interprete) che rallenta l'accesso alle risorse di sistema.


4

La maggior parte dei motivi indicati sono tecnici o "sopra il tavolo" ... qui ci sono motivi commerciali o il "sotto il tavolo":

distribuzione del codice compilato vs distribuzione del codice sorgente. quando si sviluppa in c / c ++ si distribuiscono i binari. se stai sviluppando in una delle lingue moderne, distribuisci la fonte. è difficile vendere l'idea degli offuscatori ai dirigenti che devono rispondere agli azionisti / investitori, quindi non preoccuparti.

utenti stupidi: almeno nelle menti della gestione. percepiscono ancora i loro utenti a malapena in grado di fare doppio clic su "setup.exe". Se includi l'installazione di un interprete come parte dell'installazione, questi scuoteranno la testa da un lato all'altro.

vecchi sviluppatori: molte persone con esperienza sono in circolazione da molto tempo e non si sono tenute aggiornate. programmano in C ++ e non nelle lingue più recenti, perché non conoscono le lingue più recenti.


Direi che stai diffondendo il codice sorgente quando rilasci un'applicazione .NET. Guarda Visual Studio gran parte dell'interfaccia è progettata con moduli WPF. Alcuni dei tuoi punti sono ovviamente validi, gran parte della gestione di oggi è stata sviluppata da ieri, è improbabile che le cattive notizie di molti framework di oggi siano valide a causa delle modifiche ai computer di oggi.
Ramhound,

Molte persone con molta esperienza hanno acquisito la loro esperienza mantenendosi aggiornate. Tendono a non imparare nuove lingue calde (come Pascal nei primi anni '80) solo perché sono calde, ma solo se hanno un uso per loro o hanno idee interessanti (Haskell, per esempio).
David Thornley,

4

Vorrei estendere l'ambito del problema dalla GUI al software che dovrebbe essere competitivo. Il C ++ non applica alcuna imposta sulla piattaforma di destinazione in quanto riguarda la potenza di elaborazione, il runtime installato, i framework ecc. Quindi funzionerà su hardware cliente più limitato rispetto a una soluzione simile scritta in un linguaggio gestito / interpretato. Nel caso di un software commerciale di successo, il costo di sviluppo (potenzialmente più elevato nel caso del C ++) è ammortizzato dal numero di vendite.

Inoltre, C ++ solitamente offre accesso diretto alle API di sistema (come la GUI) che offre la migliore opportunità per ottimizzare l'utilizzo e differenziarsi da soluzioni simili.


3

Penso che molto abbia a che fare con le API per i toolkit della GUI. Tutti hanno un'API C / C ++, ma non tutti hanno (diciamo) i collegamenti Python. E a volte i toolkit stessi sono stati scritti pensando al C ++, quindi anche se hanno il supporto per altri linguaggi non li supportano completamente (ad esempio, non supportano un Python tuplecome argomento).


Oh, non li supportano completamente, perché non vogliono o non hanno tempo per implementarlo. Non perché sia ​​impossibile.
cubuspl42,

2

Stai citando browser e giochi come esempi. Entrambe sono applicazioni piuttosto critiche per le prestazioni, quindi averle in un linguaggio di basso livello per la velocità ha senso.

Molte altre applicazioni sono meno legate alle prestazioni e potrebbero essere facilmente scritte in altre lingue. C # in particolare sembra essere usato molto. (E Obj-C, ma in realtà non si qualifica come di alto livello credo. Meglio di C ++ però.)

Tuttavia, vi è una certa mancanza di quadri per gli ultimi linguaggi di programmazione. Ad esempio, in realtà non esiste una libreria GUI nativa praticabile per Python. Certo, puoi usare PyQt o PyGtk e funzionano bene, ma alla fine, si interfaccia solo con il codice C. Ancora una volta, C # (e probabilmente Obj-C) sembra essere l'eccezione e forse, MacRuby o IronPython potrebbero cambiare quel gioco.


0

Affinché un linguaggio sostituisca C ++ o Java, deve fare ciò che è gravemente mancato in questi linguaggi oltre a esibirli secondo i propri punti di forza. Inoltre, enormi investimenti sono stati effettuati in queste lingue. Ciò significa che esiste una libreria C ++ standard su molte piattaforme, che browser, giochi e tali programmi possono usare facilmente. Quindi c'è sicuramente un'inerzia. Le lingue tendono a decollare lentamente a differenza di altri software.

Se lo guardi, Anaconda (il programma di installazione di RedHat) è in circolazione da circa 10 anni, scritto in Python dall'inizio. Python non era così popolare quando Anaconda era nuovo.

Google's Go (golang.org) si sta evolvendo molto velocemente. Il compilatore deve ancora essere avviato. Perché la sua popolarità decollare, la sua libreria deve stabilizzarsi, il compilatore dovrebbe essere avviato, e più persone devono usarlo. Ho sentito che un programma di produzione al di fuori di Google è stato scritto su Go e sembra che non abbia ancora avuto dei tempi morti nella sua vita di poco più di un anno.


1
In realtà, v'è un compilatore Go commerciale per Windows che è scritto in Go, per cui v'è un compilatore bootstrap per Go. (È ancora in versione beta chiusa, comunque.)
Jörg W Mittag

Oh, allora ero fuori dal mondo. Grazie per
avermelo

2
Si chiama erGo ed è prodotto da una società chiamata Newquist Solutions .
Jörg W Mittag,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.