Wygląda na to, że większość popularnych przeglądarek internetowych (Firefox, Chrome, Safari) jest rozwijana przy użyciu C ++. Dlaczego tak jest?
Wygląda na to, że większość popularnych przeglądarek internetowych (Firefox, Chrome, Safari) jest rozwijana przy użyciu C ++. Dlaczego tak jest?
Odpowiedzi:
Innym sposobem na zadanie pytania jest to, jakiego rodzaju wsparcia potrzebuje przeglądarka? Krótka lista to:
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.
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!
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.
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:
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.
Następstwem powyższej odpowiedzi dotyczącej kultu ładunków:
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.
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).
Jeśli dzisiaj opracowałeś trzyplatformową (Windows / Mac / * nix) przeglądarkę (początek 2011 r.), Jakie są niektóre opcje?
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.
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
Mogę tylko zgadywać, ale wspominasz o oprogramowaniu przeznaczonym dla wielu platform, a C ++ można skompilować na dowolną platformę.
(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:
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.
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).
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”.
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:
w połączeniu z zaletami OOP:
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ć.
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ą:
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.
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.
gets
jest 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.
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.
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.
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.
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.