it-swarm-eu.dev

Proč je většina prohlížečů vyvinuta v C ++

Vypadá to, že většina běžných webových prohlížečů (Firefox, Chrome, Safari) je vyvíjena pomocí C++. Whys je to tak?

101
Nipuna

Dalším způsobem, jak položit otázku, je, jakou podporu potřebuje prohlížeč? Krátký seznam je:

  • Podpora analýzy (potřebná pro pochopení skriptu [X] HTML, CSS a [ECMA/Java])
  • Funkce pro procházení/tlumočení stromů (součást uživatelského rozhraní pro analýzu a vytváření)
  • Podpora pro zrychlenou grafiku
  • Rychlé vytváření sítí
  • Pro pokročilejší prohlížeče: kontrola procesů a izolace paměti mezi stránkami
  • Musí fungovat na všech podporovaných platformách

Většina jazyků má nějakou podporu analýzy. Máte generátory syntaktických analyzátorů pro C, C++, C #, Java atd. Nicméně, C a C++ mají docela pár let náskok před ostatními alternativami, takže algoritmy a implementace jsou vyspělejší. Přístup k akcelerované grafice v Java je bezúspěšný, pokud nemáte nativní rozšíření, aby to fungovalo. WPF na C # poskytuje přístup k akcelerované grafice, ale je příliš nové na to, aby byl vytvořen seriózní prohlížeč) s technologií.

Sítě jsou vlastně nejméně důvody, proč zvolit C++ nad Java nebo C #.) Důvodem je to, že komunikace je mnohokrát pomalejší než zbytek zpracování, které se zobrazí na stránce. omezující faktor je rychlost drátu. Obě Java a C # mají neblokující IO podpora, stejně jako C++), takže ve hře není jasný vítěz tato oblast.

Proč ne Java? Už jste se někdy pokusili vytvořit uživatelské rozhraní s Java? Je to těžkopádné a pomalé ve srovnání s čímkoli jiným, protože je. Žádná zrychlená grafika je také velkým negativem. Sandbox v Javě je opravdu dobrý a pokud je správně používán, může vylepšit zabezpečení prohlížeče, ale je to bolest konfigurace a práce. Nemluvě o podpoře grafického formátu zaostává za většinou moderních prohlížečů.

Proč ne C #? Pokud je vaším jediným cílem Windows, může C # skutečně reprezentovat dobrou reprezentaci. Problém nastává, když chcete podporovat cokoli jiného. Mono nezachytil dost, aby byl pro tento úkol považován za dostatečně multiplatformní - zejména s urychlenou grafickou podporou a WPF. Kdo ví, jak dlouho to bude trvat, než se změní.

Proč ne C? Existuje kompilátor C pro téměř každou platformu venku (včetně zabudovaných zařízení). Existuje však mnoho věcí, které pro vás C ne neudělají, o které budete muset být zvlášť ostražití. Máte přístup ke všem nejnižším úrovním API, ale většina C vývojářů nedělá GUI. I knihovny C GUI jsou psány objektově orientovaným způsobem. Jakmile začnete mluvit s uživatelským rozhraním, objektově orientovaný jazyk začne mít lepší smysl.

Proč ne Cíl C? Pokud je vaším jediným cílem Apple, dává to hodně smysl. Většina vývojářů však nezná Objective-C a jediným důvodem, proč se to naučit, je pracovat na NeXT nebo Apple boxy.) Určitě můžete použít libovolnou knihovnu C s Objective-C a existuje mnoho kompilátorů pro mnoho platforem, ale najít lidi, kteří na něm budou pracovat, bude o něco složitější. Kdo ví? Možná Apple může tento vnímaný nedostatek změnit).

Proč C++? Existuje kompilátor C++ pro téměř každou platformu venku. Téměř každá knihovna GUI má rozhraní C++, někdy je to lepší a někdy je to prostě jiné. Například ATL společnosti Microsoft je mnohem lepší než volání funkcí Win32 C nebo dokonce knihovna MFC. Na Unixu jsou balíčky C++ pro GTK a byl bych překvapen, kdyby někdo kolem CI knihovny Apple Objective-C neměl C++ obal. Řízení procesů je v C++ jednodušší než Java nebo C # (tyto podrobnosti jsou pro vás odebírány). Je to vnímaná rychlost přichází více z hardwarové akcelerace než surový výkon. C++ se stará o více věcí pro vás než surový C (jako jsou ohraničené řetězce), ale stále vám dává svobodu Tweak věci. A to nemluvě o řadě knihoven potřebných k vykreslení webových stránek, jsou také psány v C nebo C++.

Prozatím C++ dělá alternativy Edge.

165
Berin Loritsch

Rozhodl jsem se o tom napsat román v naději, že se lidé nad tím budou lesknout a budou mě informovat. Ne, ne, jen si dělám srandu! Trpěl jsem nad každým Slovem. Každé slovo, říkám vám!

Zeptejte se „kdy“ před „proč“

Všechny hlavní webové prohlížeče mohou sledovat svůj původ až do 90. let. Konqueror se stal Safari a Chrome; Netscape se stal Firefoxem; IE a Opera je stále IE a Opera). Všechny tyto prohlížeče mají 15letý náskok u zavedených společností.

Navrhuji, abyste se dokonce pokusili pojmenovat přijatelný multiplatformový jazyk (Windows/Mac/Unix a ještě horší) jazyk, který byl k dispozici přibližně v roce 1995, když moderní prohlížeče vznikl. Chcete-li vytvořit jádro v čemkoli kromě C/C++, pravděpodobně byste museli budovat nebo kupovat a upravovat knihovny kompilátorů a platforem.

Co takhle dnes? Jaké jsou alternativy?

Jen pro zábavu, přemýšlejme o problému dnes. Ano, existují alternativy, ale stále existují velké problémy.

Volba jazyka představuje alespoň tyto problémy:

  1. Problémy se znalostmi - najímání/školení vývojářů nebo přilákání přispěvatelů
  2. Organizační/sociální problémy - jazyková přijatelnost
  3. Implementace jazyka: Rychlost, podpora platformy, nástroje
  4. Jazyková síla

1: Problémy se znalostmi

Kde získáváte lidi, kteří znají jazyk nebo se ho mohou naučit? To je překážka pro jazyky jako OCaml, F #, Haskell, Common LISP a D, které jsou dostatečně rychlé a na vysoké úrovni, aby mohly prohlížeč psát pěkně, ale mají málo sledovatelů (možná v rozsahu 10 až 100 000), i když jste liberálně počítat všechny fandy a akademiky.

2: Sociální/organizační problémy

Důsledek výše uvedené odpovědi na kulturu nákladu:

  • Prohlížeč s otevřeným zdrojovým kódem, který nepoužívá C, C++, C # nebo Java bude pravděpodobně ) mít potíže s přispěvateli.
  • Proprietární prohlížeč, který nepoužívá C, C++, C # nebo Java), dostane projektové manažery ve většině organizací vážně zařval.

3. Technické problémy

I v moderní době potřebujete poměrně rychlý jazyk pro výpočetně náročné části renderovacích stránek a spuštění Javascriptu. Můžete se rozhodnout doplnit tento jazyk na vysoké úrovni pro vytváření prvků grafického uživatelského rozhraní atd. (Např. Přístup Firefoxu v C++ a Javascript), ale mezi jazyky musíte mít úzkou integraci; nemůžete jen říct "Dobře, C # a Lua." Pravděpodobně budete muset sami sestavit a ladit tento most, pokud nevyberete jako základní jazyk C nebo C++.

Vývoj napříč platformami je další pytel červů. Dalo by se použít C # nebo F # a překročit prsty, aby byly GTK # a Mono v budoucnu naživu a dobře. Můžete zkusit Common LISP, Haskell, OCaml ... Hodně štěstí, že vše bude fungovat na Windows a Mac a Linux.

4. Jazyková síla

Po tom všem musíte vybudovat obrovské množství funkcí, takže pokud zvolíte jazyk nízké úrovně, budete potřebovat ještě silnější armádu kodérů než dříve. Všimněte si, že za asi patnáct let nikdo nevytvořil prohlížeč od nuly. To je částečně proto, že (překvapení!) Je to těžké.

Konkrétně má s interpretem Javascript problém 3 (získejte jeden) nebo problém 4 (vytvořte jeden).

Závěr:

Pokud jste dnes vyvinuli prohlížeč se třemi platformami (Windows/Mac/* nix) (začátkem roku 2011), jaké jsou možnosti?

  • C: Viz (2). Všichni se budou dožadovat C++. Bavte se výběrem sady platforem pro různé platformy nebo sestavením sady (1, 2, 3 a 4). Viz také (4); bavte se v něm budováním stabilního a bezpečného prohlížeče.
  • C++: Bavte se výběrem sady platforem pro různé platformy nebo sestavením jednoho (1, 2, 3 a 4). Bavte se (4) vytvářením stabilního a bezpečného prohlížeče.
  • C nebo C++ a HLL: Vaše nejlepší sázka. Vyberte si jed v dynamickém jazyce; Viz (1) a (2). Příliš mnoho dobrých jazyků, z nichž každý má příliš málo následovníků. (1, 2, 3 a 4) na sadě nástrojů.
  • Java: Druhá nejlepší sázka, pokud musíte potěšit střední správu. Viz (4); vytváření obrovských věcí v Java vyžaduje mnohem více kódu než v čemkoli jiném na tomto seznamu, ale možná C.
  • Scala: Beats Java on (4); (1) a (2), ale to se blíží.
  • C a Javascript: Jako zvláštní případ je to přitažlivé, protože již musíte vytvořit nebo získat a asimilovat tlumočníka jazyka Javascript. (Tedy Firefox.) (1, 2, 3 a 4) na sadě nástrojů; lidé Mozilly si vybudovali vlastní IIRC.
  • C #: Bavte se na (3). Pravděpodobně jste uvízli v GTK #, ať už je to dobré, nebo si stavíte vlastní vrstvu a vykreslovač nad GTK # a Windows Forms.
  • Ruby/Python/Perl/Raketa/Lua/Erlange atd .: Máte (3) na multiplatformových knihovnách a rychlostech. Mooreův zákon je s vámi na (4); rostoucí poptávka po prohlížečích je proti vám.
  • OCaml, Haskell, obyčejný LISP, Smalltalk: (1) a (2) v rýčích. Pravděpodobně žádné problémy s rychlostí, ale (3) pro vývoj napříč platformami, a budete si muset sami vytvořit všechno nebo nějakým způsobem propojit knihovny C/C++.
  • Cíl-C: (3) Nejsem si jistý, jak by se v této platformě objevil vývoj napříč platformami.

Pokud v příštích několika letech uvidíme další velký nárůst prohlížeče, vsadil bych se, že bude napsán v C nebo C++ a dynamický jazyk (jako Firefox), ať už jde o open source nebo proprietární.

Úpravy (31. července 2013): Zdá se, že komentátoři Hacker News uvádějí Rust a Go (nikoli konkrétně ve spojení s mou odpovědí)), které se vágně dostávají do "různé rychlé" kbelík. Snažit se udržet tento seznam jazyků rovnostářský a aktuální bude prohrávající bitvou, takže místo toho nazývám reprezentativním vzorkem v době psaní a ponecháváním na pokoji.

89
Jesse Millikan

Rychlost

Jak ošklivé, jak to je, C++ je stále to, co používáte, když chcete rychlou aplikaci a plnou kontrolu nad kódem.

To je důvod, proč hry, nepodstatné části (například dovozci souborů) sady Office a další jsou stále psány v jazyce C++.

Upraveno tak, aby zahrnovalo odpověď od MSalters

36
Ryan Hayes

Přenosnost

Mohu jen hádat, ale zmiňujete softwarové produkty, které cílí na více platforem, a C++ lze kompilovat na jakoukoli platformu.

17
Pete

(Na Firefoxu pracuji asi pět let.)

Tazatel má pravdu, že hodně kódu Firefoxu je C++ a ve skutečnosti je C++ většina, pokud počítáte řádky kódu (i když to neříká celý příběh, protože máme hodně JavaScriptu a JS je více stručné než C++).

Ve skutečnosti je však Firefox napsán v mnoha různých jazycích:

  • C++
  • C (NSS, NSPR, various libraries we've imported)
  • x86 a ARM Shromáždění
  • JavaScript
  • XUL (značkovací jazyk podobný HTML) a CSS
  • Cíl C (kód pouze pro MacOS)
  • Java (pouze pro Android)
  • Více vlastních jazyků definujících rozhraní (XPIDL, IPDL)
  • WebIDL (jiný jazyk pro definici rozhraní, ale tento není vlastní, přestože je generátor kódu)
  • Python (generátory kódu)

Určitě na některé zapomenu.

Tento seznam je důležitý, protože naznačuje neuvěřitelnou složitost, která se nachází za webovým prohlížečem.

Ano, Firefox má spoustu kódu C++ a ano, má to něco společného s tím, že C++ byl při založení Netscape nejlepším jazykem pro tento druh věcí. Ale také tvrdím, že dnes neexistuje lepší jazyk pro mnoho toho, co děláme.

Žádný jiný jazyk nemá tak silný ekosystém knihoven (spoléháme na externí kód). Několik dalších jazyků vám dává plnou kontrolu nad zásobníkem, jako je C++ (pravidelně upravujeme náš vlastní alokátor haldy a děláme nejrůznější věci, které nejsou bezpečné pro paměť, aby byly rychlejší nebo používaly méně paměti). Jen málo dalších jazyků vám umožňuje znovu implementovat většinu standardní knihovny rozumným způsobem (máme vlastní implementace řetězců a sbírek přizpůsobených našim potřebám). Několik dalších jazyků vám umožní implementovat svůj vlastní sběratel odpadu. A tak dále.

Ačkoli je C++ jasnou volbou pro spoustu toho, co děláme, lidé, kteří navrhují, abychom mohli napsat prohlížeč v Java a napsat vlastní JVM, pokud je to nutné), jsou na něčem. co děláme, ale pomocí JavaScriptu místo Java. Samozřejmě, že většina prohlížeče není napsána v JavaScriptu, ale překvapivé množství je.

13
Justin L.

No, museli byste se zeptat vývojářů těchto produktů přímo, aby dostali odpověď the, ale mám podezření, že je to kombinace důvěrnosti (to je to, co tito vývojáři věděli nejlépe), výkonu (kompilace do nativního binárního kódu) na rozdíl od bytecode) a nástrojů (ve srovnání s jazyky jako C, C++ je plná pěkných miniaplikací šetrných k práci, jako je STL).

12
John Bode

Dějiny

Každý z prohlížečů má určitou historii, která ovlivnila výběr jazyka.

Například jak Chrome, tak Safari jsou založeny na WebKit, který má svůj původ v části KHTML projektu KDE. KDE původně byl vytvořen (částečně) jako ukázka sady nástrojů Qt GUI, takže KDE je celkově projekt C++. Všechny nové projekty KDE byly v té době psány výhradně v C++, takže to byla logická volba pro KHTML. Od té doby byl portován k použití dalších nástrojů GUI.

Opera Presto engine byl napsán s výkonem a malou binární velikostí: C++ byla logická volba.

Microsoft IE byl napsán jako kolekce komponent ActiveX, které mohly být napsány v jakémkoli jazyce, který má vazby COM, ale pravděpodobně byl napsán v podskupině C++, protože většina jejich kódové základny je již napsané v tomto jazyce.

Mozilla Netscape byla napsána v jazyce C++ pravděpodobně proto, že přenositelnost byla jejich hlavním problémem. Kompilátory C a C++ jsou (prakticky) všudypřítomné, takže to byla logická volba.

Neexistuje žádný vlastní technický důvod pro tyto volby. „V té době to vypadalo jako dobrý nápad.“

10
greyfade

Sítě v C a C++ lze snadno optimalizovat, protože pokud to nechcete, nemusíte používat knihovny. Mám podezření, že jazyk C++ je jazykem volby, protože umožňuje výhody jazyka C:

  • Rychlost
  • Optimalizace
  • Určitá přenositelnost
  • Kompilovaný jazyk, není interpretován

ve spojení s výhodami OOP:

  • Rozšiřitelnost
  • Snadnější vizualizace
  • Lepší podpora knihovny pro nekritické úkoly, jako je zpracování řetězců a datové struktury
8
Michael K

Když byly zapsány první řádky kódu pro první kolo prohlížečů, C # a Java neexistovala. Ruby. Python) možná tam bylo, ale v tom okamžiku to byl ještě malý homebrejský projekt.

Zjednodušeně řečeno, existuje nebyly jiné možnosti jiné než C++, které by člověku umožnily vytvořit prohlížeč, který by byl rychlý a fungoval na mnoha různých platformách.

Tak proč byly napsány v C++? Protože to byl jediný dostupný jazyk, do kterého se dalo psát.

4
GrandmasterB

Protože prohlížečům (např. HotJava, zjevně dostatečně napsaným v Javě) psaným v jiných jazycích nebylo nikdy dosaženo významného stupně tržního přijetí/penetrace.

Nemohu říci nic o aktuální iteraci (nebo poslední - nebyl aktualizován za chvilku) HotJavy, ale když jsem to zkusil, zdálo se, že se nedostane na trh (alespoň) pro mě) velmi snadno srozumitelné - bylo to ošklivé, pomalé a nekompatibilní s několika webovými stránkami. Nakonec to vypadalo, že je založeno na předpokladu, který se nikdy nevysunul: že web by sestával především z appletů Java), s HTML tak trochu víc, než jen obalem, který řekne, které applety se mají zobrazit.

Část z toho je pravděpodobně také historická: většina velkých webových prohlížečů byla již dlouhou dobu. Když byly poprvé napsány, krajina byla hodně odlišná: C++ byl „horký“ nový jazyk, takže se používal pro mnoho nového vývoje. Prohlížeče se staly nejpoužívanějším softwarem v okolí, zatímco mnoho dalších od té doby zaniklo v zapomnění.

Myslím, že zobrazený „postoj“ jazyka má také účinek: C++ (jako předtím C) vždy zdůrazňoval praktičnost a pragmatismus. Tento základní postoj má tendenci přilákat programátory, kteří jsou také pragmatičtí. Mnoho dalších jazyků klade mnohem větší důraz na věci, jako je elegance - a tak přitahují programátory, kteří myslí stejným způsobem. Problém s tím je to, čemu říkám „efekt LISP“. Mezi příznaky patří:

  1. Nekonečné argumenty o nejvíce elegantní implementaci nejzávažnějších věcí.
  2. Neschopnost zmrazit funkce a dokončit něco, co může být dodáno (i s nedostatky)
  3. Neschopnost kompromisu. Každý, kdo se mnou nesouhlasí, se nejen mýlí, ale musí být hloupý nebo zlý.

Existuje více, ale získáte obecnou představu (a ano, do určité míry přehání - ale jen do určité míry). Ano, některé z kódů, které dostanete, budou úžasně krásné - ale je pravděpodobné, že je to o šest měsíců pozdě, a většinou nekompatibilní s každým dalším kódem v systému (co má být) a v době, kdy jej obdržíte, docela férová šance, že se něco jiného změnilo natolik, že je nemůžete vůbec použít.

Existují také jazyky, které by nepochybně fungovaly dobře, ale (správně nebo nesprávně) prostě nemají (nebo v rozhodující době neměly) tržní podíl pro kohokoli, kdo by v nich napsal prohlížeč. Vzhledem k velikosti a složitosti kompletního prohlížeče to vyžaduje spoustu lidí a trochu času na jejich vývoj. S takovou investicí mnoho lidí získává relativně konzervativní věci, jako jsou vývojové nástroje.

4
Jerry Coffin

Programování nákladního kultu. Vnímání, že „C++ je rychlý“, stále existuje (navzdory špatně promyšleným funkcím na úrovni jazyka, jako je jeho špatně poškozený objektový model, který zpomaluje věci) a lidé chtějí, aby jejich prohlížeče byly rychlé, takže píšou v C++ .

Ve zdravém světě by lidé, kteří píšou software zaměřený na síť, byli vyděšeni pouhou myšlenkou, že budou používat jazyk, který je otravován všemi bezpečnostními problémy C, a ve skutečnosti by to byl skutek trestné nedbalosti. (Jen se podívej, kolik využití přetečení vyrovnávací paměti bylo zjištěno proti různým prohlížečům za posledních 15 let! Za kolik milionů dolarů poškození jsou tito kodéři zodpovědní?)

Existují i ​​jiné kompilované jazyky schopné vytvářet rychlé binární soubory. Problém je v tom, že nemají stejnou expozici jako rodina C, a my všichni za to musíme trpět.

Zábavný fakt: V době, kdy Morris Worm zasáhl internet v roce 1988, přesvědčivě demonstroval problémy se zápisem operačních systémů a softwaru orientovaného na síť v jazyce C (které dosud nebyly vyřešeny dodnes, protože mají vlastní jazykové nedostatky) ,) Apple uvolňoval nejpokročilejší operační systém, jaký svět dosud viděl, již několik let, napsaný v Pascalu.

3
Mason Wheeler

Přístup k systémovým rozhraním API

Všechny prohlížeče musí být v určitém okamžiku propojeny s operačním systémem a většina hlavních operačních systémů má zavedené API a knihovny C a C++. Obvykle je jednodušší pracovat s těmito API v C nebo C++ než psát obálky.

2
TMN

Starší kompatibilita - starý kód nelze zahodit

Nemá to nic společného s podstatou C++ vs jinými jazyky. Určitě můžete napsat lepší prohlížeč od nuly v jazyce jako Haskell; projekt, který by tento důležitý mohl dokonce implementovat vlastní JVM, pokud by potřeboval zaručit určité výkonové charakteristiky. Jako Facebook napsal svůj vlastní kompilátor/optimalizátor PHP kompilátor/optimalizátor).

Prohlížeč, který se pokazí na nestandardním označení, je horší než zbytečný. Původní kompatibilita je tak kritická a tak složitá, že přepsání prostě není možnost. Spousta peněz a času je investována do bitevně testovaného zabezpečení atd., Tuto investici nemůžete jen tak zahodit. Stejně jako je Facebook stále napsaný v PHP.

0
Dustin Getz

Řízení a přenositelnost

většina argumentů o rychlosti může jít obousměrně, ale v čemkoli, kde potřebujete přesnou kontrolu nad tím, jak se něco udělá, bude mnoho vašich jazyků vyšší úrovně pršet na vašem průvodu. Existují výjimky z toho, ale většina z nich není dostatečně napříč platformami, aby mohla počítat s něčím, jako je prohlížeč.

0
Bill