Dlaczego większość przeglądarek jest opracowana w C ++ [zamknięto]

99

Wygląda na to, że większość popularnych przeglądarek internetowych (Firefox, Chrome, Safari) jest rozwijana przy użyciu C ++. Dlaczego tak jest?

Nips
źródło
28
Firefox jest napisany w C ++ i JavaScript, nie tylko w C ++.
Jesse Millikan,
1
To pytanie prawdopodobnie będzie miało kilka szybkich odpowiedzi, przy założeniu, że jest poprawne (zwróć uwagę na komentarz Jessego na temat Firefoksa, a oprócz tych trzech i IE istnieje wiele przeglądarek). Nie sądzę, żeby to było produktywne.
David Thornley,
1
Czy to odpowiednia grupa dla tego pytania?
Martin York,
6
@Jesse nie jest tłumaczem js napisanym w C ++? To by sprawiło, że wszystko C ++, nie? (Mogę się mylić ..)
cambraca
5
@cambraca, z tą logiką wszystko jest kodem asemblera!
Juan Mendes

Odpowiedzi:

165

Innym sposobem na zadanie pytania jest to, jakiego rodzaju wsparcia potrzebuje przeglądarka? Krótka lista to:

  • Obsługa parsowania (potrzebne do zrozumienia [X] HTML, CSS i [ECMA / Java] Script)
  • Funkcje chodzenia / tłumaczenia drzewa (część parsowania i budowania interfejsu użytkownika)
  • Obsługa przyspieszonej grafiki
  • Szybka sieć
  • W przypadku bardziej zaawansowanych przeglądarek: kontrola procesów i izolowanie pamięci między stronami
  • Musi działać na wszystkich obsługiwanych platformach

Większość języków ma wbudowaną obsługę analizowania. Masz generatory analizatora składni dla C, C ++, C #, Java itp. Jednak C i C ++ mają sporo lat przewagi nad pozostałymi alternatywami, więc algorytmy i implementacje są bardziej dojrzałe. Dostęp do przyspieszonej grafiki w Javie jest oczywisty, chyba że masz jakieś natywne rozszerzenia, aby to działało. WPF na C # zapewnia dostęp do przyspieszonej grafiki, ale jest zbyt nowy, aby mieć poważną przeglądarkę zbudowaną z tą technologią.

Praca w sieci to właściwie najmniejszy powód, aby wybrać C ++ zamiast Java lub C #. Powodem jest to, że komunikacja jest wielokrotnie wolniejsza niż reszta przetwarzania, które odbywa się w celu wyświetlenia strony. Prędkość wstępna drutu jest czynnikiem ograniczającym. Zarówno Java, jak i C # mają nieblokującą obsługę IO, podobnie jak C ++. Więc naprawdę nie ma wyraźnego zwycięzcy w tej dziedzinie.

Dlaczego nie Java? Czy kiedykolwiek próbowałeś zbudować interfejs użytkownika w Javie? Jest nieporęczny i powolny w porównaniu z czymkolwiek innym, ponieważ tak jest. Brak przyspieszonej grafiki również jest tutaj dużym negatywem. Piaskownica Javy jest naprawdę dobra i może pomóc poprawić bezpieczeństwo przeglądarki, jeśli jest używana poprawnie, ale konfiguracja i uruchomienie jest uciążliwe. Nie wspominając o obsłudze formatu graficznego w tyle za większością współczesnych przeglądarek.

Dlaczego nie C #? Jeśli twoim jedynym celem jest Windows, C # może faktycznie stanowić dobrą reprezentację. Problem pojawia się, gdy chcesz wesprzeć coś innego. Mono nie nadrobiło wystarczająco dużo, aby uznać go za wystarczające dla wielu platform do tego zadania - szczególnie z przyspieszoną obsługą grafiki i WPF. Kto wie, ile czasu zajmie zmiana.

Dlaczego nie C? Istnieje kompilator C dla prawie każdej platformy (w tym urządzeń wbudowanych). Jest jednak wiele rzeczy, których C nie robi dla ciebie, na które musisz być bardzo czujny. Masz dostęp do wszystkich najniższych poziomów interfejsów API, ale większość programistów C nie robi GUI. Nawet biblioteki C GUI są pisane w sposób obiektowy. Gdy tylko zaczniesz mówić o interfejsie użytkownika, język obiektowy zaczyna mieć lepszy sens.

Dlaczego nie Cel C? Jeśli twoim jedynym celem jest Apple, ma to sens. Jednak większość programistów nie zna Objective-C, a jedynym powodem, aby się tego nauczyć, jest praca na NeXT lub Apple. Na pewno możesz używać dowolnej biblioteki C z Objective-C, i istnieją kompilatory dla wielu platform, ale znalezienie ludzi do pracy będzie trudniejsze. Kto wie? Może Apple może odwrócić ten postrzegany niedobór.

Dlaczego C ++? Istnieje kompilator C ++ dla prawie każdej platformy. Prawie każda biblioteka GUI ma interfejs C ++, czasem jest lepszy, a czasem po prostu inny. Na przykład ATL Microsoftu jest znacznie lepszy niż wywołania funkcji win32 C lub nawet biblioteka MFC. Na Uniksie istnieją opakowania C ++ dla GTK i byłbym zaskoczony, gdyby ktoś nie miał opakowania C ++ wokół biblioteki GUI Apple Objective-C. Zarządzanie procesami w C ++ jest łatwiejsze niż Java lub C # (te szczegóły są dla ciebie abstrakcyjne). Szybkość odbierana jest bardziej z przyspieszenia sprzętowego niż z surowej wydajności. C ++ dba o więcej rzeczy dla ciebie niż surowe C (takie jak ograniczone łańcuchy), ale nadal daje ci swobodę do poprawiania rzeczy.

Na razie C ++ przewyższa alternatywy.

Berin Loritsch
źródło
4
Dla platform innych niż Apple i innych niż NeXT dostępna jest kolekcja GNUStep. Jest w większości kompatybilny z kakao i jest cholernie blisko.
greyfade
5
Pamiętaj, że Java nie może używać Swinga (który jest kiepską biblioteką) dla GUI. Na przykład mamy powiązania Qt.
Anto
2
Według my.opera.com/kilsmo/blog/2008/01/29/opera-is-not-based-on-qt Opera nie jest oparta na Qt
Anto
2
Nigdy nie mówiłem, że Opera jest oparta na Qt. Chciałem zasugerować, że niewolna przeglądarka jest naprawdę trudna do sprzedania, gdy istnieje tak wiele doskonałych bezpłatnych opcji.
Berin Loritsch,
7
Dostępność generatorów analizatorów składni nie jest tak istotna - we wszystkich przeglądarkach analizatory składni HTML, XML i JS są pisane ręcznie, a CSS jest w niektórych.
gsnedders
89

Postanowiłem napisać o tym powieść w nadziei, że ludzie będą się nad nią zastanawiać i głosować. Nie, nie, tylko żartuję! Cierpiałem nad każdym słowem. Każde słowo, mówię wam!

Zapytaj „kiedy” przed „dlaczego”

Wszystkie główne przeglądarki internetowe mogą prześledzić swoje pochodzenie od lat 90. Konqueror stał się Safari i Chrome; Netscape stał się Firefox; IE i Opera to wciąż IE i Opera. Wszystkie te przeglądarki mają 15 lat przewagi nad operatorami zasiedziałymi.

Sugeruję nawet, abyś spróbował nazwać akceptowalny język wieloplatformowy (Windows / Mac / Unix i jeszcze gorzej), który był dostępny około 1995 roku, kiedy powstały nowoczesne przeglądarki. Aby zbudować rdzeń w czymkolwiek innym niż C / C ++, prawdopodobnie musiałbyś zbudować lub kupić i zmodyfikować kompilator i biblioteki platform.

Może dzisiaj? Jakie są alternatywy?

Dla zabawy zastanówmy się dzisiaj nad problemem. Tak, istnieją alternatywy, ale nadal istnieją poważne problemy.

Wybór języka przedstawia co najmniej następujące problemy:

  1. Problemy z wiedzą - zatrudnianie / szkolenie programistów lub pozyskiwanie współpracowników
  2. Problemy organizacyjne / społeczne - akceptacja języka
  3. Implementacja języka: szybkość, obsługa platformy, narzędzia
  4. Moc językowa

1: Problemy z wiedzą

Skąd czerpiesz ludzi, którzy znają język lub mogą go nauczyć? Jest to przeszkodą dla języków takich jak OCaml, F #, Haskell, Common Lisp i D, które są szybkie i na wysokim poziomie, aby ładnie pisać przeglądarkę, ale mają niewielu obserwujących (być może w zakresie od 10 000 do 100 000), nawet jeśli masz swobodę policz wszystkich hobbystów i naukowców.

2: Problemy społeczne / organizacyjne

Następstwem powyższej odpowiedzi dotyczącej kultu ładunków:

  • Przeglądarka open source, która nie używa C, C ++, C # lub Java, prawdopodobnie będzie miała problemy z współpracownikami.
  • Zastrzeżona przeglądarka, która nie korzysta z C, C ++, C # lub Java, spowoduje, że menedżerowie projektów będą mocno krzyczeć w większości organizacji.

3. Problemy techniczne

Nawet w dzisiejszych czasach potrzebny jest dość szybki język do intensywnych obliczeń części renderowania stron i uruchamiania Javascript. Możesz wybrać uzupełnienie go o język wysokiego poziomu do tworzenia elementów GUI itp. (Np. Podejście C ++ i JavaScript do Firefoksa), ale musisz mieć ścisłą integrację między językami; nie możesz po prostu powiedzieć „OK, C # i Lua”. Prawdopodobnie będziesz musiał sam zbudować i debugować ten most, chyba że wybierzesz C lub C ++ jako język podstawowy.

Rozwój wielu platform to kolejna torba robaków. Możesz użyć C # lub F # i trzymać kciuki za GTK #, a Mono żyje i ma się dobrze w przyszłości. Można spróbować Common Lisp, Haskell, SML ... Powodzenia wszystko działa na Windows i Mac i Linux.

4. Moc językowa

Po tym wszystkim musisz zbudować ogromną liczbę funkcji, więc jeśli wybierzesz język niskiego poziomu, potrzebujesz jeszcze potężniejszej armii programistów niż wcześniej. Zauważ, że nikt tak naprawdę nie zbudował przeglądarki od zera od około piętnastu lat. Po części dlatego, że (niespodzianka!) Jest ciężko.

W szczególności posiadanie interpretera JavaScript to problem 3 (zdobądź jeden) lub problem 4 (zbuduj jeden).

Wniosek:

Jeśli dzisiaj opracowałeś trzyplatformową (Windows / Mac / * nix) przeglądarkę (początek 2011 r.), Jakie są niektóre opcje?

  • C: Patrz (2). Wszyscy będą się starać o C ++. Baw się dobrze, wybierając międzyplatformowy zestaw narzędzi lub budując go (1, 2, 3 i 4). Zobacz także (4); baw się dobrze, budując w nim stabilną, bezpieczną przeglądarkę.
  • C ++: Baw się dobrze, wybierając międzyplatformowy zestaw narzędzi lub budując go (1, 2, 3 i 4). Baw się dobrze (4) budując w nim stabilną, bezpieczną przeglądarkę.
  • C lub C ++ i HLL: Twój najlepszy zakład. Wybierz swoją truciznę w dynamicznym języku; Zobacz (1) i (2). Zbyt wiele dobrych języków, zbyt mało obserwujących każdego z nich. (1, 2, 3 i 4) w zestawie narzędzi.
  • Java: Drugi najlepszy zakład, jeśli musisz zadowolić kierownictwo średniego szczebla. Zobacz (4); budowanie ogromnych rzeczy w Javie wymaga o wiele więcej kodu niż w jakimkolwiek innym miejscu na tej liście, ale może C.
  • Scala: Beats Java on (4); (1) i (2), ale się dogania.
  • C i JavaScript: W szczególnym przypadku jest to atrakcyjne, ponieważ musisz już zbudować, nabyć i przyswoić interpreter JavaScript. (Stąd Firefox.) (1, 2, 3 i 4) w zestawie narzędzi; naród Mozilli zbudował swój własny IIRC.
  • C #: Baw się dobrze na (3). Prawdopodobnie utknąłeś z GTK #, niezależnie od tego, jak dobre to jest, lub budowanie własnej warstwy i renderera powyżej GTK # i Windows Forms.
  • Ruby / Python / Perl / Racket / Lua / Erlange itp .: Masz (3) bibliotek i widżetów między platformami. Prawo Moore'a jest z tobą na (4); rosnące zapotrzebowanie na przeglądarki jest przeciwko tobie.
  • OCaml, Haskell, Common Lisp, Smalltalk: (1) i (2) w pikach. Prawdopodobnie nie ma problemów z prędkością, ale (3) w przypadku programowania wieloplatformowego i będziesz musiał zbudować wszystko lub połączyć się z bibliotekami C / C ++.
  • Cel C: (3) Nie jestem pewien, jak by to działało tutaj tworzenie platform.

Jeśli zobaczymy, że kolejna duża przeglądarka wzrośnie w ciągu najbliższych kilku lat, założę się, że będzie napisana w C lub C ++ i dynamicznym języku (jak Firefox), czy to open source, czy zastrzeżonym.

Edytuj (31 lipca 2013 r.) : Komentatorzy Hacker News wydają się wspominać o Rust i Go (nie specjalnie w związku z moją odpowiedzią), które niejasno wchodzą w zakres „różnych szybkich”. Próba utrzymania tej listy języków na poziomie egalitarnym i aktualnym będzie przegraną bitwą, dlatego nazywam ją reprezentatywną próbką w chwili pisania i pozostawiania jej samej.

Jesse Millikan
źródło
4
+1 za to, że KIEDY pierwsza przeglądarka została opracowana, również odgrywa znaczącą rolę.
Sparky,
3
Warto zauważyć, że chociaż IE może nie być dziś wieloplatformowa , z pewnością miała miejsce kiedyś, a jej obecny udział w rynku prawie na pewno pochodzi (przynajmniej częściowo) z tej zdolności międzyplatformowej.
Jerry Coffin
2
Zauważ, że IE był kiedyś wieloplatformowy wokół IE4.
JasonFruit
2
+1 za kiedy. To jest jedyny powód. Gdyby dziś ktoś rozpoczął projekt przeglądarki, najprawdopodobniej nie używałby C ++
Henry
4
@Henry, jest mało prawdopodobne, że wykluczyliby używanie C ++. Odpowiedź wskazuje, że C ++ nadal będzie częścią układanki.
Anonimowy wpisz
36

Prędkość

Choć jest to brzydkie, C ++ jest nadal tym, czego używasz, gdy potrzebujesz szybkiej aplikacji i pełnej kontroli nad kodem.

Właśnie dlatego gry, części inne niż podstawowe (takie jak importery plików) pakietu Office i inne są nadal pisane w C ++.

Edytowane w celu uwzględnienia odpowiedzi od MSalters

Ryan Hayes
źródło
3
Poza grami nie wierzę, że z tych powodów te aplikacje są napisane w C ++. Chociaż jeśli masz wiedzę z pierwszej ręki, cieszę się, że udowodniono mi błąd.
Henry
2
wiedza z pierwszej ręki? VS 2010, Office 2010 to ogromne pakiety aplikacji, ale są niezwykle szybkie w tym, co robią. Chociaż oba mają dość duże dziedzictwo COM i dziedzictwo MS, wydajność jest nadal najważniejsza dla użytkowników.
Anonimowy wpisz
8
W czym jeszcze napisane byłoby biuro? VB? C i C ++ to jedyne opcje dla Microsoft do pisania dużych aplikacji. Nie mów C # proszę
Toby Allen
4
@Victor: Nie widziałem źródła VS2010, więc bardzo dobrze może być napisane całkowicie w C #.
Ryan Hayes
3
Jeśli pakiet Office jest aplikacją C #, dlaczego oryginalna wstążka była kontrolką MFC i musieliśmy czekać wieki na opracowanie wersji C #? żadna z tych ogromnych aplikacji nie zostanie przepisana w języku C #, zostaną one opakowane w GUI WPF (jak VS2010), a większość starego kodu zostanie ponownie użyta. Nawet stwardnienie rozsiane nie ma zasobów, aby całkowicie przepisać swoje największe aplikacje - nie, jeśli chcą spędzić czas na dodawaniu do nich funkcji.
gbjbaanb
17

Ruchliwość

Mogę tylko zgadywać, ale wspominasz o oprogramowaniu przeznaczonym dla wielu platform, a C ++ można skompilować na dowolną platformę.

Pete
źródło
+10 - Myślę, że jest to PRAWDZIWY powód, dla którego większość przeglądarek jest w C ++ z wyjątkiem IE. Większość przeglądarek działa na wielu platformach i istnieje niewiele języków / platform, które mogą działać na tym samym poziomie ORAZ być kompatybilne z wieloma platformami.
Jordan Parmer
Na początku też tak myślałem, ale w przypadku aplikacji zorientowanej na GUI, takiej jak przeglądarka internetowa. Czy C ++ jest naprawdę o wiele bardziej przenośny dla innych systemów operacyjnych niż Java?
JohnFx
1
Czy przeglądarka jest tak naprawdę zorientowana na GUI?
Kris Van Bael
@JohnFx - Prawidłowo, część GUI prawdopodobnie nie jest tak przenośna. Ale rdzeniem np. Aplikacji przeglądarki jest obsługa HTML, tworzenie drzew DOM, parsowanie javascript i wykonywanie go wystarczająco szybko. Dobrze zaprojektowana aplikacja może z łatwością współdzielić ten sam rdzeń i mieć inny kod interfejsu użytkownika dla każdej platformy. I tak, C ++ jest znacznie bardziej przenośny niż Java (ale bez GUI), ponieważ dla C ++ potrzebujesz tylko kompilatora ukierunkowanego na procesor. Do Java potrzebujesz pełnej frameworka.
Pete
Rozumiałem, że większość odwagi w przetwarzaniu HTML jest wykonywana przez kilka podstawowych narzędzi, takich jak WebKit. Być może dzieje się tak, ponieważ wszystkie przeglądarki są w C ++?
JohnFx
13

(Pracuję nad Firefoksem od około pięciu lat.)

Pytający ma rację, że znaczna część kodu Firefoksa to C ++, a tak naprawdę C ++ jest większość, jeśli liczymy według linii kodu (choć to nie mówi całej historii, ponieważ mamy dużo JavaScript, a JS jest bardziej zwięzłe niż C ++).

Ale w rzeczywistości Firefox jest napisany w wielu różnych językach:

  • C ++
  • C (NSS, NSPR, różne biblioteki, które zaimportowaliśmy)
  • Montaż x86 i ARM
  • JavaScript
  • XUL (język znaczników podobny do HTML) i CSS
  • Cel C (kod tylko MacOS)
  • Java (kod tylko dla Androida)
  • Wiele niestandardowych języków definicji interfejsu (XPIDL, IPDL)
  • WebIDL (inny język definicji interfejsu, ale ten nie jest niestandardowy, chociaż generator kodu jest)
  • Python (generatory kodu)

Na pewno trochę zapomniałem.

Ta lista jest ważna, ponieważ wskazuje na niesamowitą złożoność przeglądarki.

Tak, Firefox ma dużo kodu C ++ i tak, ma to coś wspólnego z faktem, że C ++ był najlepszym językiem do tego typu rzeczy, kiedy powstał Netscape. Ale twierdzę również, że nie istnieje dziś lepszy język dla wielu naszych działań.

Żaden inny język nie ma tak silnego ekosystemu bibliotek (polegamy głównie na kodzie zewnętrznym). Niewiele innych języków daje ci pełną kontrolę nad stosami, jak C ++ (regularnie poprawiamy nasz niestandardowy alokator sterty i robimy różne rzeczy niebezpieczne dla pamięci, aby być szybszymi lub zużywać mniej pamięci). Kilka innych języków pozwala na ponowne wdrożenie większości standardowej biblioteki w rozsądny sposób (mamy własne implementacje ciągów i kolekcji, dostosowane do naszych potrzeb). Kilka innych języków pozwala wdrożyć własny moduł czyszczenia pamięci. I tak dalej.

Chociaż C ++ jest oczywistym wyborem dla wielu naszych działań, ludzie, którzy sugerują, że moglibyśmy napisać przeglądarkę w Javie i napisać własną JVM, jeśli to konieczne, są w czymś zainteresowani. Zasadniczo to robimy, ale z JavaScript zamiast Java. Oczywiście większość przeglądarki nie jest napisana w JavaScript. Ale zaskakująca jest.

Justin L.
źródło
Czy te niebezpieczne dla pamięci działania są źródłem problemów bezpieczeństwa?
Demi
12

Cóż, trzeba by zapytać twórców tych produktów bezpośrednio dostać się na odpowiedź, ale podejrzewam, że to połączenie znajomości (to, co te programiści wiedzieli najlepiej), wydajność (kompilacja z natywnym formacie binarnym w przeciwieństwie do kodu bajtowego), oraz narzędzia (w porównaniu do języków takich jak C, C ++ jest pełen fajnych gadżetów oszczędzających pracę, takich jak STL).

John Bode
źródło
10

Historia

Każda z przeglądarek ma historię, która wpłynęła na wybór języka.

Na przykład zarówno Chrome, jak i Safari są oparte na WebKit, który wywodzi się z części KHTML projektu KDE. KDE zostało pierwotnie utworzone (częściowo) jako demonstracja zestawu narzędzi Qt GUI, więc ogólnie KDE jest projektem C ++. Wszystkie nowe projekty KDE były wówczas w całości napisane w C ++, więc był to logiczny wybór dla KHTML. Od tego czasu został przeniesiony do innych zestawów GUI.

Silnik Presto Opery został napisany z myślą o wydajności i małym rozmiarze pliku binarnego: logicznym wyborem był C ++.

IE Microsoftu został napisany jako zbiór składników ActiveX, który mógł być napisany w dowolnym języku, który ma powiązania COM, ale prawdopodobnie został napisany w podzbiorze C ++, ponieważ większość ich bazy kodu jest już napisana w tym języku.

Mozilla Netscape została napisana w C ++ prawdopodobnie dlatego, że przenośność była dla nich głównym problemem. Kompilatory C i C ++ są (praktycznie) wszechobecne, więc był to logiczny wybór.

Nie ma nieodłącznego technicznego uzasadnienia dla tych wyborów. To po prostu „wydawało się wtedy dobrym pomysłem”.

greyfade
źródło
8

Sieć w C i C ++ jest łatwa do optymalizacji, ponieważ nie musisz używać bibliotek, jeśli nie chcesz. Podejrzewam, że C ++ jest wybranym językiem, ponieważ pozwala na zalety C:

  • Prędkość
  • Optymalizacja
  • Pewna przenośność
  • Skompilowany język, nie tłumaczony

w połączeniu z zaletami OOP:

  • Rozciągliwość
  • Łatwiejsza wizualizacja
  • Lepsza obsługa bibliotek dla niekrytycznych zadań, takich jak przetwarzanie ciągów i struktury danych
Michael K.
źródło
Czy Java lub C # ma te zalety?
Nipuna
5
W obu opracowałem aplikacje i powiedziałbym, że przy ograniczonej funkcjonalności sieci są w porządku. Nie chciałbym jednak budować niczego, co koncentrowałoby się na części sieciowej, tak jak robi to przeglądarka. Chciałbym mieć większą kontrolę nad tym, co się dzieje, i chciałbym skompilowanego języka .
Michael K
Kompilowane są również Java i C #. C # miałby przewagę nad Javą, jeśli chodzi o budowanie GUI - kluczowego elementu każdej przeglądarki. Java miałaby przewagę dzięki przenośności. Zarówno Java, jak i C # są rekompilowane na platformie docelowej - dla prawdopodobnie lepszej prędkości.
Berin Loritsch,
5
Nie, są interpretowane. Kompilują się do kodu bajtowego i działają na maszynie wirtualnej. Ta maszyna wirtualna nie ma korespondencji jeden do jednego z zestawu instrukcji do natywnej.
Michael K
1
Nie możesz mieć tego więcej do tyłu! Sieć; możesz się zwinąć, aby zwinąć, a przeglądarka byłaby równie szybka. KOD sieciowy nie jest wolnym bitem. A czym są gniazda, jeśli nie jest to biblioteka? Przetwarzanie łańcucha; To jest rdzeń każdej przeglądarki HTML, to NIE jest niekrytyczne i nie mogę myśleć o jednym języku, który ma gorszą obsługę napisów niż C ++ inny niż C.
Henry
4

Kiedy napisano pierwsze wiersze kodu dla pierwszej rundy przeglądarek, C # i Java nie istniały. Ruby też nie. Python mógł już istnieć, ale w tym momencie wciąż był to niewielki domowy projekt.

Zasadniczo naprawdę nie było żadnych innych opcji poza C ++, które pozwoliłyby zbudować przeglądarkę, która byłaby szybka i działała na wielu różnych platformach.

Dlaczego więc zostały napisane w C ++? Ponieważ był to jedyny dostępny język, w którym można było pisać.

Grandmaster B.
źródło
1
Nie jestem pewien, co rozumiesz przez „nową rundę”. Ale FF i IE mają podstawy kodu sięgające połowy lat 90., a większość nowych przeglądarek korzysta z jednego z silników renderujących (na przykład Chrome używa WebKit)
GrandmasterB
2
FF pozbył się starszego kodu Netscape (tj. Tego bloat z połowy lat 90.) i wdrożył własny silnik renderujący. WebKit to także stosunkowo nowy silnik renderujący (używany w Chrome i Safari). IE nadal ma starsze cechy wzdęcia, które nadal go obciążają. Więc się nie zgodzę.
Berin Loritsch
2
Według przynajmniej wikipedii, zarówno gekon, jak i webkit powstały około 1998 roku. C # nie było wtedy, a java była nowa na scenie (i wtedy była bardzo powolna i naprawdę okropna w GUI), więc nie byłaby to wykonalna opcja. Więc nie wiem, jakie inne języki byłyby odpowiednie. Może Pascal.
GrandmasterB
1
@Berin Loritsch: Tak, ale w żadnym momencie po prostu nie wyrzucili całego istniejącego kodu i zaczynali od nowa (od wszystkiego) od samego początku, co właściwie musieliby zrobić, aby przejść na inny język. Ponadto ludzie, którzy znają / znają C ++ wystarczająco dobrze, aby podjąć decyzję dotyczącą FF, prawdopodobnie i tak przestawiliby się na inny język.
Jerry Coffin
2
@Berin Loritsch Śmieci. FF wciąż opiera się na Gecko (1997), a Webkit na khtml (1998).
Henry
4

Ponieważ przeglądarki (np. HotJava, oczywiście napisane w Javie) napisane w innych językach nigdy nie uzyskały znacznego stopnia akceptacji / penetracji rynku.

Nie mogę nic powiedzieć o obecnej iteracji (lub najnowszej - nie była aktualizowana od dłuższego czasu) HotJava, ale kiedy spróbowałem, brak penetracji rynku wydawał się (przynajmniej dla mnie) niezwykle łatwy do zrozumienia - było brzydkie, wolne i niezgodne z wieloma stronami internetowymi. Ostatecznie wydawało się, że opiera się na założeniu, które nigdy się nie sprawdzało: że sieć składałaby się głównie z apletów Java, przy czym HTML byłby czymś więcej niż opakowaniem informującym, które aplety mają wyświetlać.

Część tego jest prawdopodobnie również historyczna: większość dużych przeglądarek internetowych działa już od dawna. Kiedy zostały napisane po raz pierwszy, krajobraz był zupełnie inny: C ++ był „gorącym” nowym językiem, więc był używany do wielu nowych prac rozwojowych. Przeglądarki stały się jednymi z najczęściej używanych programów na świecie, a wiele innych z tamtych czasów popadło w zapomnienie.

Myślę, że wyświetlana „postawa” języka ma również wpływ: C ++ (podobnie jak wcześniej C) zawsze podkreślał praktyczność i pragmatyzm. Ta podstawowa postawa przyciąga programistów, którzy są również pragmatyczni. Wiele innych języków kładzie o wiele większy nacisk na takie rzeczy, jak elegancja - i tym samym przyciągają programistów, którzy myślą podobnie. Problem polega na tym, co nazywam „efektem Lisp”. Objawy obejmują:

  1. Niekończące się spory o najbardziej elegancką implementację najbardziej trywialnych rzeczy.
  2. Niemożność zablokowania funkcji i ukończenia czegoś, co można wysłać (nawet z wadami)
  3. Niemożność pójścia na kompromis. Każdy, kto się ze mną nie zgadza, jest nie tylko zły, ale musi być albo głupi, albo zły.

Jest ich więcej, ale masz ogólny pomysł (i tak, przesadzam do pewnego stopnia - ale tylko do pewnego stopnia). Tak, część kodu, który dostaniesz, będzie zadziwiająco piękna - ale są szanse, że spóźni się o sześć miesięcy i będzie w większości niekompatybilna z każdym innym fragmentem kodu (jaki powinien być) w systemie, a zanim go otrzymasz całkiem spora szansa, że ​​coś innego zmieniło się na tyle, że nie można jej w ogóle użyć.

Istnieją również języki, które bez wątpienia działałyby dobrze, ale (słusznie lub niesłusznie) po prostu nie mają (lub w kluczowym momencie nie miały) udziału w rynku, aby ktokolwiek napisał w nich przeglądarkę. Biorąc pod uwagę rozmiar i złożoność kompletnej przeglądarki, jej opracowanie zajmuje sporo ludzi i sporo czasu. Dzięki takim inwestycjom wiele osób staje się względnie konserwatywnych w kwestiach takich jak narzędzia programistyczne.

Jerry Coffin
źródło
1
WRT punkt 3, zdecydowanie stwierdzę bez kwalifikacji, że pisanie oprogramowania sieciowego w rodzinie C jest albo głupie, albo złe, ponieważ pociąga za sobą nieświadomie (głupio) lub świadomie (zło) pracę z systemem powszechnie znanym z wprowadzania zabezpieczeń dziury, które spowodują szkody dla użytkowników. Jest to moralnie równoważne nadanie pancerzowi żołnierza z namalowanym celem.
Mason Wheeler
9
@Mason: Z pewnością doceniamy sposób, w jaki pokazujemy właśnie przedmiotową bigoterię.
Jerry Coffin
2
@Mason: Bzdury. Jedna dziura w zabezpieczeniach (która została już naprawiona, ale wielu sysadminów nie zadało sobie trudu, aby zainstalować zaktualizowany kod) nie jest nawet blisko dowodu, że cały kod napisany w tym samym języku „spowoduje szkody” lub coś w tym rodzaju. OpenBSD (na przykład) ma znacznie lepszą historię bezpieczeństwa niż nawet wersja MacOS oparta na Pascal.
Jerry Coffin
5
@Mason: Nie, jesteś. Po pierwsze, robak Morris wykorzystał wykorzystany proram gets, co jest okropną funkcją, ale prawie nieuniknioną (i na pewno nie „podstawową” dla języka lub czegoś podobnego). Po drugie, C ++ w żadnym wypadku nie jest tym samym językiem co C. Po trzecie, OpenBSD pokazuje całkiem ładnie, że bezpieczne oprogramowanie może i jest napisane w C. Nie ma „podstawowej wady językowej”, która uniemożliwia pisanie solidnego, bezpiecznego oprogramowania w C. Niewielki udział w rynku OpenBSD wskazuje, że bezpieczeństwo nie jest głównym problemem dla większości ludzie.
Jerry Coffin
6
@Mason: Przepełnienie bufora getsjest prostą konsekwencją tego, że nie podajesz długości bufora, którego używasz. Nie ma w tym nic podstawowego dla języka - możesz zrobić to samo w Pascalu (i ja mam). Pisanie oprogramowania zabezpieczającego przed inteligentnym atakującym nie jest łatwe bez względu na język. Opierając się na doświadczeniu we wszystkich trzech, jest trochę łatwiej w C niż w Pascalu i o wiele łatwiej w C ++ niż w C.
Jerry Coffin
3

Programowanie kultu ładunków. Wciąż istnieje przekonanie, że „C ++ jest szybki” (pomimo źle przemyślanych funkcji na poziomie języka, takich jak źle uszkodzony model obiektowy, który spowalnia rzeczy), a ludzie chcą, aby ich przeglądarki działały szybko, więc piszą w C ++ .

W zdrowym świecie ludzie piszący oprogramowanie sieciowe byliby przerażeni na samą myśl o użyciu języka, który jest obarczony wszystkimi nieodłącznymi problemami bezpieczeństwa C, a faktyczne postępowanie byłoby aktem przestępczego zaniedbania. (Wystarczy spojrzeć na to, ile exploitów przepełnienia bufora znaleziono w różnych przeglądarkach w ciągu ostatnich 15 lat! Ile milionów dolarów szkód ponoszą ci koderzy?)

Istnieją inne skompilowane języki zdolne do tworzenia szybkich plików binarnych. Problem polega na tym, że nie mają takiego samego narażenia jak rodzina C i wszyscy musimy za to cierpieć.

Ciekawostka: zanim Morris Worm trafił do Internetu w 1988 r., Jednoznacznie pokazując problemy z pisaniem systemów operacyjnych i oprogramowania sieciowego w C (które do tej pory nie zostały rozwiązane, ponieważ są nieodłącznymi wadami w języku ,) Apple wypuszcza najbardziej zaawansowany system operacyjny, jaki do tej pory widział świat, napisany w języku Pascal.

Mason Wheeler
źródło
15
Co? Podobał mi się Mac OS, ale nazywanie go najbardziej zaawansowanym systemem, jaki widział świat, jest głupie. Nie było nawet w tym samym parku piłkarskim co UNIX i VMS, nie mówiąc już o dużych systemach IBM: pojedynczy użytkownik, brak pamięci wirtualnej, ograniczone zarządzanie procesami. Oczywiście, miał bardzo ładny system okienkowy, ale nawet ten był pochodną Xerox Parc i wielu projektów akademickich. Myślę też, że duża część systemu Mac OS została napisana w asemblerze M68k. Biblioteki używały standardów wywołań funkcji Pascal, ponieważ oczekiwano, że Pascal będzie podstawowym językiem aplikacji.
Charles E. Grant,
5
Przed 2000 rokiem systemy operacyjne Apple nie były bardziej stabilne niż odpowiednik MS. Kiedy w latach 90. pracowałem nad dwoma projektami, jeden z Mac OS i jeden z NT, miałem taką samą liczbę awarii i wymaganych ponownych uruchomień. Teraz wszystkie są jakimś językiem opartym na C. (Apple używa Objective-C do swoich bieżących zadań). Bezpieczeństwo może być trudniejsze w językach opartych na C, ale użycie innego języka nie czyni go nagle bardziej bezpiecznym.
Berin Loritsch,
13
@Mason, fakt, że Mac nie potrzebował tych funkcji w tym czasie, nie oznacza, że ​​są one nieistotne. Złożyłeś niekwalifikowane oświadczenie, że system operacyjny Apple był najbardziej zaawansowany na świecie, ale najwyraźniej tak naprawdę miałeś na myśli to, że miał najbardziej wyrafinowany interfejs użytkownika. To jest twierdzenie, które można obronić, ale raczej mniej wspaniałe niż to, co napisałeś. Pisanie użytecznego GUI jest trudne. Pisanie niezawodnego systemu pamięci stronicowanej jest trudne. Mówienie, że jedno jest ważniejsze niż drugie, jest głupie. Informatyka na poziomie konsumenta, jaką znamy, nie mogłaby istnieć bez nich obu.
Charles E. Grant,
5
@Mason: twoje doświadczenie wyraźnie różni się (ogromnie) od każdego i od innych - pod wieloma względami. :-)
Jerry Coffin
3
@Mason: LOL w odniesieniu do systemu Mac OSX wcześniejszego niż „zaawansowany”. Apple OS był stałym źródłem awarii, zwłaszcza ze względu na niezwykle podstawowy system plików.
Anonimowy wpisz
2

Dostęp do interfejsów API na poziomie systemu

Wszystkie przeglądarki muszą w pewnym momencie współpracować z systemem operacyjnym, a większość głównych systemów operacyjnych ma dobrze znane interfejsy API i biblioteki C i C ++. Zwykle łatwiej jest pracować z tymi interfejsami API w C lub C ++ niż pisać opakowania.

TMN
źródło
0

Kontrola i przenośność

większość argumentów dotyczących prędkości może iść w obie strony, ale wszędzie tam, gdzie potrzebujesz precyzyjnej kontroli nad tym, jak coś się robi, wiele języków wyższego poziomu będzie padać na twoją paradę. Istnieją wyjątki od tego, ale większość z nich nie jest wystarczająco wieloplatformowa, aby liczyć się w przeglądarce.

Rachunek
źródło
0

Kompatybilność ze starszymi wersjami - nie można wyrzucić starego kodu

Nie ma to nic wspólnego z zaletami C ++ w porównaniu z innymi językami. Z pewnością możesz napisać lepszą przeglądarkę od zera w języku takim jak Haskell; tak ważny projekt mógłby nawet wdrożyć własną JVM, gdyby potrzebowały zagwarantować pewne parametry wydajności. Podobnie jak Facebook napisał własny kompilator / optymalizator PHP.

Przeglądarka, która psuje się przy niestandardowych znacznikach, jest gorsza niż bezużyteczna. Starsza kompatybilność jest tak krytyczna i tak złożona, że ​​przepisywanie po prostu nie wchodzi w grę. Dużo pieniędzy i czasu inwestuje się w sprawdzone w walce zabezpieczenia itp., Nie można tak po prostu wyrzucić tej inwestycji. Znów, podobnie jak Facebook jest nadal pisany w PHP.

Dustin Getz
źródło
Rozumiem, dlaczego ludzie mogą nie głosować za tym ... ale głosować z góry? To jest dziwne. Oto +1 dla Ciebie.
Thomas Eding,
Masz (mały) punkt, ale twoje pierwsze zdanie go odrzuca. Oczywiście ma to związek z zaletami C ++ w porównaniu z innymi językami.
Chiel ten Brinke