Perché la maggior parte dei browser sono sviluppati in C ++ [chiuso]


99

Sembra che la maggior parte dei browser Web comuni (Firefox, Chrome, Safari) siano sviluppati utilizzando C ++. Perché è così?


28
Firefox è scritto in C ++ e Javascript, non solo in C ++.
Jesse Millikan,

1
È probabile che questa domanda abbia alcune risposte positive, supponendo che sia accurata (nota il commento di Jesse su Firefox, e ci sono molti browser oltre a questi tre e IE). Non penso sia produttivo.
David Thornley,

1
È questo il gruppo corretto per questa domanda?
Martin York,

6
@Jesse non è l'interprete js scritto in C ++? Ciò significherebbe rendere tutto C ++, no? (Potrei sbagliarmi ..)
Cambraca,

5
@cambraca, con quella logica, tutto è codice assembly!
Juan Mendes,

Risposte:


165

Un altro modo di porre la domanda è di che tipo di supporto necessita un browser? La breve lista è:

  • Supporto per l'analisi (necessario per dare un senso allo script [X] HTML, CSS e [ECMA / Java])
  • Funzionalità di tree walking / interpretariato (parte dell'analisi e creazione dell'interfaccia utente)
  • Supporto per grafica accelerata
  • Rete veloce
  • Per i browser più avanzati: controllo sui processi e isolamento della memoria tra le pagine
  • Deve funzionare su tutte le piattaforme supportate

La maggior parte delle lingue ha una sorta di supporto per l'analisi. Hai generatori di parser per C, C ++, C #, Java, ecc. Tuttavia, C e C ++ hanno parecchi anni di vantaggio sul resto delle alternative, quindi gli algoritmi e le implementazioni sono più mature. L'accesso alla grafica accelerata in Java non è un problema, a meno che tu non abbia alcune estensioni native per farlo funzionare. WPF su C # fornisce l'accesso alla grafica accelerata, ma è troppo nuovo per avere un browser serio costruito con la tecnologia.

Il networking è in realtà l'ultimo dei motivi per scegliere C ++ su Java o C #. Il motivo è che la comunicazione è molte volte più lenta del resto dell'elaborazione che continua a visualizzare la pagina. La velocità grezza del filo è il fattore limitante. Sia Java che C # hanno un supporto IO non bloccante, così come C ++. Quindi non c'è davvero nessun chiaro vincitore in questo settore.

Perché non Java? Hai mai provato a creare un'interfaccia utente con Java? Sembra ingombrante e lento rispetto a qualsiasi altra cosa là fuori, perché lo è. Nessuna grafica accelerata è anche un grande aspetto negativo qui. Il sandboxing di Java è davvero buono e può aiutare a migliorare la sicurezza di un browser se usato correttamente, ma è una seccatura configurare e far funzionare. Per non parlare del supporto del formato grafico in ritardo rispetto alla maggior parte dei browser moderni.

Perché non C #? Se il tuo unico obiettivo è Windows, C # potrebbe effettivamente fare una buona rappresentazione. Il problema si presenta quando si desidera supportare qualsiasi altra cosa. Mono non ha raggiunto abbastanza per essere considerato abbastanza multipiattaforma per questo compito, in particolare con supporto grafico accelerato e WPF. Chissà quanto tempo ci vorrà per cambiare.

Perché non C? C'è un compilatore C per quasi tutte le piattaforme là fuori (compresi i dispositivi integrati). Tuttavia, c'è molto che C non fa per te di cui dovrai essere più vigile. Hai accesso a tutti i livelli più bassi delle API, ma la maggior parte degli sviluppatori C non fa le GUI. Anche le librerie della GUI C sono scritte in modo orientato agli oggetti. Non appena si inizia a parlare dell'interfaccia utente, un linguaggio orientato agli oggetti inizia a dare un senso.

Perché non l'obiettivo C? Se il tuo unico obiettivo è Apple, ha molto senso. Tuttavia, la maggior parte degli sviluppatori non conosce Objective-C e l'unica ragione per apprenderlo è lavorare su scatole NeXT o Apple. Sicuramente puoi usare qualsiasi libreria C con Objective-C e ci sono compilatori per molte piattaforme, ma trovare le persone su cui lavorarci sarà un po 'più difficile. Chissà? Forse Apple può invertire questa carenza percepita.

Perché C ++ C'è un compilatore C ++ per quasi tutte le piattaforme là fuori. Quasi tutte le librerie GUI hanno un'interfaccia C ++, a volte è meglio e a volte è solo diversa. Ad esempio, l'ATL di Microsoft è molto meglio delle chiamate alla funzione C win32 o persino della libreria MFC. Ci sono wrapper C ++ per GTK su Unix e sarei sorpreso se qualcuno non avesse un wrapper C ++ attorno alla libreria GUI Objective-C di Apple. La gestione dei processi è più semplice in C ++ rispetto a Java o C # (questi dettagli vengono estratti per te). La velocità percepita deriva più dall'accelerazione hardware che dalle prestazioni non elaborate. Il C ++ si occupa di più cose per te rispetto al C grezzo (come le stringhe limitate), ma ti dà ancora la libertà di modificare le cose.

Per il momento, il C ++ ha delimitato le alternative.


4
Per piattaforme non Apple e non NeXT, esiste la collezione GNUStep. È per lo più compatibile con il cacao e corre dannatamente vicino ovunque.
Greyfade,

5
Ricorda che Java non deve usare Swing (che è una libreria scadente) per la GUI. Ad esempio, abbiamo attacchi Qt.
Anto,


2
Non ho mai detto che Opera fosse basata su Qt. Volevo dire che un browser non gratuito è davvero difficile da vendere quando ci sono così tante eccellenti opzioni gratuite.
Berin Loritsch,

7
La disponibilità dei generatori di parser non è poi così rilevante - in tutti i browser i parser HTML, XML e JS sono scritti a mano e CSS è in alcuni.
gsnedders

89

Ho deciso di scrivere un romanzo su questo nella speranza che la gente lo guardi e mi voti. No, no, sto solo scherzando! Ho sofferto per ogni parola. Ogni parola, te lo dico io!

Chiedi "quando" prima "perché"

Tutti i principali browser Web possono risalire agli anni '90. Konqueror è diventato Safari e Chrome; Netscape è diventato Firefox; IE e Opera sono ancora IE e Opera. Tutti questi browser hanno un vantaggio di 15 anni sugli operatori storici.

Ti suggerisco anche di provare a nominare un linguaggio multipiattaforma accettabile (Windows / Mac / Unix e anche peggio) che era disponibile verso il 1995 quando i browser moderni hanno avuto origine. Per costruire il core in tutto tranne che in C / C ++, probabilmente avresti dovuto costruire o acquistare e modificare un compilatore e librerie di piattaforme.

Che ne dici di oggi? Quali sono le alternative?

Solo per divertimento, pensiamo al problema oggi. Sì, ci sono alternative, ma ci sono ancora grossi problemi.

La scelta della lingua presenta almeno questi problemi:

  1. Problemi di conoscenza - Assumere / formare sviluppatori o attirare collaboratori
  2. Problemi organizzativi / sociali - Accettazione della lingua
  3. Implementazione del linguaggio: velocità, supporto della piattaforma, strumenti
  4. Potenza linguistica

1: problemi di conoscenza

Dove trovi persone che conoscono la lingua o possono impararla? Questo è un ostacolo per lingue come OCaml, F #, Haskell, Common Lisp e D che sono abbastanza veloci e di alto livello per scrivere un browser in modo corretto, ma hanno pochi follower (nell'intervallo 10k-100k, forse) anche se si è liberi contare tutti gli appassionati e gli accademici.

2: Problemi sociali / organizzativi

Corollario alla risposta di culto del carico sopra:

  • Un browser open source che non utilizza C, C ++, C # o Java avrà presumibilmente difficoltà con i collaboratori.
  • Un browser proprietario che non utilizza C, C ++, C # o Java farà urlare severamente i project manager nella maggior parte delle organizzazioni.

3. Problemi tecnici

Anche nei tempi moderni, è necessario un linguaggio abbastanza veloce per le parti di calcolo intensivo del rendering delle pagine e dell'esecuzione di Javascript. Puoi scegliere di integrare questo con un linguaggio di alto livello per la creazione di elementi della GUI, ecc. (Ad esempio l'approccio Firefox di C ++ e Javascript) ma devi avere una stretta integrazione tra le lingue; non puoi semplicemente dire "Okay, C # e Lua." Probabilmente dovrai creare ed eseguire il debug di quel bridge tu stesso a meno che tu non scelga C o C ++ come linguaggio di base.

Lo sviluppo multipiattaforma è un'altra borsa di worm. Puoi usare C # o F # e incrociare le dita su GTK # e Mono è vivo e vegeto in futuro. Si potrebbe provare Common Lisp, Haskell, OCaml ... Buona fortuna per avere tutto funziona su Windows e Mac e Linux.

4. Potenza linguistica

Dopo tutto ciò, devi sviluppare un'enorme quantità di funzionalità, quindi se scegli una lingua di basso livello hai bisogno di un esercito di programmatori ancora più grande di prima. Si noti che nessuno ha davvero creato un browser da zero in circa quindici anni. Questo è in parte perché (sorpresa!) È difficile.

In particolare, avere un interprete Javascript è il problema 3 (acquisirne uno) o il problema 4 (costruirne uno).

Conclusione:

Se oggi hai sviluppato un browser a tre piattaforme (Windows / Mac / * nix) (inizio 2011), quali sono alcune delle scelte?

  • C: Vedi (2). Tutti chiederanno a gran voce il C ++. Divertiti a selezionare un toolkit multipiattaforma o a costruirne uno (1, 2, 3 e 4). Vedi anche (4); divertiti a costruire un browser stabile e sicuro.
  • C ++: divertiti a selezionare un toolkit multipiattaforma o a costruirne uno (1, 2, 3 e 4). Divertiti (4) a creare un browser stabile e sicuro.
  • C o C ++ e HLL: la tua scommessa migliore. Scegli il tuo veleno sul linguaggio dinamico; Vedi (1) e (2). Troppe buone lingue, troppi pochi seguaci di ognuna. (1, 2, 3 e 4) sul toolkit.
  • Java: seconda scommessa migliore, se devi compiacere la gestione intermedia. Vedi (4); costruire cose enormi in Java richiede molto più codice rispetto a qualsiasi altra cosa in questo elenco ma forse C.
  • Scala: Beats Java su (4); (1) e (2) ma sta prendendo piede.
  • C e Javascript: come caso speciale, questo è interessante perché devi già costruire o acquisire e assimilare l'interprete Javascript. (Da qui Firefox.) (1, 2, 3 e 4) sul toolkit; il popolo Mozilla costruì il proprio IIRC.
  • C #: divertiti su (3). Probabilmente sei bloccato con GTK #, per quanto buono sia, o costruendo il tuo livello e renderer sopra GTK # e Windows Form.
  • Ruby / Python / Perl / Racket / Lua / Erlange ecc .: Hai (3) librerie di widget multipiattaforma e velocità. La legge di Moore è con te il (4); la crescente domanda sui browser è contro di te.
  • OCaml, Haskell, Common Lisp, Smalltalk: (1) e (2) a picche. Nessun problema di velocità, probabilmente, ma (3) per lo sviluppo multipiattaforma, e dovrai costruire tutto da solo o collegarti in qualche modo alle librerie C / C ++.
  • Objective-C: (3) Non sono sicuro di come funzionerebbe lo sviluppo multipiattaforma qui.

Se vedremo un altro browser emergente nei prossimi anni, scommetterei che sarà scritto in C o C ++ e in un linguaggio dinamico (come Firefox), sia open source che proprietario.

Modifica (31 luglio 2013) : I commentatori di Hacker News sembrano menzionare Rust and Go (non specificamente in relazione alla mia risposta), che cadono vagamente nel secchio "miscellaneo veloce". Cercare di mantenere questo elenco di lingue egualitario e aggiornato sarà una battaglia persa, quindi invece lo sto chiamando un campione rappresentativo al momento della stesura e lasciandolo da solo.


4
+1 per notare che QUANDO un particolare browser è stato sviluppato per la prima volta svolge un ruolo significativo.
Sparky

3
Vale la pena notare che mentre IE potrebbe non essere multipiattaforma oggi , lo era certamente una volta, e la sua attuale quota di mercato deriva quasi certamente (almeno in parte) da quella capacità multipiattaforma.
Jerry Coffin,

2
Si noti che IE era multipiattaforma una volta attorno a IE4.
JasonFruit

2
+1 per quando. Questa è l'unica ragione. Se qualcuno avviasse un progetto browser oggi molto probabilmente non userebbe C ++
Henry

4
@Henry, improbabile che escluderebbero usando C ++. La risposta osserva che il C ++ farà ancora parte del puzzle.
Tipo anonimo

36

Velocità

Per quanto brutto, C ++ è ancora quello che usi quando vuoi un'applicazione veloce e il pieno controllo del codice.

Questo è il motivo per cui giochi, parti non core (come importatori di file) di Office e altro ancora sono ancora scritti in C ++.

Modificato per includere la risposta di MSalters


3
A parte i giochi, non credo che questi motivi siano il motivo per cui quelle app sono scritte in C ++. Tuttavia, se hai una conoscenza diretta, sono felice di essere smentito.
Henry,

2
conoscenza di prima mano? VS 2010, Office 2010 sono entrambe enormi suite di app, ma sono estremamente veloci in quello che fanno. Sebbene entrambi abbiano un'eredità COM piuttosto ampia e un'eredità MS, le prestazioni sono ancora la cosa più importante per gli utenti.
Tipo anonimo

8
In che altro sarebbe scritto Office? VB? C e C ++ sono le uniche opzioni in cui Microsoft può scrivere app di grandi dimensioni. Non dire C # per favore
Toby Allen

4
@Victor: non ho visto la fonte per VS2010, quindi potrebbe benissimo essere scritta interamente in C #.
Ryan Hayes,

3
Se Office è un'app C #, perché l'originale Ribbon era un controllo MFC e abbiamo dovuto aspettare anni per sviluppare un C # uno? nessuna di queste enormi app verrà riscritta in C #, saranno racchiuse in una gui WPF (come VS2010) e la maggior parte del vecchio codice verrà riutilizzata. Perfino MS non ha le risorse per riscrivere completamente le loro app più grandi, non se vogliono passare del tempo ad aggiungere funzionalità anche a loro.
gbjbaanb,

17

portabilità

Posso solo immaginare, ma stai citando prodotti software destinati a più piattaforme e C ++ può essere compilato su qualsiasi piattaforma.


+10 - Oltre alle prestazioni non elaborate, penso che questo sia il REALE motivo per cui la maggior parte dei browser sono in C ++ ad eccezione di IE. La maggior parte dei browser funziona su più piattaforme e ci sono poche lingue / framework che possono funzionare allo stesso livello ed essere compatibili multipiattaforma.
Jordan Parmer,

All'inizio ho pensato anche a questo, ma per un'applicazione incentrata sulla GUI come un browser web. Il C ++ è davvero molto più portabile su altri sistemi operativi rispetto a Java?
JohnFx,

1
Un browser è davvero incentrato sulla GUI?
Kris Van Bael,

@JohnFx - Corretto, la parte della GUI probabilmente non è portatile. Ma il nocciolo, ad esempio, di un'applicazione browser è la gestione dell'HTML, la creazione di alberi DOM, l'analisi di javascript e l'esecuzione abbastanza veloce. Un'applicazione ben progettata può facilmente condividere lo stesso core e avere un codice UI diverso per ogni piattaforma. E sì, C ++ è molto più portatile di Java (ma senza GUI), perché per C ++ è necessario solo un compilatore destinato alla CPU. Per Java è necessario il framework completo.
Pete,

Ho capito che la maggior parte delle viscere dell'elaborazione HTML viene eseguita da alcuni strumenti di base come WebKit. Forse è perché quelli sono in C ++ che lo sono tutti i browser?
JohnFx,

13

(Lavoro su Firefox da circa cinque anni.)

L'interrogatore ha ragione sul fatto che gran parte del codice di Firefox è C ++, e in effetti C ++ è la maggioranza se si contano per righe di codice (anche se questo non racconta l'intera storia, poiché abbiamo un sacco di JavaScript e JS è più conciso rispetto a C ++).

Ma in realtà, Firefox è scritto in molte lingue diverse:

  • C ++
  • C (NSS, NSPR, varie librerie che abbiamo importato)
  • x86 e assemblaggio ARM
  • JavaScript
  • XUL (un linguaggio di markup simile a HTML) e CSS
  • Obiettivo C (codice solo per MacOS)
  • Java (codice solo per Android)
  • Più lingue di definizione dell'interfaccia personalizzate (XPIDL, IPDL)
  • WebIDL (un altro linguaggio di definizione dell'interfaccia, ma questo non è personalizzato, sebbene sia il generatore di codice)
  • Python (generatori di codice)

Ne sto sicuramente dimenticando.

Questo elenco è importante perché suggerisce l'incredibile complessità che si cela dietro un browser web.

Sì, Firefox ha molto codice C ++ e sì, ciò ha a che fare con il fatto che il C ++ era il miglior linguaggio per questo genere di cose quando Netscape è stato fondato. Ma sostengo anche che non esiste un linguaggio migliore oggi per molto di ciò che facciamo.

Nessun altro linguaggio ha un ecosistema di librerie così forte (contiamo fortemente sul codice esterno). Poche altre lingue ti offrono il controllo completo dello stack come C ++ (ottimizziamo regolarmente il nostro allocatore di heap personalizzato e facciamo ogni sorta di cose non sicure per la memoria per essere più veloci o usare meno memoria). Poche altre lingue ti consentono di reimplementare la maggior parte della libreria standard in modo sano (abbiamo le nostre implementazioni di stringhe e raccolte, adattate alle nostre esigenze). Poche altre lingue ti consentono di implementare il tuo cestino della spazzatura. E così via.

Sebbene C ++ sia la scelta ovvia per gran parte di ciò che facciamo, le persone che suggeriscono che potremmo scrivere un browser in Java e scrivere la nostra JVM, se necessario, sono su qualcosa. Questo è essenzialmente ciò che facciamo, ma con JavaScript anziché Java. Naturalmente, gran parte del browser non è scritto in JavaScript. Ma una quantità sorprendente è.


Queste azioni pericolose per la memoria sono fonti di problemi di sicurezza?
Demi

12

Bene, dovresti chiedere direttamente agli sviluppatori di quei prodotti per ottenere la risposta, ma sospetto che sia una combinazione di familiarità (è ciò che quegli sviluppatori sapevano meglio), prestazioni (compilazione su un binario nativo invece di bytecode), e strumenti (rispetto a linguaggi come C, C ++ è pieno di simpatici gadget salva-lavoro come l'STL).


10

Storia

Ognuno dei browser ha un po 'di storia che ha influenzato la scelta della lingua.

Ad esempio, sia Chrome che Safari sono basati su WebKit, che ha le sue origini nella parte KHTML del progetto KDE. KDE è stato originariamente creato (in parte) come dimostrazione del toolkit Qt GUI, quindi KDE è, nel complesso, un progetto C ++. Tutti i nuovi progetti di KDE erano, all'epoca, scritti interamente in C ++, quindi era una scelta logica per KHTML. Da allora è stato portato per usare altri toolkit GUI.

Il motore Presto di Opera è stato scritto pensando alle prestazioni e alle dimensioni binarie ridotte: il C ++ è stata la scelta logica.

L'IE di Microsoft è stato scritto come una raccolta di componenti ActiveX, che avrebbero potuto essere scritti in qualsiasi lingua che ha i collegamenti COM, ma è stato probabilmente scritto in un sottoinsieme di C ++, poiché la maggior parte della loro base di codice è già scritta in quella lingua.

Mozilla di Netscape è stato scritto in C ++ probabilmente perché la portabilità era una delle loro maggiori preoccupazioni. I compilatori C e C ++ sono (praticamente) onnipresenti, e quindi è stata una scelta logica.

Non esiste alcun motivo tecnico intrinseco per queste scelte. Sembrava "una buona idea al momento".


8

La rete in C e C ++ è facile da ottimizzare, poiché non è necessario utilizzare le librerie se non si desidera. Ho il sospetto che C ++ sia la lingua preferita perché consente i vantaggi di C:

  • Velocità
  • Ottimizzazione
  • Una certa quantità di portabilità
  • Lingua compilata, non interpretata

abbinato ai vantaggi di OOP:

  • Estensibilità
  • Visualizzazione più semplice
  • Migliore supporto della libreria per attività non critiche come l'elaborazione delle stringhe e le strutture di dati

Java o C # non hanno questi vantaggi?
Nipuna,

5
Ho sviluppato app in entrambi e direi che per funzionalità di rete limitate vanno bene. Tuttavia, non vorrei costruire nulla centrato sulla porzione di rete come fa un browser. Vorrei un maggiore controllo su ciò che stava accadendo e vorrei un linguaggio compilato .
Michael K,

Anche Java e C # sono compilati. C # avrebbe un vantaggio rispetto a Java quando si tratta di costruire la GUI, una parte fondamentale di qualsiasi browser. Java avrebbe un vantaggio con la portabilità. Sia Java che C # vengono ricompilati sulla piattaforma di destinazione, per miglioramenti di velocità probabilmente migliori.
Berin Loritsch,

5
No, vengono interpretati. Compilano in bytecode ed eseguono su una macchina virtuale. Quella VM non ha una corrispondenza uno a uno dalla sua istruzione impostata a quella nativa.
Michael K,

1
Non potevi avere questo più indietro! networking; potresti sborsare per arricciare e il browser sarebbe altrettanto veloce. Il CODICE di rete non è il bit lento. E cosa sono i socket se non è una libreria? Elaborazione delle stringhe; Questo è il nucleo di qualsiasi browser html, NON è non critico e non riesco a pensare a un singolo linguaggio che abbia una gestione delle stringhe peggiore rispetto al C ++ diverso da C.
Henry

4

Quando furono scritte le prime righe di codice per il primo round di browser, C # e Java non esistevano. Neanche Ruby. Python potrebbe essere stato in giro, ma era ancora un piccolo progetto homebrew a quel punto.

Fondamentalmente, c'erano davvero altre scelte oltre a C ++ che avrebbero permesso di costruire un browser che sarebbe veloce e funzionante su molte piattaforme diverse.

Quindi perché sono stati scritti in C ++? Perché quella era l'unica lingua disponibile in cui potevano essere scritti.


1
Non sono sicuro di cosa intendi per "nuovo round". Ma FF e IE hanno basi di codice che risalgono alla metà degli anni '90 e la maggior parte dei nuovi browser utilizza uno dei motori di rendering (ad esempio Chrome utilizza WebKit)
GrandmasterB

2
FF si è sbarazzato del codice Netscape legacy (cioè quello a metà degli anni '90 gonfio) e ha implementato il proprio motore di rendering. WebKit è anche un motore di rendering relativamente nuovo (utilizzato da Chrome e Safari). IE ha ancora un eccesso di legacy che continua a appesantire. Quindi non sarò d'accordo qui.
Berin Loritsch,

2
Almeno secondo Wikipedia, sia il geco che il webkit sono iniziati intorno al 1998. C # non era allora in circolazione, e java era nuovo sulla scena (e super pigro e davvero terribile alle gui di allora), quindi non sarebbe stata un'opzione fattibile. Quindi non so quali altre lingue sarebbero state adatte. Forse Pascal.
GrandmasterB,

1
@Berin Loritsch: Sì, ma in nessun momento hanno semplicemente buttato via tutto il codice esistente e ricominciato (su tutto) dall'inizio, il che è praticamente ciò che avrebbero dovuto fare per convertire in un'altra lingua. Inoltre, le persone che conoscevano / conoscono il C ++ abbastanza bene per la loro decisione su FF da attaccare probabilmente passeranno a un'altra lingua.
Jerry Coffin,

2
@Berin Loritsch Rubbish. FF si basa ancora su Gecko (1997) e Webkit si basa su khtml (1998).
Henry,

4

Perché i browser (ad esempio HotJava, ovviamente scritti abbastanza in Java) scritti in altre lingue non hanno mai raggiunto un livello sostanziale di accettazione / penetrazione del mercato.

Non posso dire nulla sull'iterazione corrente (o più recente - non è stata aggiornata da un po 'di tempo) di HotJava, ma quando l'ho provato, la mancanza di penetrazione nel mercato mi è sembrata (almeno per me) estremamente facile da capire - era brutto, lento e incompatibile con alcune pagine web. Alla fine, sembrava basarsi su una premessa che non era mai stata declinata: che il web sarebbe stato costituito principalmente da applet Java, con HTML poco più che un wrapper che indicava quali applet visualizzare dove.

Parte di essa è probabilmente anche storica: la maggior parte dei grandi browser Web esiste da molto tempo. Quando furono scritti per la prima volta, il panorama era molto diverso: il C ++ era un nuovo linguaggio "caldo", quindi veniva utilizzato per molti nuovi sviluppi. I browser sono diventati alcuni dei software più utilizzati in circolazione, mentre molti altri dal tempo sono sbiaditi nell'oblio.

Penso che anche l '"atteggiamento" mostrato del linguaggio abbia un effetto: il C ++ (come C prima di esso) ha sempre enfatizzato la praticità e il pragmatismo. Questo atteggiamento di base tende ad attirare programmatori che sono anche pragmatici. Molte altre lingue pongono molta più enfasi su cose come l'eleganza - e così facendo, attraggono i programmatori che la pensano allo stesso modo. Il problema è quello che io chiamo "effetto Lisp". I sintomi includono:

  1. Discussioni infinite sull'implementazione più elegante delle cose più banali.
  2. Incapacità di congelare le funzionalità e finire qualcosa che può essere spedito (anche con difetti)
  3. Incapacità di scendere a compromessi. Chi non è d'accordo con me non è solo sbagliato, ma deve essere stupido o malvagio.

Ce ne sono altri, ma ottieni l'idea generale (e sì, sto esagerando in una certa misura - ma solo in una certa misura). Sì, parte del codice che otterrai sarà incredibilmente bello - ma è probabile che sia in ritardo di sei mesi e per lo più incompatibile con qualsiasi altro pezzo di codice (quello che dovrebbe essere) nel sistema, e quando lo ricevi c'è una buona possibilità che qualcos'altro sia cambiato abbastanza da non poterlo usare affatto.

Ci sono anche lingue che senza dubbio funzionerebbero bene, ma (giustamente o erroneamente) semplicemente non avevano (o al momento cruciale, non avevano) la quota di mercato per chiunque avesse mai scritto un browser al loro interno. Date le dimensioni e la complessità di un browser completo, ci vogliono molte persone e parecchio tempo per svilupparne uno. Con questo tipo di investimento, molte persone diventano relativamente conservatrici su cose come gli strumenti di sviluppo.


1
WRT, punto 3, affermerò sicuramente, senza qualifica, che scrivere software di rete nella famiglia C è o stupido o malvagio, perché implica inconsapevolmente (stupido) o consapevolmente (male) lavorare con un sistema ampiamente noto per introdurre sicurezza buchi che potrebbero danneggiare i tuoi utenti. È moralmente equivalente a dare un'armatura a un soldato con un bersaglio dipinto sopra.
Mason Wheeler,

9
@Mason: la tua dimostrazione esattamente del bigottismo in questione è sicuramente apprezzata.
Jerry Coffin,

2
@ Mason: sciocchezze. Un buco di sicurezza (che era già stato risolto, ma molti amministratori di sistema non si erano preoccupati di installare il codice aggiornato) non è nemmeno vicino alla prova che tutto il codice scritto nella stessa lingua "causerà danni" o qualcosa del genere. OpenBSD (per un esempio) ha una cronologia della sicurezza notevolmente migliore rispetto alla versione di MacOS basata su Pascal.
Jerry Coffin,

5
@ Mason: No, lo sei. Innanzitutto, il worm Morris ha sfruttato un proram utilizzato gets, che è una funzione terribile, ma quasi inevitabile (e certamente non "fondamentale" per il linguaggio, o qualcosa del genere). In secondo luogo, C ++ non è la stessa lingua di C in ogni caso. In terzo luogo, OpenBSD dimostra abbastanza bene che il software sicuro può ed è scritto in C. Non esiste un "difetto del linguaggio sottostante" che impedisce la scrittura di software solido e sicuro in C. La piccola quota di mercato di OpenBSD indica che la sicurezza non è una delle principali preoccupazioni per la maggior parte persone.
Jerry Coffin,

6
@Mason: il sovraccarico del buffer getsè una semplice conseguenza del fatto che non si passa la lunghezza del buffer che si sta utilizzando. Nulla di fondamentale per la lingua a riguardo - potresti fare la stessa cosa in Pascal (e io ho). Scrivere software sicuro contro un aggressore intelligente non è facile a prescindere dalla lingua. Basato sull'esperienza in tutti e tre, è un po 'più facile in C che in Pascal, e molto più facile in C ++ che in C.
Jerry Coffin,

3

Programmazione di culto delle merci. La percezione che "C ++ sia veloce" è ancora in circolazione, (nonostante le funzionalità a livello di linguaggio scarsamente pensate come il suo modello di oggetto malamente rotto che rallenta le cose) e le persone vogliono che i loro browser siano veloci, quindi scrivono in C ++ .

In un mondo sano, le persone che scrivono software rivolti alla rete sarebbero inorridite al solo pensiero di usare un linguaggio che viene sellato da tutti i problemi di sicurezza intrinseci di C, e in realtà farlo sarebbe un atto di negligenza criminale. (Guarda quanti exploit buffer overflow sono stati trovati contro vari browser negli ultimi 15 anni circa! Di quanti milioni di dollari di danno sono responsabili questi programmatori?)

Esistono altri linguaggi compilati in grado di creare file binari veloci. Il problema è che non hanno la stessa esposizione della famiglia C, e tutti dobbiamo soffrirne.

Curiosità: quando Morris Worm arrivò su Internet nel 1988, dimostrando definitivamente i problemi con la scrittura di sistemi operativi e software di rete in C, (che non sono stati ancora risolti fino ad oggi, perché sono intrinsechi difetti nella lingua ,) Apple ha rilasciato il sistema operativo più avanzato che il mondo abbia visto finora, già da diversi anni, scritto in Pascal.


15
Eh? Mi è piaciuto molto il Mac OS, ma definirlo il sistema operativo più avanzato che il mondo avesse visto è sciocco. Non era nemmeno nello stesso parco palla di UNIX e VMS, per non parlare dei grandi sistemi di ferro IBM: utente singolo, nessuna memoria virtuale, gestione dei processi limitata. A dire il vero aveva un sistema di finestre molto bello, ma anche quello era derivato da Xerox Parc e un sacco di progetti accademici. Penso anche che gran parte del Mac OS sia stato effettivamente scritto nell'assembly M68k. Le librerie utilizzavano gli standard di chiamata della funzione Pascal perché era previsto che Pascal fosse la lingua principale dell'applicazione.
Charles E. Grant,

5
I sistemi operativi Apple precedenti agli anni 2000 non erano più stabili dell'equivalente MS. Quando stavo lavorando a due progetti negli anni '90, uno con Mac OS e uno con NT avevo lo stesso numero di arresti anomali e riavvii richiesti. Ora sono tutti una sorta di linguaggio basato su C. (Apple utilizza Objective-C per le sue cose attuali). La sicurezza può essere più difficile nei linguaggi basati su C, ma l'uso di una lingua diversa non la rende improvvisamente più sicura.
Berin Loritsch,

13
@Mason, il fatto che al momento il Mac non avesse bisogno di quelle funzionalità non significa che siano insignificanti. Hai fatto una dichiarazione non qualificata che il sistema operativo Apple era il più avanzato al mondo, ma apparentemente ciò che intendevi dire era che aveva l'interfaccia utente più sofisticata. Questa è un'affermazione difendibile, ma piuttosto meno grandiosa di quello che hai scritto. Scrivere una GUI utilizzabile è difficile. Scrivere un sistema di memoria paginata affidabile è difficile. Dire che uno è più significativo dell'altro è sciocco. Il computing di livello consumer come lo conosciamo ora non potrebbe esistere senza entrambi.
Charles E. Grant,

5
@Mason: la tua esperienza differisce chiaramente (enormemente) da chiunque e da tutti gli altri - per molti aspetti. :-)
Jerry Coffin

3
@Mason: LOL nel riferirsi al pre-Mac OSX come "avanzato". Il sistema operativo Apple è stato una fonte costante di arresti anomali, anche a causa del suo file system estremamente rudimentale.
Tipo anonimo

2

Accesso alle API a livello di sistema

Tutti i browser devono interfacciarsi con il sistema operativo a un certo punto e la maggior parte dei sistemi operativi principali ha API e librerie C e C ++ ben consolidate. Di solito è più facile lavorare con quelle API in C o C ++ piuttosto che scrivere wrapper.


0

Controllo e portabilità

la maggior parte degli argomenti sulla velocità può andare in entrambi i modi, ma in qualsiasi cosa in cui sia necessario un controllo preciso su come si fa qualcosa, molte delle lingue di livello superiore pioveranno sulla tua parata. Ci sono eccezioni a questo, ma la maggior parte di loro non è abbastanza multipiattaforma per contare in qualcosa come un browser.


0

Compatibilità legacy: impossibile eliminare il vecchio codice

Non ha nulla a che fare con i meriti del C ++ rispetto ad altre lingue. Puoi sicuramente scrivere da zero un browser migliore in una lingua come Haskell; un progetto così importante potrebbe persino implementare la propria JVM se fosse necessario per garantire alcune caratteristiche prestazionali. Come il modo in cui Facebook ha scritto il proprio compilatore / ottimizzatore PHP.

Un browser che interrompe il markup non standard è peggio che inutile. La compatibilità precedente è così critica e così complessa che una riscrittura non è un'opzione. Un sacco di tempo e denaro viene investito nella sicurezza testata in battaglia, ecc., Non puoi semplicemente buttare via quell'investimento. Ancora una volta, come il modo in cui Facebook è ancora scritto in PHP.


Posso capire perché le persone potrebbero non votare questo ... ma ridimensionare? Quello è strano. Ecco un +1 per te.
Thomas Eding,

Hai un (piccolo) punto, ma la tua prima frase lo butta via. Naturalmente ha a che fare anche con i meriti del C ++ rispetto ad altre lingue.
Chiel ten Brinke,
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.