Warum werden die meisten Browser in C ++ entwickelt [closed]


99

Es scheint, dass die meisten gängigen Webbrowser (Firefox, Chrome, Safari) mit C ++ entwickelt wurden. Warum ist das so?


28
Firefox ist in C ++ und Javascript geschrieben, nicht nur in C ++.
Jesse Millikan

1
Diese Frage wird wahrscheinlich ein paar einfache Antworten haben, vorausgesetzt, dass sie richtig ist (beachten Sie den Kommentar von Jesse zu Firefox und es gibt viele Browser außer diesen drei und dem IE). Ich denke nicht, dass es produktiv ist.
David Thornley

1
Ist das die richtige Gruppe für diese Frage?
Martin York

6
@Jesse ist der js-Interpreter nicht in C ++ geschrieben? Das würde alles irgendwie zu C ++ machen, nicht wahr? (Ich könnte mich irren ..)
Cambraca

5
@ Cambraca, mit dieser Logik ist alles Assembler-Code!
Juan Mendes

Antworten:


165

Eine andere Möglichkeit, die Frage zu stellen, ist, welche Unterstützung ein Browser benötigt. Die kurze Liste ist:

  • Unterstützung für das Parsen (erforderlich, um [X] HTML, CSS und [ECMA / Java] -Skript zu verstehen)
  • Tree-Walking- / Interpretationsfunktionen (Teil der Benutzeroberfläche zum Parsen und Erstellen)
  • Unterstützung für beschleunigte Grafiken
  • Schnelle Vernetzung
  • Für fortgeschrittene Browser: Kontrolle über Prozesse und Isolieren des Speichers zwischen Seiten
  • Muss auf allen unterstützten Plattformen funktionieren

Die meisten Sprachen unterstützen das Parsen. Sie haben Parser-Generatoren für C, C ++, C #, Java usw. C und C ++ haben jedoch einige Jahre Vorsprung auf die restlichen Alternativen, sodass die Algorithmen und Implementierungen ausgereifter sind. Der Zugriff auf beschleunigte Grafiken in Java ist ein Kinderspiel, es sei denn, Sie haben einige native Erweiterungen, damit dies funktioniert. WPF auf C # bietet Zugriff auf beschleunigte Grafiken, aber es ist zu neu, um einen seriösen Browser mit dieser Technologie zu haben.

Das Netzwerk ist eigentlich der geringste Grund, sich für C ++ anstelle von Java oder C # zu entscheiden. Der Grund dafür ist, dass die Kommunikation um ein Vielfaches langsamer ist als der Rest der Verarbeitung, mit der die Seite angezeigt wird. Die Rohgeschwindigkeit des Drahtes ist der begrenzende Faktor. Sowohl Java als auch C # und C ++ unterstützen nicht blockierende E / A. Es gibt also wirklich keinen klaren Sieger in diesem Bereich.

Warum nicht Java? Haben Sie jemals versucht, eine Benutzeroberfläche mit Java zu erstellen? Es fühlt sich schwerfällig und langsam an im Vergleich zu allem anderen da draußen, weil es so ist. Keine beschleunigte Grafik ist auch hier ein großes Minus. Javas Sandboxing ist wirklich gut und kann dazu beitragen, die Sicherheit eines Browsers zu verbessern, wenn er richtig verwendet wird. Es ist jedoch mühsam, ihn zu konfigurieren und in Betrieb zu nehmen. Ganz zu schweigen davon, dass die Unterstützung des Grafikformats hinter den meisten modernen Browsern zurückbleibt.

Warum nicht C #? Wenn Ihr einziges Ziel Windows ist, kann C # tatsächlich eine gute Darstellung liefern. Das Problem tritt auf, wenn Sie etwas anderes unterstützen möchten. Mono hat nicht genug aufgeholt, um für diese Aufgabe als plattformübergreifend angesehen zu werden - insbesondere mit beschleunigter Grafikunterstützung und WPF. Wer weiß, wie lange das dauern wird.

Warum nicht C? Es gibt einen C-Compiler für nahezu jede Plattform (einschließlich eingebetteter Geräte). Es gibt jedoch eine Menge, die C nicht für Sie erledigt , bei denen Sie besonders wachsam sein müssen. Sie haben Zugriff auf alle untersten Ebenen der APIs, aber die Mehrheit der C-Entwickler macht keine GUIs. Auch die C-GUI-Bibliotheken sind objektorientiert geschrieben. Sobald Sie anfangen, über die Benutzeroberfläche zu sprechen, ergibt eine objektorientierte Sprache einen besseren Sinn.

Warum nicht Ziel C? Wenn Ihr einziges Ziel Apple ist, ist dies sehr sinnvoll. Die meisten Entwickler kennen Objective-C jedoch nicht und der einzige Grund, dies zu lernen, besteht darin, mit NeXT- oder Apple-Boxen zu arbeiten. Natürlich können Sie mit Objective-C jede C-Bibliothek verwenden, und es gibt Compiler für viele Plattformen, aber es ist schwieriger, Leute zu finden, die daran arbeiten können. Wer weiß? Vielleicht kann Apple diesen wahrgenommenen Mangel beheben.

Warum C ++? Es gibt einen C ++ - Compiler für nahezu jede Plattform. Fast jede GUI-Bibliothek hat eine C ++ - Schnittstelle, manchmal ist es besser und manchmal ist es einfach anders. Beispielsweise ist Microsofts ATL viel besser als Win32 C-Funktionsaufrufe oder sogar die MFC-Bibliothek. Es gibt C ++ - Wrapper für GTK unter Unix, und ich wäre überrascht, wenn jemand keinen C ++ - Wrapper für die Objective-C-GUI-Bibliothek von Apple hätte. Die Prozessverwaltung ist in C ++ einfacher als in Java oder C # (diese Details werden für Sie abstrahiert). Die wahrgenommene Geschwindigkeit ergibt sich eher aus der Hardwarebeschleunigung als aus der Rohleistung. C ++ kümmert sich um mehr Dinge als um rohes C (z. B. begrenzte Zeichenfolgen), gibt Ihnen aber dennoch die Freiheit, Dinge zu optimieren.

C ++ verdrängt derzeit die Alternativen.


4
Für Nicht-Apple- und Nicht-NeXT-Plattformen gibt es die GNUStep-Sammlung. Es ist größtenteils mit Cocoa kompatibel und läuft fast überall.
greyfade

5
Denken Sie daran, dass Java Swing (eine beschissene Bibliothek) nicht für die GUI verwenden darf. Zum Beispiel haben wir Qt-Bindungen.
Anto


2
Ich habe nie gesagt, dass Opera auf Qt basiert. Ich wollte damit andeuten, dass ein unfreier Browser wirklich schwer zu verkaufen ist, wenn es so viele ausgezeichnete kostenlose Optionen gibt.
Berin Loritsch

7
Die Verfügbarkeit von Parser-Generatoren ist nicht wirklich relevant - in allen Browsern sind HTML-, XML- und JS-Parser handgeschrieben, in einigen CSS-Parsern.
gsnedders

89

Ich habe beschlossen, einen Roman darüber zu schreiben, in der Hoffnung, dass die Leute ihn beschönigen und mich unterstützen. Nein, nein, nur ein Scherz! Ich habe über jedes Wort gelitten. Jedes Wort, sage ich dir!

Fragen Sie 'wann' vor 'warum'

Alle gängigen Webbrowser können ihre Ursprünge bis in die 90er Jahre zurückverfolgen. Konqueror wurde Safari und Chrome; Netscape wurde zu Firefox. IE und Opera sind immer noch IE und Opera. Diese Browser haben alle einen Vorsprung von 15 Jahren auf die etablierten Betreiber.

Ich schlage vor , Sie versuchen sogar zu nennen eine akzeptable Cross-Plattform (Windows / Mac / Unix und noch schlimmer) Sprache , die in etwa 1995 verfügbar war , als moderner Browser stammte. Um den Kern in etwas anderem als C / C ++ zu erstellen, mussten Sie wahrscheinlich einen Compiler und Plattformbibliotheken erstellen oder kaufen und modifizieren.

Wie wäre es heute? Was sind die Alternativen?

Denken wir heute nur zum Spaß über das Problem nach. Ja, es gibt Alternativen, aber es gibt immer noch große Probleme.

Die Wahl der Sprache wirft zumindest folgende Probleme auf:

  1. Wissensprobleme - Einstellung / Schulung von Entwicklern oder Gewinnung von Mitarbeitern
  2. Organisatorische / soziale Probleme - Sprachakzeptanz
  3. Sprachimplementierung: Geschwindigkeit, Plattformunterstützung, Tooling
  4. Sprachgewalt

1: Wissensprobleme

Woher bekommen Sie Leute, die die Sprache kennen oder lernen können? Dies ist ein Hindernis für Sprachen wie OCaml, F #, Haskell, Common Lisp und D, die schnell und hoch genug sind, um einen Browser gut zu schreiben, aber nur wenige Anhänger haben (im Bereich von 10.000 bis 100.000), selbst wenn Sie liberal sind Zählen Sie alle Bastler und Akademiker.

2: Soziale / organisatorische Probleme

Die obige Antwort auf den Frachtkult lautet:

  • Ein Open-Source-Browser, der C, C ++, C # oder Java nicht verwendet, wird angeblich Probleme mit Mitwirkenden haben.
  • Ein proprietärer Browser, der nicht C, C ++, C # oder Java verwendet, wird in den meisten Organisationen von Projektmanagern heftig angeschrien.

3. Technische Probleme

Selbst in der heutigen Zeit benötigen Sie eine relativ schnelle Sprache für die rechenintensiven Teile des Renderns von Seiten und für das Ausführen von Javascript. Sie können dies durch eine Hochsprache zum Erstellen von GUI-Elementen usw. ergänzen (z. B. der Firefox-Ansatz von C ++ und Javascript), müssen jedoch eine enge Integration zwischen den Sprachen aufweisen. Sie können nicht einfach "Okay, C # und Lua" sagen. Sie müssen diese Bridge wahrscheinlich selbst erstellen und debuggen, es sei denn, Sie wählen C oder C ++ als Basissprache.

Die plattformübergreifende Entwicklung ist ein weiterer Haufen Würmer. Sie könnten C # oder F # verwenden und die Daumen drücken, wenn GTK # und Mono in Zukunft noch am Leben sind. Sie könnten versuchen , Common Lisp, Haskell, OCaml ... Viel Glück immer alles funktioniert unter Windows und Mac und Linux.

4. Sprachpower

Nach alledem müssen Sie eine enorme Menge an Funktionen erstellen. Wenn Sie sich also für eine einfache Sprache entscheiden, benötigen Sie eine noch größere Anzahl an Programmierern als zuvor. Beachten Sie, dass in etwa fünfzehn Jahren niemand wirklich einen Browser von Grund auf neu erstellt hat. Das liegt zum Teil (Überraschung!) Daran, dass es schwer ist.

Speziell ein Javascript-Interpreter ist ein Problem 3 (erwerben Sie einen) oder ein Problem 4 (erstellen Sie einen).

Fazit:

Wenn Sie heute (Anfang 2011) einen Browser mit drei Plattformen (Windows / Mac / * nix) entwickelt haben, welche Optionen stehen zur Auswahl?

  • C: Siehe (2). Jeder wird nach C ++ verlangen. Viel Spaß beim Auswählen oder Erstellen eines plattformübergreifenden Toolkits (1, 2, 3 und 4). Siehe auch (4); Viel Spaß beim Erstellen eines stabilen, sicheren Browsers.
  • C ++: Viel Spaß beim Auswählen oder Erstellen eines plattformübergreifenden Toolkits (1, 2, 3 und 4). Viel Spaß beim (4) Aufbau eines stabilen, sicheren Browsers.
  • C oder C ++ und HLL: Ihre beste Wahl. Wählen Sie Ihr Gift auf der dynamischen Sprache aus; Siehe (1) und (2). Zu viele gute Sprachen, zu wenige Anhänger. (1, 2, 3 und 4) im Toolkit.
  • Java: Zweitbeste Wette, wenn Sie das mittlere Management zufrieden stellen müssen. Siehe (4); Das Erstellen von riesigen Dingen in Java erfordert viel mehr Code als in allen anderen Dingen auf dieser Liste, aber vielleicht C.
  • Scala: Beats Java auf (4); (1) und (2), aber es fängt an.
  • C und Javascript: Als Sonderfall ist dies ansprechend, da Sie bereits einen Javascript-Interpreter erstellen oder erwerben und assimilieren müssen. (Daher Firefox.) (1, 2, 3 und 4) im Toolkit; Die Mozilla-Leute bauten ihr eigenes IIRC.
  • Viel Spaß auf (3). Sie bleiben wahrscheinlich bei GTK # hängen, wie gut das auch sein mag, oder Sie erstellen eine eigene Ebene und einen eigenen Renderer über GTK # und Windows Forms.
  • Ruby / Python / Perl / Racket / Lua / Erlange etc .: Sie haben (3) plattformübergreifende Widget-Bibliotheken und Geschwindigkeit. Moores Gesetz ist bei dir (4); Die wachsende Nachfrage nach Browsern richtet sich gegen Sie.
  • OCaml, Haskell, Common Lisp, Smalltalk: (1) und (2) in Pik. Wahrscheinlich keine Geschwindigkeitsprobleme, aber (3) für die plattformübergreifende Entwicklung, und Sie müssen auf irgendeine Weise Ihr eigenes "Alles" oder eine Brücke zu C / C ++ - Bibliotheken bauen.
  • Ziel C: (3) Ich bin nicht sicher, wie die plattformübergreifende Entwicklung hier ablaufen würde.

Wenn in den nächsten Jahren ein weiterer großer Browser auftaucht, würde ich wetten, dass er in C oder C ++ und einer dynamischen Sprache (wie Firefox) geschrieben wird, egal ob Open Source oder proprietär.

Edit (31. Juli 2013) : Kommentatoren in den Hacker News scheinen Rust and Go zu erwähnen (nicht speziell im Zusammenhang mit meiner Antwort), die vage in den "sonstwie schnellen" Eimer fallen. Der Versuch, diese Liste der Sprachen egalitär und auf dem neuesten Stand zu halten, wird eine Niederlage sein. Stattdessen nenne ich sie zum Zeitpunkt des Schreibens eine repräsentative Stichprobe und lasse sie in Ruhe.


4
+1 für die Feststellung, dass WENN ein bestimmter Browser zum ersten Mal entwickelt wurde, spielt auch eine wichtige Rolle.
Sparky

3
Es ist erwähnenswert, dass IE heute zwar möglicherweise nicht plattformübergreifend ist , dies jedoch zu einem bestimmten Zeitpunkt der Fall war und sein aktueller Marktanteil (zumindest teilweise) mit ziemlicher Sicherheit aus dieser plattformübergreifenden Fähigkeit resultiert.
Jerry Coffin

2
Beachten Sie, dass IE war Cross-Plattform einmal um IE4.
JasonFruit

2
+1 für wann. Das ist der einzige Grund. Wenn jemand heute ein Browserprojekt starten würde, würde er höchstwahrscheinlich C ++
Henry am

4
@ Henry, es ist unwahrscheinlich, dass sie die Verwendung von C ++ ausschließen würden. Die Antwort stellt fest, dass C ++ immer noch Teil des Puzzles sein wird.
Anonym Typ

36

Geschwindigkeit

So hässlich es auch ist, C ++ ist immer noch das, was Sie verwenden, wenn Sie eine schnelle Anwendung und vollständige Kontrolle über den Code wünschen.

Aus diesem Grund werden Spiele, nicht zum Kern gehörende Teile (z. B. Dateiimporteure) von Office und andere weiterhin in C ++ geschrieben.

Bearbeitet, um die Antwort von MSalters einzuschließen


3
Abgesehen von Spielen glaube ich nicht, dass diese Gründe dafür verantwortlich sind, dass diese Apps in C ++ geschrieben sind. Wenn Sie jedoch über Kenntnisse aus erster Hand verfügen, bin ich froh, dass ich das Gegenteil beweisen kann.
Henry

2
Wissen aus erster Hand? VS 2010, Office 2010 sind beide große App-Suiten, aber sie sind extrem schnell in dem, was sie tun. Obwohl beide über ein ziemlich umfangreiches COM-Erbe und ein MS-Erbe verfügen, ist die Leistung für die Benutzer immer noch das Wichtigste.
Anonym Typ

8
In was sonst würde Büro geschrieben werden? VB? C und C ++ sind die einzigen Optionen, in denen Microsoft große Apps schreiben kann. Sagen Sie nicht C #, bitte
Toby Allen

4
@ Victor: Ich habe die Quelle für VS2010 nicht gesehen, daher kann es durchaus sein, dass sie vollständig in C # geschrieben ist.
Ryan Hayes

3
Wenn es sich bei office um eine C # -App handelt, warum war das ursprüngliche Menüband ein MFC-Steuerelement, und wir mussten ewig warten, bis ein C # -On entwickelt wurde? Keine dieser riesigen Apps wird in C # umgeschrieben, sie werden in eine WPF-GUI (wie VS2010) eingebunden und der Großteil des alten Codes wird wiederverwendet. Selbst MS haben nicht die Ressourcen, um ihre größten Apps vollständig neu zu schreiben - nicht, wenn sie Zeit damit verbringen möchten, ihnen Funktionen hinzuzufügen.
gbjbaanb

17

Portabilität

Ich kann nur raten, aber Sie erwähnen Softwareprodukte, die auf mehrere Plattformen abzielen, und C ++ kann auf jeder Plattform kompiliert werden.


+10 - Abgesehen von der rohen Leistung denke ich, dass dies der WIRKLICHE Grund ist, warum die meisten Browser in C ++ sind, mit Ausnahme des IE. Die meisten Browser arbeiten auf mehreren Plattformen, und es gibt nur wenige Sprachen / Frameworks, die dieselbe Leistung erbringen UND plattformübergreifend kompatibel sind.
Jordan Parmer

Ich dachte das zuerst auch, aber für eine GUI-zentrierte Anwendung wie einen Webbrowser. Ist C ++ wirklich so viel portabler für andere Betriebssysteme als Java?
JohnFx

1
Ist ein Browser wirklich so GUI-zentriert?
Kris Van Bael

@ JohnFx - Richtig, der GUI-Teil ist wahrscheinlich nicht so portabel. Der Kern einer Browseranwendung besteht jedoch darin, HTML zu verarbeiten, DOM-Bäume zu erstellen, Javascript zu analysieren und es schnell genug auszuführen. Eine gut gestaltete Anwendung kann problemlos denselben Kern gemeinsam nutzen und für jede Plattform einen anderen UI-Code haben. Und ja, C ++ ist viel portabler als Java (aber ohne GUI), da Sie für C ++ nur einen Compiler benötigen, der auf die CPU abzielt. Für Java benötigen Sie das volle Framework.
Pete

Nach meinem Verständnis wird der Großteil der HTML-Verarbeitung von einigen Kerntools wie WebKit ausgeführt. Vielleicht liegt es daran, dass diese in C ++ sind, dass die ganzen Browser sind?
JohnFx

13

(Ich arbeite seit ungefähr fünf Jahren an Firefox.)

Der Fragesteller hat Recht, dass ein Großteil des Firefox-Codes C ++ ist, und tatsächlich ist C ++ die Mehrheit, wenn Sie nach Codezeilen zählen (obwohl dies nicht die ganze Geschichte erzählt, da wir viel JavaScript haben und JS mehr ist prägnanter als C ++).

In Wirklichkeit ist Firefox jedoch in vielen verschiedenen Sprachen geschrieben:

  • C ++
  • C (NSS, NSPR, verschiedene Bibliotheken, die wir importiert haben)
  • x86- und ARM-Assembly
  • JavaScript
  • XUL (eine HTML-ähnliche Auszeichnungssprache) und CSS
  • Ziel C (nur MacOS-Code)
  • Java (nur für Android)
  • Mehrere benutzerdefinierte Schnittstellendefinitionssprachen (XPIDL, IPDL)
  • WebIDL (eine andere Sprache für die Schnittstellendefinition, aber diese ist nicht benutzerdefiniert, obwohl der Codegenerator dies ist)
  • Python (Codegeneratoren)

Ich vergesse sicher einige.

Diese Liste ist wichtig, da sie auf die unglaubliche Komplexität hinweist, die sich hinter einem Webbrowser verbirgt.

Ja, Firefox hat viel C ++ - Code, und ja, das hat etwas damit zu tun, dass C ++ bei der Gründung von Netscape die beste Sprache für diese Art von Dingen war. Aber ich behaupte auch, dass es heute für vieles, was wir tun, keine bessere Sprache gibt.

Keine andere Sprache hat ein so starkes Bibliotheksökosystem (wir stützen uns stark auf externen Code). Nur wenige andere Sprachen bieten Ihnen eine Full-Stack-Kontrolle wie C ++ (wir optimieren regelmäßig unseren benutzerdefinierten Heap-Allokator und tun alle möglichen speichersicheren Dinge, um schneller zu sein oder weniger Speicher zu verbrauchen). Mit wenigen anderen Sprachen können Sie den größten Teil der Standardbibliothek auf vernünftige Weise neu implementieren (wir haben unsere eigenen Strings und Collections-Implementierungen, die auf unsere Bedürfnisse abgestimmt sind). In wenigen anderen Sprachen können Sie Ihren eigenen Garbage Collector implementieren. Und so weiter.

Obwohl C ++ die offensichtliche Wahl für viele unserer Aufgaben ist, sind die Leute, die vorschlagen, dass wir einen Browser in Java schreiben und gegebenenfalls unsere eigene JVM schreiben könnten, auf dem Laufenden. Dies ist im Wesentlichen das, was wir tun, aber mit JavaScript anstelle von Java. Natürlich ist ein Großteil des Browsers nicht in JavaScript geschrieben. Aber eine überraschende Menge ist.


Sind diese speichersicheren Aktionen Ursachen für Sicherheitsprobleme?
Demi

12

Nun, Sie müssten die Entwickler dieser Produkte direkt fragen, um die Antwort zu erhalten, aber ich vermute, es ist eine Kombination aus Vertrautheit (das wussten die Entwickler am besten), Leistung (Kompilieren in eine native Binärdatei im Gegensatz zu Bytecode) und Tools (im Vergleich zu Sprachen wie C, C ++ ist voll von netten arbeitssparenden Gadgets wie der STL).


10

Geschichte

Jeder der Browser hat eine Geschichte, die die Wahl der Sprache beeinflusst.

Beispielsweise basieren sowohl Chrome als auch Safari auf WebKit, dessen Ursprung im KHTML-Teil des KDE-Projekts liegt. KDE wurde ursprünglich (teilweise) als Demonstration des Qt-GUI-Toolkits erstellt, sodass KDE insgesamt ein C ++ - Projekt ist. Alle neuen KDE-Projekte wurden zu dieser Zeit vollständig in C ++ geschrieben, daher war dies eine logische Wahl für KHTML. Es wurde inzwischen für die Verwendung anderer GUI-Toolkits portiert.

Die Presto-Engine von Opera wurde mit Blick auf Leistung und eine kleine Binärgröße geschrieben: C ++ war die logische Wahl.

Der IE von Microsoft wurde als Sammlung von ActiveX-Komponenten geschrieben, die in jeder Sprache mit COM-Bindungen geschrieben sein könnten, aber wahrscheinlich in einer Teilmenge von C ++ geschrieben wurden, da der Großteil ihrer Codebasis bereits in dieser Sprache geschrieben ist.

Mozilla von Netscape wurde wahrscheinlich in C ++ geschrieben, weil die Portabilität ein Hauptanliegen von Netscape war. C- und C ++ - Compiler sind (praktisch) allgegenwärtig, und so war es eine logische Wahl.

Es gibt keinen inhärenten technischen Grund für diese Auswahl. Es schien nur "eine gute Idee zu der Zeit."


8

Das Netzwerk in C und C ++ ist einfach zu optimieren, da Sie keine Bibliotheken verwenden müssen, wenn Sie dies nicht möchten. Ich vermute, dass C ++ die Sprache der Wahl ist, da es die Vorteile von C bietet:

  • Geschwindigkeit
  • Optimierung
  • Eine gewisse Portabilität
  • Kompilierte Sprache, nicht interpretiert

gepaart mit den Vorteilen von OOP:

  • Erweiterbarkeit
  • Einfachere Visualisierung
  • Bessere Bibliotheksunterstützung für unkritische Aufgaben wie die Verarbeitung von Zeichenfolgen und Datenstrukturen

Hat Java oder C # nicht diese Vorteile?
Nipuna

5
Ich habe in beiden Bereichen Apps entwickelt, und ich würde sagen, dass sie für eingeschränkte Netzwerkfunktionen in Ordnung sind. Ich möchte jedoch nichts aufbauen, das sich wie ein Browser auf den Netzwerkteil konzentriert. Ich würde viel mehr Kontrolle über das, was geschah, und ich würde eine kompilierte Sprache wollen .
Michael K

Java und C # werden ebenfalls kompiliert. C # hätte einen Vorteil gegenüber Java, wenn es darum geht, die GUI zu erstellen - ein wichtiger Teil eines jeden Browsers. Java hätte einen Vorteil bei der Portabilität. Sowohl Java als auch C # werden auf der Zielplattform neu kompiliert - für eine wohl bessere Geschwindigkeitsverbesserung.
Berin Loritsch

5
Nein, sie werden interpretiert. Sie werden zu Bytecode kompiliert und auf einer virtuellen Maschine ausgeführt. Diese VM hat keine Eins-zu-Eins-Entsprechung vom Befehlssatz zum nativen Befehlssatz.
Michael K

1
Das könnte man nicht mehr rückwärts haben! Vernetzung; Sie könnten sich locken und der Browser wäre genauso schnell. Der Netzwerk-CODE ist nicht das langsame Bit. Und was ist Sockets, wenn es keine Bibliothek ist? String-Verarbeitung; Dies ist der Kern eines jeden HTML-Browsers, er ist NICHT unkritisch und ich kann mir keine einzige Sprache vorstellen, die eine schlechtere Zeichenkettenverarbeitung als C ++ hat, außer C.
Henry,

4

Als die ersten Codezeilen für die erste Browser-Runde geschrieben wurden, existierten C # und Java nicht. Ruby auch nicht. Python war vielleicht schon da, aber es war zu diesem Zeitpunkt noch ein winziges Homebrew-Projekt.

Grundsätzlich gab es wirklich keine anderen Optionen als C ++, die es einem ermöglichen würden, einen Browser zu erstellen, der schnell ist und auf vielen verschiedenen Plattformen ausgeführt werden kann.

Warum wurden sie in C ++ geschrieben? Weil dies die einzige Sprache war, in der sie geschrieben werden konnten.


1
Ich bin mir nicht sicher, was du mit "neue Runde" meinst. Aber FF und IE haben Code-Datenbanken, die bis in die Mitte der 90er Jahre zurückreichen, und die meisten neuen Browser verwenden eine der Rendering-Engines (z. B. Chrome verwendet WebKit)
GrandmasterB

2
FF hat den alten Netscape-Code (dh das Aufblähen Mitte der 90er Jahre) entfernt und eine eigene Rendering-Engine implementiert. WebKit ist auch eine vergleichsweise neue Rendering-Engine (von Chrome und Safari verwendet). IE hat immer noch Legacy Bloat, was es weiterhin belastet. Also werde ich hier nicht zustimmen.
Berin Loritsch

2
Laut Wikipedia begannen sowohl Gecko als auch Webkit um 1998. C # gab es damals nicht und Java war neu in der Szene (und super träge und wirklich schrecklich bei Gui damals), so dass dies keine machbare Option gewesen wäre. Ich weiß also nicht, welche anderen Sprachen geeignet gewesen wären. Vielleicht Pascal.
GrandmasterB

1
@Berin Loritsch: Ja, aber zu keinem Zeitpunkt haben sie einfach den gesamten vorhandenen Code weggeworfen und (bei allem) von vorne angefangen , was so ziemlich das ist, was sie hätten tun müssen, um in eine andere Sprache zu konvertieren. Außerdem würden Leute, die C ++ gut genug kannten / kennen, um sich für FF zu entscheiden, wahrscheinlich auf eine andere Sprache wechseln.
Jerry Coffin

2
@Berin Loritsch Quatsch. FF basiert immer noch auf Gecko (1997) und Webkit basiert auf khtml (1998).
Henry

4

Da die Browser (z. B. HotJava, offensichtlich in Java geschrieben), die in anderen Sprachen geschrieben wurden, nie einen wesentlichen Grad an Marktakzeptanz / -durchdringung erreicht haben.

Ich kann nichts über die aktuelle Iteration (oder die jüngste - die schon seit einiger Zeit nicht mehr aktualisiert wurde) von HotJava sagen , aber als ich sie ausprobierte, schien mir die mangelnde Marktdurchdringung (zumindest für mich) äußerst einfach zu verstehen - Es war hässlich, langsam und mit einigen Webseiten nicht vereinbar. Letztendlich schien es auf einer Prämisse zu beruhen, die nie geklärt wurde: Das Web würde hauptsächlich aus Java-Applets bestehen, wobei HTML nur ein Wrapper ist, der angibt, welche Applets wo angezeigt werden sollen.

Ein Teil davon ist wahrscheinlich auch historisch: Die meisten großen Webbrowser gibt es schon lange. Als sie zum ersten Mal geschrieben wurden, war die Landschaft ganz anders: C ++ war eine "heiße" neue Sprache und wurde daher für viele neue Entwicklungen verwendet. Browser sind zu einer der am häufigsten verwendeten Software geworden, während viele andere aus dieser Zeit in Vergessenheit geraten sind.

Ich denke, die gezeigte "Haltung" der Sprache hat auch einen Effekt: C ++ (wie C davor) hat immer auf Praktikabilität und Pragmatismus Wert gelegt. Diese Grundhaltung zieht eher Programmierer an, die auch pragmatisch sind. Viele andere Sprachen legen viel mehr Wert auf Dinge wie Eleganz - und ziehen damit Programmierer an, die genauso denken. Das Problem dabei ist, was ich den "Lisp-Effekt" nenne. Die Symptome umfassen:

  1. Endlose Argumente über die meisten elegante Umsetzung der banalsten Dinge.
  2. Unfähigkeit, Features einzufrieren und etwas fertigzustellen, das versendet werden kann (auch bei Fehlern)
  3. Unfähigkeit zu Kompromissen. Wer mit mir nicht einverstanden ist, liegt nicht nur falsch, sondern muss entweder dumm oder böse sein.

Es gibt noch mehr, aber Sie haben eine allgemeine Vorstellung (und ja, ich übertreibe bis zu einem gewissen Grad - aber nur bis zu einem gewissen Grad). Ja, ein Teil des Codes, den Sie erhalten, wird erstaunlich schön sein - aber es besteht die Möglichkeit, dass er sechs Monate zu spät ist und größtenteils nicht mit jedem anderen Teil des Codes im System kompatibel ist (was eigentlich sein soll), und wenn Sie ihn erhalten, ist er da eine ziemlich faire Chance, dass sich etwas anderes genug geändert hat, dass Sie es überhaupt nicht nutzen können.

Es gibt auch Sprachen, die zweifellos gut funktionieren würden, aber (zu Recht oder zu Unrecht) einfach nicht den Marktanteil haben (oder zum entscheidenden Zeitpunkt nicht hatten), den irgendjemand jemals in ihnen einen Browser geschrieben hätte. Angesichts der Größe und Komplexität eines vollständigen Browsers ist die Entwicklung eines Browsers mit vielen Personen und viel Zeit verbunden. Mit dieser Art von Investition werden viele Leute relativ konservativ gegenüber Dingen wie Entwicklungswerkzeugen.


1
WRT Punkt 3, ich werde auf jeden Fall behaupten, ohne Qualifikation, dass das Schreiben netzseitigen Software in der C - Familie ist entweder dumm oder böse, weil sie mit sich bringt entweder unwissentlich (dumm) oder wissentlich (böse) arbeiten mit einem System weit Sicherheit einzuführen bekannt Löcher, die Ihren Benutzern Schaden zufügen. Es ist moralisch gleichbedeutend damit, einem Soldaten eine Rüstung mit einem darauf gemalten Ziel zu geben.
Mason Wheeler

9
@Mason: Ihre Anzeige genau der fraglichen Bigotterie wird sicherlich geschätzt.
Jerry Coffin

2
@Mason: Quatsch. Eine Sicherheitslücke (die bereits behoben wurde, aber viele Systemadministratoren hatten sich nicht die Mühe gemacht, aktualisierten Code zu installieren) ist noch lange nicht der Beweis dafür, dass jeder in derselben Sprache geschriebene Code "Schaden anrichtet" oder dergleichen. OpenBSD (zum Beispiel) hat eine erheblich bessere Sicherheitsgeschichte als die Pascal-basierte Version von MacOS.
Jerry Coffin

5
@Mason: Nein, das bist du. Erstens hat der Morris-Wurm ein verwendetes Programm ausgenutzt gets, was eine schreckliche Funktion ist, aber kaum unvermeidbar (und mit Sicherheit nicht "grundlegend" für die Sprache oder ähnliches). Zweitens ist C ++ in keinem Fall dieselbe Sprache wie C. Drittens zeigt OpenBSD sehr gut, dass sichere Software in C geschrieben werden kann und ist. Es gibt keinen "zugrunde liegenden Sprachfehler", der verhindert, dass solide, sichere Software in C geschrieben wird. Der winzige Marktanteil von OpenBSD zeigt, dass Sicherheit für die meisten kein großes Problem darstellt Menschen.
Jerry Coffin

6
@Mason: Der Pufferüberlauf getsist eine einfache Folge der Tatsache, dass Sie nicht die Länge des verwendeten Puffers übergeben. Nichts Grundlegendes für die Sprache - Sie könnten dasselbe in Pascal tun (und ich auch). Das Schreiben von Software, die gegen einen intelligenten Angreifer sicher ist, ist unabhängig von der Sprache nicht einfach. Aufgrund der Erfahrung in allen drei ist es in C etwas einfacher als in Pascal und in C ++ viel einfacher als in C.
Jerry Coffin

3

Cargo-Kult-Programmierung. Die Vorstellung, dass "C ++ schnell ist", ist immer noch da draußen (trotz schlecht durchdachter Funktionen auf Sprachebene, wie das schlecht kaputte Objektmodell, das die Dinge verlangsamt), und die Leute möchten, dass ihre Browser schnell sind, also schreiben sie in C ++ .

In einer vernünftigen Welt wären Leute, die Software für Netzwerke schreiben, entsetzt über den bloßen Gedanken, eine Sprache zu verwenden, die mit allen inhärenten Sicherheitsproblemen von C behaftet ist, und tatsächlich wäre dies eine Tat der kriminellen Nachlässigkeit. (Sehen Sie sich nur an, wie viele Pufferüberlauf-Exploits in den letzten 15 Jahren bei verschiedenen Browsern aufgetreten sind. Für wie viele Millionen Dollar Schaden sind diese Codierer verantwortlich?)

Es gibt andere kompilierte Sprachen, die in der Lage sind, schnelle Binärdateien zu erstellen. Das Problem ist, dass sie nicht die gleiche Exposition haben wie die C-Familie, und wir alle müssen darunter leiden.

Wissenswertes: Als der Morris Worm 1988 ins Internet kam, demonstrierte er abschließend die Probleme beim Schreiben von Betriebssystemen und netzwerkbasierter Software in C (die bis heute nicht behoben wurden, weil sie inhärente Sprachfehler sind) Apple hatte das fortschrittlichste Betriebssystem veröffentlicht, das die Welt bisher gesehen hatte, und das bereits seit mehreren Jahren in Pascal geschrieben wurde.


15
Huh? Ich mochte das Mac OS ganz gut, aber es als das fortschrittlichste Betriebssystem der Welt zu bezeichnen, ist albern. Es befand sich nicht einmal im gleichen Umfeld wie UNIX und VMS, geschweige denn in den IBM Big Iron-Systemen: Einzelbenutzer, kein virtueller Speicher, begrenztes Prozessmanagement. Sicher, es hatte ein sehr schönes Fenstersystem, aber auch das war eine Ableitung von Xerox Parc und eine Reihe von akademischen Projekten. Ich denke auch, dass ein Großteil des Mac OS tatsächlich in M68k-Assembly geschrieben wurde. Die Bibliotheken verwendeten die Pascal-Funktionsaufrufstandards, da erwartet wurde, dass Pascal die primäre Anwendungssprache ist.
Charles E. Grant

5
Vor den 2000er Jahren waren Apples Betriebssysteme nicht stabiler als das MS-Äquivalent. Als ich in den 90er Jahren zwei Projekte arbeitete, eines mit Mac OS und eines mit NT, musste ich die gleiche Anzahl von Abstürzen und Neustarts durchführen. Jetzt sind sie alle eine Art C-basierte Sprache. (Apple verwendet Objective-C für seine aktuellen Inhalte). In C-basierten Sprachen ist die Sicherheit möglicherweise schwieriger, aber die Verwendung einer anderen Sprache macht sie nicht plötzlich sicherer.
Berin Loritsch

13
@Mason, die Tatsache, dass der Mac diese Funktionen zu der Zeit nicht benötigte, bedeutet nicht, dass diese unwichtig sind. Sie haben uneingeschränkt festgestellt, dass das Apple-Betriebssystem das fortschrittlichste der Welt ist, aber anscheinend haben Sie wirklich gemeint, dass es die ausgefeilteste Benutzeroberfläche hat. Das ist eine vertretbare Aussage, aber weniger großartig als das, was Sie geschrieben haben. Das Schreiben einer benutzerfreundlichen Benutzeroberfläche ist schwierig. Das Schreiben eines zuverlässigen ausgelagerten Speichersystems ist schwierig. Zu sagen, dass einer wichtiger ist als der andere, ist albern. Consumer Level Computing, wie wir es heute kennen, könnte ohne beides nicht existieren.
Charles E. Grant

5
@Mason: Ihre Erfahrung unterscheidet sich in vielerlei Hinsicht deutlich von der aller anderen. :-)
Jerry Coffin

3
@Mason: LOL bei der Bezugnahme auf Pre-Mac OSX als "Advanced". Apple OS war eine ständige Absturzquelle, nicht zuletzt wegen seines extrem rudimentären Dateisystems.
Anonym Typ

2

Zugriff auf APIs auf Systemebene

Alle Browser müssen sich irgendwann mit dem Betriebssystem verbinden, und die meisten großen Betriebssysteme verfügen über gut etablierte C- und C ++ - APIs und -Bibliotheken. In der Regel ist es einfacher, mit diesen APIs in C oder C ++ zu arbeiten, als Wrapper zu schreiben.


0

Kontrolle und Portabilität

Die meisten der Geschwindigkeitsargumente können in beide Richtungen gehen, aber überall, wo Sie präzise steuern müssen, wie etwas getan wird, regnen viele der höheren Sprachen auf Ihrer Parade. Es gibt Ausnahmen, aber die meisten von ihnen sind nicht plattformübergreifend genug, um in so etwas wie einem Browser zu zählen.


0

Legacy-Kompatibilität - kann alten Code nicht wegwerfen

Es hat nichts mit den Vorzügen von C ++ im Vergleich zu anderen Sprachen zu tun. Sie können mit Sicherheit einen besseren Browser von Grund auf in einer Sprache wie Haskell schreiben. Ein so wichtiges Projekt könnte sogar eine eigene JVM implementieren, wenn einige Leistungsmerkmale garantiert werden müssten. Wie Facebook seinen eigenen PHP-Compiler / Optimierer geschrieben hat.

Ein Browser, der bei nicht standardmäßigen Markups nicht funktioniert, ist schlimmer als nutzlos. Legacy-Kompatibilität ist so kritisch und komplex, dass ein Umschreiben nicht in Frage kommt. Viel Geld und Zeit wird in kampferprobte Sicherheit usw. investiert. Sie können diese Investition nicht einfach wegwerfen. Wieder so, wie Facebook immer noch in PHP geschrieben ist.


Ich kann verstehen, warum die Leute dies vielleicht nicht befürworten, sondern ablehnen? Das ist komisch. Hier ist eine +1 für dich.
Thomas Eding

Du hast einen (kleinen) Punkt, aber dein erster Satz wirft das weg. Natürlich hat es auch mit den Vorzügen von C ++ im Vergleich zu anderen Sprachen zu tun.
Chiel ten Brinke
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.