Sembra che la maggior parte dei browser Web comuni (Firefox, Chrome, Safari) siano sviluppati utilizzando C ++. Perché è così?
Sembra che la maggior parte dei browser Web comuni (Firefox, Chrome, Safari) siano sviluppati utilizzando C ++. Perché è così?
Risposte:
Un altro modo di porre la domanda è di che tipo di supporto necessita un browser? La breve lista è:
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.
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!
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.
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:
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.
Corollario alla risposta di culto del carico sopra:
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.
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).
Se oggi hai sviluppato un browser a tre piattaforme (Windows / Mac / * nix) (inizio 2011), quali sono alcune delle scelte?
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.
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
Posso solo immaginare, ma stai citando prodotti software destinati a più piattaforme e C ++ può essere compilato su qualsiasi piattaforma.
(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:
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 è.
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).
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".
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:
abbinato ai vantaggi di OOP:
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.
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:
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.
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.
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.
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.
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.
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.
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.