it-swarm.it

Perché la maggior parte dei browser è stata sviluppata in C ++

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

101
Nipuna

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 è impossibile, 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 creato 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 per visualizzare la pagina. la velocità del filo è il fattore limitante. Entrambi Java e C # hanno un blocco IO, così come C++. Quindi non c'è davvero un chiaro vincitore in quest'area.

Why not 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.

Why not 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.

Why not C? Esiste un compilatore C per quasi tutte le piattaforme (compresi i dispositivi integrati). Tuttavia, c'è molto che C non fa che 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.

Why not Objective C? Se il tuo unico obiettivo è Apple, ha molto senso. Tuttavia, la maggior parte degli sviluppatori non conosce Objective-C, e l'unico motivo per impararlo è lavorare su NeXT o Apple. Sicuro che puoi usare qualsiasi libreria C con Objective-C, e ci sono compilatori per molte piattaforme, ma trovare persone su cui lavorare sarà un po 'più difficile. Chi lo sa? Forse Apple può aggirare questa carenza percepita.

Why C++? C'è un compilatore C++ per quasi tutte le piattaforme là fuori. Quasi ogni libreria GUI ha 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++ di Java o C # (quei dettagli sono astratti per te). La velocità percepita deriva più dall'accelerazione hardware che dalle prestazioni non elaborate. C++ si occupa di più cose per te rispetto al C grezzo (come stringhe limitate), ma ti dà ancora la libertà di modificare le cose. Per non parlare del numero di librerie necessarie per il rendering delle pagine Web sono anche scritte in C o C++.

Per il momento, il C++ fa fuori le alternative.

165
Berin Loritsch

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. Questi browser hanno tutti un vantaggio di 15 anni sugli operatori storici.

Ti suggerisco anche di provare a nominare una lingua multipiattaforma accettabile (Windows/Mac/Unix e anche peggio) che era disponibile verso il 1995 quando i browser moderni originato. 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 gradevole, ma hanno pochi follower (nell'intervallo 10k-100k, forse) anche se liberali 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 apparentemente presumibilmente avrà difficoltà con i collaboratori.
  • Un browser proprietario che non utilizza C, C++, C # o Java farà sì che i project manager vengano severamente urlati nella maggior parte delle organizzazioni.

3. Problemi tecnici

Anche nei tempi moderni, è necessario un linguaggio abbastanza veloce per il calcolo di parti intense di rendering delle pagine e l'esecuzione di Javascript. Puoi scegliere di integrare questo con un linguaggio di alto livello per la creazione di elementi della GUI, ecc. (Ad es. 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. Potresti provare Common LISP, Haskell, OCaml ... Buona fortuna per far funzionare tutto 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); costruendo 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 201: I commentatori su Hacker News sembrano menzionare Rust and Go (non specificamente in relazione alla mia risposta), che ricadono vagamente nel secchiello "vario veloce". Cercare di mantenere questo elenco di lingue egualitario e aggiornato sarà una battaglia persa, quindi invece lo chiamo un campione rappresentativo al momento della stesura e lasciandolo in pace.

89
Jesse Millikan

Velocità

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

Ecco perché i giochi, le parti non core (come gli importatori di file) di Office e altro ancora sono ancora scritti in C++.

Modificato per includere la risposta di MSalters

36
Ryan Hayes

Portabilità

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

17
Pete

(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, various libraries we've imported)
  • x86 e ARM Assembly
  • JavaScript
  • XUL (un linguaggio di markup simile a HTML) e CSS
  • Obiettivo C (codice solo per MacOS)
  • Java (codice solo per Android)
  • Più linguaggi di definizione dell'interfaccia personalizzati (XPIDL, IPDL)
  • WebIDL (un altro linguaggio di definizione dell'interfaccia, ma questo non è personalizzato, sebbene lo 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 quello che facciamo, ma con JavaScript anziché Java. Naturalmente, gran parte del browser non è scritto in JavaScript, ma è sorprendente.

13
Justin L.

Bene, dovresti chiedere direttamente agli sviluppatori di quei prodotti per ottenere la risposta, ma sospetto sia una combinazione di familiarità (è ciò che quegli sviluppatori sapevano meglio), prestazioni (compilazione in un binario nativo al contrario del bytecode) e strumenti (rispetto a linguaggi come C, C++ è pieno di gadget Nice per risparmiare lavoro come STL).

12
John Bode

Storia

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

Ad esempio, entrambi Chrome e 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 della Qt GUI, quindi KDE è, nel complesso, un progetto C++. Tutti i nuovi progetti KDE erano, all'epoca, scritti interamente in C++, quindi era una scelta logica per KHTML e 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.

Microsoft IE è stato scritto come una raccolta di componenti ActiveX, che avrebbe potuto essere scritta in qualsiasi lingua con collegamenti COM, ma probabilmente è stata scritta in un sottoinsieme di C++, poiché la maggior parte della loro base di codice è già scritto 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 intrinseco tecnico per queste scelte. Sembrava "una buona idea al momento".

10
greyfade

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 il linguaggio preferito 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 delle librerie per attività non critiche come l'elaborazione delle stringhe e le strutture dati
8
Michael K

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

Fondamentalmente, c'è davvero werent qualsiasi altra scelta diverso da C++ che consentirebbe di costruire un browser che sarebbe veloce e funzionerebbe su molte piattaforme diverse.

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

4
GrandmasterB

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 sembrava (almeno per me) estremamente facile da capire - era brutto, lento e incompatibile con parecchie pagine web. Alla fine, sembrava basarsi su una premessa che non è mai stata modificata: che il Web sarebbe costituito principalmente da Java Java, con HTML poco più che un wrapper che indica 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 usato per molti nuovi sviluppi. I browser sono diventati alcuni dei software più utilizzati in circolazione, mentre molti altri del tempo sono sbiaditi nell'oblio.

Penso che anche l '"atteggiamento" mostrato della lingua abbia un effetto: il C++ (come la 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. Argomenti infiniti sull'attuazione elegante most 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.

4
Jerry Coffin

Programmazione cargo-cult. 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 ancora stati 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.

3
Mason Wheeler

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.

2
TMN

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 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 Facebook è ancora scritto in PHP.

0
Dustin Getz

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
Bill