Похоже, что большинство распространенных веб-браузеров (Firefox, Chrome, Safari) разработаны с использованием C ++. Почему это так?
99
Похоже, что большинство распространенных веб-браузеров (Firefox, Chrome, Safari) разработаны с использованием C ++. Почему это так?
Ответы:
Другой способ задать вопрос - какая поддержка нужна браузеру? Краткий список:
Большинство языков имеют некоторую поддержку синтаксического анализа. У вас есть генераторы синтаксического анализатора для C, C ++, C #, Java и т. Д. Однако C и C ++ довольно давно имеют преимущество перед остальными альтернативами, поэтому алгоритмы и реализации являются более зрелыми. Доступ к ускоренной графике в Java бесполезен, если только у вас нет собственных расширений для его работы. WPF на C # обеспечивает доступ к ускоренной графике, но он слишком новый, чтобы иметь серьезный браузер, созданный с использованием этой технологии.
Сетевое взаимодействие на самом деле является наименьшей из причин выбирать C ++ вместо Java или C #. Причина в том, что связь во много раз медленнее, чем остальная часть обработки, которая продолжается для отображения страницы. Необработанная скорость проволоки является ограничивающим фактором. Как Java, так и C # имеют неблокирующую поддержку ввода-вывода, как и C ++. Так что в этой области действительно нет явного победителя.
Почему не ява? Вы когда-нибудь пытались создать пользовательский интерфейс с Java? Это кажется громоздким и медленным по сравнению с чем-то еще, потому что это так. Отсутствие ускоренной графики также является большим минусом. Песочница в Java действительно хороша и может помочь улучшить безопасность браузера, если он используется правильно, но это сложно настроить и заставить работать. Не говоря уже о поддержке графического формата отстает от большинства современных браузеров.
Почему не C #? Если ваша единственная цель - Windows, C # действительно может быть хорошим представлением. Проблема возникает, когда вы хотите поддержать что-нибудь еще. Mono недостаточно хорошо справляется с этой задачей, чтобы считаться кроссплатформенной, особенно с поддержкой ускоренной графики и WPF. Кто знает, сколько времени это займет, чтобы измениться.
Почему не С? Существует компилятор C практически для каждой платформы (включая встроенные устройства). Тем не менее, C многое для вас не делает, поэтому вам нужно быть очень бдительными. У вас есть доступ ко всем самым низким уровням API, но большинство разработчиков C не используют GUI. Даже библиотеки C GUI написаны объектно-ориентированным способом. Как только вы начинаете говорить с пользовательским интерфейсом, объектно-ориентированный язык становится более понятным.
Почему не Цель C? Если ваша единственная цель - Apple, это имеет большой смысл. Тем не менее, большинство разработчиков не знают Objective-C, и единственная причина узнать его - это работать на NeXT или Apple Box. Конечно, вы можете использовать любую библиотеку C с Objective-C, и есть компиляторы для многих платформ, но найти людей, которые будут работать над ней, будет немного сложнее. Кто знает? Может быть, Apple сможет исправить этот недостаток.
Почему С ++? Существует компилятор C ++ практически для каждой платформы. Почти каждая библиотека GUI имеет интерфейс C ++, иногда она лучше, а иногда просто другая. Например, Microsoft ATL намного лучше, чем вызовы функций Win32 C или даже библиотека MFC. В Unix есть обертки C ++ для GTK, и я был бы удивлен, если бы у кого-то не было обертки C ++ вокруг библиотеки Apple Objective-C GUI. Управление процессами в C ++ проще, чем в Java или C # (эти детали для вас абстрагированы). Скорость воспринимается скорее аппаратным ускорением, чем исходной производительностью. C ++ заботится о большем количестве вещей для вас, чем необработанный C (например, ограниченные строки), но все же дает вам свободу настроек.
В настоящее время C ++ исключает альтернативы.
источник
Я решил написать роман об этом в надежде, что люди замаскируют это и поддержат меня. Нет, нет, просто шучу! Я страдал за каждое слово. Каждое слово, я говорю вам!
Спросите «когда», прежде чем «почему»
Все основные веб-браузеры могут проследить свое происхождение до 90-х годов. Konqueror стал Safari и Chrome; Netscape стал Firefox; IE и Opera по-прежнему IE и Opera. Эти браузеры имеют 15-летний опыт работы на рынке.
Я предлагаю вам даже попытаться назвать приемлемый кроссплатформенный (Windows / Mac / Unix и даже хуже) язык, который был доступен примерно в 1995 году, когда появились современные браузеры. Чтобы собрать ядро во всем, кроме C / C ++, вам, вероятно, пришлось бы собирать или покупать и модифицировать библиотеки компилятора и платформы.
Как насчет сегодня? Какие есть альтернативы?
Просто для удовольствия, давайте подумаем о проблеме сегодня. Да, есть альтернативы, но есть еще серьезные проблемы.
Выбор языка представляет как минимум следующие проблемы:
1: проблемы со знаниями
Откуда вы берете людей, которые знают язык или могут выучить его? Это препятствие для таких языков, как OCaml, F #, Haskell, Common Lisp и D, которые достаточно быстрые и высокоуровневые, чтобы красиво писать браузер, но у которых мало последователей (возможно, в диапазоне 10–100 тыс.), Даже если вы либерально Посчитайте всех любителей и ученых.
2: Социальные / Организационные проблемы
Следствие к грузо-культовому ответу выше:
3. Технические проблемы
Даже в наше время вам нужен довольно быстрый язык для ресурсоемких частей рендеринга страниц и запуска Javascript. Вы можете дополнить это высокоуровневым языком для создания элементов GUI и т. Д. (Например, подход Firefox в C ++ и Javascript), но вы должны иметь тесную интеграцию между языками; Вы не можете просто сказать: «Хорошо, C # и Lua». Вероятно, вам придется создавать и отлаживать этот мост самостоятельно, если вы не выберете C или C ++ в качестве базового языка.
Кроссплатформенная разработка - еще один мешок червей. Вы можете использовать C # или F # и скрестить пальцы на том, чтобы GTK # и Mono были живы и здоровы в будущем. Вы можете попробовать Common Lisp, Haskell, OCaml ... Удачи получают все работает на Windows , и Mac и Linux.
4. Языковая сила
После всего этого вам нужно создать огромное количество функциональных возможностей, поэтому, если вы выбираете язык низкого уровня, вам понадобится еще большая армия кодеров, чем раньше. Обратите внимание, что никто не создавал браузер с нуля примерно за пятнадцать лет. Это отчасти потому, что (сюрприз!) Это сложно.
В частности, наличие интерпретатора Javascript - это проблема 3 (получить один) или проблема 4 (построить один).
Заключение:
Если вы разработали трехплатформенный (Windows / Mac / * nix) браузер сегодня (в начале 2011 года), каковы некоторые из вариантов?
Если в ближайшие несколько лет мы увидим еще один значительный рост количества браузеров, я бы поспорил, что он будет написан на C или C ++ и на динамическом языке (например, Firefox), будь то с открытым исходным кодом или частным.
Редактировать (31 июля 2013 г.) : Авторы комментариев в Hacker News, похоже, упоминают Rust and Go (не в частности, в связи с моим ответом), которые смутно попадают в «разное быстрое» ведро. Попытка сохранить этот список языков равноправным и актуальным будет проигранной битвой, поэтому вместо этого я называю его репрезентативной выборкой на момент написания и оставляю ее в покое.
источник
скорость
Каким бы уродливым это ни было, C ++ по-прежнему используется для быстрого приложения и полного контроля над кодом.
Вот почему игры, неосновные части (такие как импортеры файлов) Office и многое другое до сих пор написаны на C ++.
Отредактировано, чтобы включить ответ от MSalters
источник
портативность
Я могу только догадываться, но вы упоминаете программные продукты, предназначенные для нескольких платформ, и C ++ может быть скомпилирован для любой платформы.
источник
(Я работаю над Firefox около пяти лет.)
Спрашивающий прав, что большая часть кода Firefox написана на C ++, и на самом деле C ++ является большинством, если вы посчитаете по строкам кода (хотя это не говорит всей истории, так как у нас много JavaScript, а JS более краткий, чем C ++).
Но в действительности Firefox написан на разных языках:
Я уверен, что забыл некоторые.
Этот список важен, потому что он намекает на невероятную сложность веб-браузера.
Да, Firefox имеет много кода на C ++, и да, это как-то связано с тем фактом, что C ++ был лучшим языком для такого рода вещей, когда был основан Netscape. Но я также утверждаю, что сегодня не существует лучшего языка для большей части того, что мы делаем.
Ни один другой язык не имеет такой сильной экосистемы библиотек (мы сильно полагаемся на внешний код). Немногие другие языки дают вам полный контроль над стеком, например C ++ (мы регулярно настраиваем наш пользовательский распределитель кучи и делаем все виды небезопасных для памяти вещей, чтобы быть быстрее или использовать меньше памяти). Немногие другие языки позволяют вам в разумной степени перестроить большую часть стандартной библиотеки (у нас есть собственные реализации строк и коллекций, настроенные на наши потребности). Несколько других языков позволяют вам реализовать свой собственный сборщик мусора. И так далее.
Хотя C ++ является очевидным выбором для многих из наших действий, люди, которые предполагают, что мы могли бы написать браузер на Java и написать собственную JVM, если это необходимо, готовы к чему-то. По сути, это то, что мы делаем, но с JavaScript вместо Java. Конечно, большая часть браузера не написана на JavaScript. Но удивительное количество есть.
источник
Ну, вы должны спросить у разработчиков этих продуктов непосредственно , чтобы получить в ответ, но я подозреваю , что это сочетание знакомства (это то , что эти разработчики лучше знали), производительность (сводную к родному двоичном , в отличие от байткод), и инструменты (по сравнению с такими языками, как C, C ++ полон хороших гаджетов для экономии труда, таких как STL).
источник
история
У каждого из браузеров есть своя история, которая повлияла на выбор языка.
Например, и Chrome, и Safari основаны на WebKit, который берет свое начало в части KHTML проекта KDE. Изначально KDE был создан (частично) как демонстрация инструментария Qt GUI, поэтому в целом KDE - это проект C ++. В то время все новые проекты KDE были полностью написаны на C ++, поэтому это был логичный выбор для KHTML. С тех пор он был портирован для использования других инструментов GUI.
Движок Opera Presto был написан с учетом производительности и небольшого размера двоичного кода: C ++ был логичным выбором.
IE от Microsoft был написан как набор компонентов ActiveX, которые могли быть написаны на любом языке, имеющем привязки COM, но, вероятно, были написаны на подмножестве C ++, потому что большая часть их кодовой базы уже написана на этом языке.
Mozilla Netscape была написана на C ++, скорее всего, потому что переносимость была их главной заботой. Компиляторы C и C ++ (практически) повсеместны, и поэтому это был логичный выбор.
Для этого выбора нет технической причины. Это просто «казалось хорошей идеей в то время».
источник
Сеть на C и C ++ легко оптимизировать, так как вам не нужно использовать библиотеки, если вы этого не хотите. Я подозреваю, что C ++ является языком выбора, потому что он допускает преимущества C:
в сочетании с преимуществами ООП:
источник
Когда были написаны первые строки кода для первого раунда браузеров, C # и Java не существовало. Руби тоже. Python, возможно, был рядом, но в тот момент это был крошечный доморощенный проект.
По сути, не было никаких других вариантов, кроме C ++, которые позволили бы создать браузер, который был бы быстрым и работал бы на разных платформах.
Так почему они были написаны на C ++? Потому что это был единственный доступный язык, на котором они могли быть написаны.
источник
Поскольку браузеры (например, HotJava, достаточно очевидно написанные на Java), написанные на других языках, никогда не достигли какой-либо существенной степени признания / проникновения на рынок.
Я ничего не могу сказать о текущей итерации (или самой последней - не обновляющейся в течение долгого времени) HotJava, но когда я попробовал ее, отсутствие проникновения на рынок показалось (по крайней мере мне) чрезвычайно легким для понимания - это было некрасиво, медленно и несовместимо с множеством веб-страниц. В конечном счете, казалось, что оно основано на предпосылке, которая никогда не сработала: сеть будет состоять в основном из Java-апплетов, а HTML - это всего лишь оболочка, сообщающая, какие апплеты отображать где.
Часть этого, вероятно, также историческая: большинство крупных веб-браузеров существуют уже давно. Когда они были впервые написаны, ландшафт сильно отличался: C ++ был «горячим» новым языком, поэтому его использовали для многих новых разработок. Браузеры стали одними из наиболее часто используемых программ, в то время как многие другие с тех пор исчезли в забвении.
Я думаю, что отображаемое «отношение» языка также оказывает влияние: C ++ (как и C до него) всегда подчеркивал практичность и прагматизм. Это основное отношение привлекает программистов, которые также прагматичны. Во многих других языках гораздо больше внимания уделяется таким вещам, как элегантность, и при этом они привлекают программистов, которые думают так же. Проблема в том, что я называю «эффектом Лиспа». Симптомы включают в себя:
Есть и другие, но вы получите общее представление (и да, я в некоторой степени преувеличиваю - но только до некоторой степени). Да, часть кода, который вы получите, будет поразительно красива, но есть вероятность, что он опоздал на шесть месяцев и в основном несовместим с любым другим фрагментом кода (который должен быть) в системе, и к тому времени, когда вы его получите, есть довольно справедливый шанс, что что-то еще изменилось настолько, что вы вообще не сможете его использовать.
Существуют также языки, которые, несомненно, будут работать просто отлично, но (правильно или неправильно) просто не имеют (или в решающий момент, не имеют) доли рынка, чтобы кто-либо когда-либо писал в них браузер. Учитывая размер и сложность полноценного браузера, на его разработку уходит много людей и немало времени. С такими инвестициями многие люди становятся относительно консервативными в отношении таких вещей, как инструменты разработки.
источник
gets
, которая является ужасной функцией, но вряд ли неизбежной (и, конечно, не «фундаментальной» для языка или чего-то подобного). Во-вторых, C ++ - это не тот же язык, что и C в любом случае. В-третьих, OpenBSD довольно наглядно демонстрирует, что безопасное программное обеспечение может и написано на языке C. Нет никакого «основного языкового недостатка», который мешает написанию надежного и безопасного программного обеспечения на C. Небольшая доля рынка OpenBSD указывает на то, что безопасность не является серьезной проблемой для большинства люди.gets
является простым следствием того факта, что вы не передаете ему длину используемого буфера. Ничего фундаментального для языка в этом нет - вы могли бы сделать то же самое в Паскале (как и я). Написание программного обеспечения, защищенного от интеллектуального злоумышленника, нелегко, независимо от языка. Основываясь на опыте всех трех, это немного легче в C, чем в Pascal, и намного легче в C ++, чем в C.Карго-культовое программирование. Восприятие, что «C ++ быстр», все еще существует (несмотря на плохо продуманные функции уровня языка, такие как его сильно сломанная объектная модель, которая замедляет работу), и люди хотят, чтобы их браузеры были быстрыми, поэтому они пишут на C ++ ,
В нормальном мире люди, пишущие программное обеспечение для работы в сети, были бы в ужасе от одной мысли об использовании языка, который связан со всеми присущими С вопросами безопасности, и на самом деле это было бы преступной халатностью. (Просто посмотрите, сколько эксплойтов было переполнено в различных браузерах за последние 15 лет или около того! Сколько миллионов долларов нанесен ущерб этими кодерами?)
Существуют и другие скомпилированные языки, способные создавать быстрые двоичные файлы. Проблема в том, что они не имеют такой же подверженности, как семья С, и нам всем приходится за это страдать.
Забавный факт: к тому времени, как Morris Worm появился в Интернете в 1988 году, убедительно продемонстрировал проблемы с написанием ОС и программного обеспечения для работы в сети на C (которые до сих пор не решены, поскольку они присущи языковым дефектам). Apple выпустила самую совершенную операционную систему, которую когда-либо видел мир, уже несколько лет, написанную на Паскале.
источник
Доступ к API системного уровня
В какой-то момент все браузеры должны взаимодействовать с ОС, и большинство основных ОС имеют хорошо разработанные API и библиотеки C и C ++. Обычно легче работать с этими API в C или C ++, чем писать оболочки.
источник
Контроль и Переносимость
большинство аргументов скорости могут идти в любом направлении, но во всем, где вам нужен точный контроль над тем, как что-то делается, многие языки более высокого уровня пойдут на ваш парад. Есть исключения из этого, но большинство из них не достаточно кроссплатформенные, чтобы рассчитывать на что-то вроде браузера.
источник
Устаревшая совместимость - не могу выбросить старый код
Это не имеет ничего общего с достоинствами C ++ по сравнению с другими языками. Вы, несомненно, можете написать лучший браузер с нуля на таком языке, как Haskell; такой важный проект мог бы даже реализовать свою собственную JVM, если бы им нужно было гарантировать некоторые характеристики производительности. Например, как Facebook написал свой собственный PHP-компилятор / оптимизатор.
Браузер с нестандартной разметкой хуже, чем бесполезный. Legacy Compat настолько критичен и сложен, что переписать его просто невозможно. Много денег и времени вложено в проверенную в бою безопасность и т. Д., Вы не можете просто выбросить эти инвестиции. Опять же, как то, как Facebook все еще написан на PHP.
источник