Почему большинство браузеров разработано на C ++ [закрыто]


99

Похоже, что большинство распространенных веб-браузеров (Firefox, Chrome, Safari) разработаны с использованием C ++. Почему это так?


28
Firefox написан на C ++ и Javascript, а не только на C ++.
Джесси Милликен

1
Этот вопрос, вероятно, будет иметь несколько ответов, если предположить, что он точный (обратите внимание на комментарий Джесси о Firefox, и помимо этих трех и IE есть много браузеров). Я не думаю, что это продуктивно.
Дэвид Торнли

1
Это правильная группа для этого вопроса?
Мартин Йорк

6
@Jesse - это не интерпретатор js, написанный на C ++? Это сделало бы все это C ++, нет? (Я могу ошибаться ..)
Cambraca

5
@ cambraca, с этой логикой, все это ассемблерный код!
Хуан Мендес

Ответы:


165

Другой способ задать вопрос - какая поддержка нужна браузеру? Краткий список:

  • Поддержка парсинга (необходима для понимания [X] HTML, CSS и [ECMA / Java] Script)
  • Особенности ходьбы / интерпретации дерева (часть синтаксического анализа и создания пользовательского интерфейса)
  • Поддержка ускоренной графики
  • Быстрая сеть
  • Для более продвинутых браузеров: контроль над процессами и изоляция памяти между страницами
  • Должен работать на всех поддерживаемых платформах

Большинство языков имеют некоторую поддержку синтаксического анализа. У вас есть генераторы синтаксического анализатора для 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 ++ исключает альтернативы.


4
Для платформ не-Apple и не-NeXT существует коллекция GNUStep. Это главным образом совместимо с Какао, и работает чертовски повсюду.
Greyfade

5
Помните, что Java не должна использовать Swing (дрянная библиотека) для графического интерфейса. Например, у нас есть привязки Qt.
Anto

2
Согласно my.opera.com/kilsmo/blog/2008/01/29/opera-is-not-based-on-qt Опера не основана на Qt
Anto

2
Я никогда не говорил, что Opera основана на Qt. Я имел в виду, что несвободный браузер действительно трудно продать, когда есть так много отличных бесплатных опций.
Берин Лорич

7
Доступность генераторов синтаксических анализаторов на самом деле не так важна - во всех браузерах парсеры HTML, XML и JS написаны от руки, а CSS - в некоторых.
gsnedders

89

Я решил написать роман об этом в надежде, что люди замаскируют это и поддержат меня. Нет, нет, просто шучу! Я страдал за каждое слово. Каждое слово, я говорю вам!

Спросите «когда», прежде чем «почему»

Все основные веб-браузеры могут проследить свое происхождение до 90-х годов. Konqueror стал Safari и Chrome; Netscape стал Firefox; IE и Opera по-прежнему IE и Opera. Эти браузеры имеют 15-летний опыт работы на рынке.

Я предлагаю вам даже попытаться назвать приемлемый кроссплатформенный (Windows / Mac / Unix и даже хуже) язык, который был доступен примерно в 1995 году, когда появились современные браузеры. Чтобы собрать ядро ​​во всем, кроме C / C ++, вам, вероятно, пришлось бы собирать или покупать и модифицировать библиотеки компилятора и платформы.

Как насчет сегодня? Какие есть альтернативы?

Просто для удовольствия, давайте подумаем о проблеме сегодня. Да, есть альтернативы, но есть еще серьезные проблемы.

Выбор языка представляет как минимум следующие проблемы:

  1. Проблемы со знаниями - Найм / обучение разработчиков или привлечение участников
  2. Организационные / социальные проблемы - Принятие языка
  3. Языковая реализация: скорость, поддержка платформы, инструменты
  4. Языковая сила

1: проблемы со знаниями

Откуда вы берете людей, которые знают язык или могут выучить его? Это препятствие для таких языков, как OCaml, F #, Haskell, Common Lisp и D, которые достаточно быстрые и высокоуровневые, чтобы красиво писать браузер, но у которых мало последователей (возможно, в диапазоне 10–100 тыс.), Даже если вы либерально Посчитайте всех любителей и ученых.

2: Социальные / Организационные проблемы

Следствие к грузо-культовому ответу выше:

  • Браузер с открытым исходным кодом, не использующий C, C ++, C # или Java, предположительно будет испытывать трудности с участниками.
  • Запатентованный браузер, не использующий C, C ++, C # или Java, заставит руководителей проектов сильно кричать в большинстве организаций.

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: См. (2). Все будут требовать C ++. Получайте удовольствие, выбирая кроссплатформенный инструментарий или создавая его (1, 2, 3 и 4). Смотрите также (4); получайте удовольствие, создавая в нем стабильный и безопасный браузер.
  • C ++: получайте удовольствие, выбирая кроссплатформенный инструментарий или создавая его (1, 2, 3 и 4). Получайте удовольствие (4), создавая в нем стабильный, безопасный браузер.
  • C или C ++ и HLL: ваш лучший выбор. Выбери свой яд на динамическом языке; Смотрите (1) и (2). Слишком много хороших языков, слишком мало последователей каждого. (1, 2, 3 и 4) на инструментарий.
  • Ява: Вторая лучшая ставка, если вам нравится менеджмент среднего звена. См. (4); Создание огромных вещей в Java требует гораздо больше кода, чем во всем этом списке, но, возможно, C.
  • Scala: лучше, чем Java (4); (1) и (2), но это завоевывает популярность.
  • C и Javascript: в особом случае это привлекательно, потому что вам уже нужно создавать или приобретать и ассимилировать интерпретатор Javascript. (Отсюда и Firefox.) (1, 2, 3 и 4) в наборе инструментов; народ Mozilla построил свой собственный IIRC.
  • C #: Развлекайся (3). Вы, вероятно, застряли с GTK #, как бы хорошо это ни было, или создаете свой собственный слой и средство визуализации выше GTK # и Windows Forms.
  • Ruby / Python / Perl / Racket / Lua / Erlange и т. Д .: Вы получили (3) библиотеки кроссплатформенных виджетов и скорость. Закон Мура с тобой (4); растущий спрос на браузеры против вас.
  • OCaml, Haskell, Common Lisp, Smalltalk: (1) и (2) в пиках. Вероятно, никаких проблем со скоростью, но (3) для кроссплатформенной разработки, и вам придется создавать все самостоятельно или каким-то образом связываться с библиотеками C / C ++.
  • Цель-C: (3) Я не уверен, как кросс-платформенная разработка будет работать здесь.

Если в ближайшие несколько лет мы увидим еще один значительный рост количества браузеров, я бы поспорил, что он будет написан на C или C ++ и на динамическом языке (например, Firefox), будь то с открытым исходным кодом или частным.

Редактировать (31 июля 2013 г.) : Авторы комментариев в Hacker News, похоже, упоминают Rust and Go (не в частности, в связи с моим ответом), которые смутно попадают в «разное быстрое» ведро. Попытка сохранить этот список языков равноправным и актуальным будет проигранной битвой, поэтому вместо этого я называю его репрезентативной выборкой на момент написания и оставляю ее в покое.


4
+1 за то, что отметили, что КОГДА конкретный браузер был впервые разработан, также играет значительную роль.
Sparky

3
Стоит отметить , что в то время как IE не может быть кросс-платформенный сегодня , это , конечно , был в свое время, и его текущая доля рынка почти наверняка происходит (по крайней мере, частично) от этой возможности кросс-платформенной.
Джерри Гроб

2
Обратите внимание, что IE был кроссплатформенным однажды вокруг IE4.
JasonFruit

2
+1 за когда. Это единственная причина. Если бы сегодня кто-то запустил проект браузера, он, скорее всего, не использовал бы C ++
Генри

4
@ Генри, вряд ли они исключат использование C ++. В ответе отмечается, что C ++ все еще будет частью головоломки.
анонимный тип

36

скорость

Каким бы уродливым это ни было, C ++ по-прежнему используется для быстрого приложения и полного контроля над кодом.

Вот почему игры, неосновные части (такие как импортеры файлов) Office и многое другое до сих пор написаны на C ++.

Отредактировано, чтобы включить ответ от MSalters


3
Кроме игр, я не верю, что именно по этим причинам эти приложения написаны на C ++. Хотя, если у вас есть знания из первых рук, я счастлив, что оказался неправ.
Генри

2
знание из первых рук? VS 2010 и Office 2010 - это огромные наборы приложений, но они очень быстро справляются со своими задачами. В то время как оба имеют довольно большое наследие COM и наследие MS, производительность по-прежнему является самой важной вещью для пользователей.
анонимный тип

8
Что еще офис будет написан в? VB? C и C ++ являются единственными вариантами написания больших приложений для Microsoft. Не говорите C #, пожалуйста
Тоби Аллен

4
@Victor: я не видел источника для VS2010, так что он вполне может быть написан полностью на C #.
Райан Хейс

3
Если office - это приложение на C #, почему оригинальная лента - это элемент управления MFC, и нам пришлось долго ждать разработки C #? ни одно из этих огромных приложений не будет переписано в C #, они будут помещены в графический интерфейс WPF (например, VS2010), и большая часть старого кода будет использоваться повторно. Даже у MS нет ресурсов, чтобы полностью переписать свои самые большие приложения - не если они тоже хотят тратить время на добавление функций к ним.
gbjbaanb

17

портативность

Я могу только догадываться, но вы упоминаете программные продукты, предназначенные для нескольких платформ, и C ++ может быть скомпилирован для любой платформы.


+10 - Помимо чистой производительности, я думаю, что это РЕАЛЬНАЯ причина, по которой большинство браузеров работают на C ++, за исключением IE. Большинство браузеров работают на нескольких платформах, и есть несколько языков / структур, которые могут работать на одном уровне и быть кросс-платформенными.
Джордан Пармер

Сначала я тоже так думал, но для приложений с графическим интерфейсом, таких как веб-браузер. Действительно ли C ++ гораздо более переносим для других операционных систем, чем, скажем, Java?
JohnFx

1
Действительно ли браузер ориентирован на GUI?
Крис Ван Баел

@JohnFx - Правильно, часть GUI, вероятно, не настолько переносима. Но ядро, например, приложения для браузера - это обработка HTML, создание DOM-деревьев, разбор javascript и достаточно быстрое его выполнение. Хорошо разработанное приложение может легко использовать одно и то же ядро ​​и иметь различный код пользовательского интерфейса для каждой платформы. И да, C ++ гораздо более переносим, ​​чем Java (но без графического интерфейса), потому что для C ++ вам нужен только компилятор, ориентированный на процессор. Для Java вам нужен полный фреймворк.
Пит

Насколько я понимаю, большая часть обработки HTML выполняется несколькими основными инструментами, такими как WebKit. Возможно, это потому, что в C ++ есть целые браузеры?
JohnFx

13

(Я работаю над Firefox около пяти лет.)

Спрашивающий прав, что большая часть кода Firefox написана на C ++, и на самом деле C ++ является большинством, если вы посчитаете по строкам кода (хотя это не говорит всей истории, так как у нас много JavaScript, а JS более краткий, чем C ++).

Но в действительности Firefox написан на разных языках:

  • C ++
  • C (NSS, NSPR, различные библиотеки, которые мы импортировали)
  • сборка x86 и ARM
  • JavaScript
  • XUL (HTML-подобный язык разметки) и CSS
  • Цель C (код только для MacOS)
  • Java (код только для Android)
  • Несколько пользовательских языков определения интерфейса (XPIDL, IPDL)
  • WebIDL (другой язык определения интерфейса, но этот не является пользовательским, хотя генератор кода есть)
  • Python (генераторы кода)

Я уверен, что забыл некоторые.

Этот список важен, потому что он намекает на невероятную сложность веб-браузера.

Да, Firefox имеет много кода на C ++, и да, это как-то связано с тем фактом, что C ++ был лучшим языком для такого рода вещей, когда был основан Netscape. Но я также утверждаю, что сегодня не существует лучшего языка для большей части того, что мы делаем.

Ни один другой язык не имеет такой сильной экосистемы библиотек (мы сильно полагаемся на внешний код). Немногие другие языки дают вам полный контроль над стеком, например C ++ (мы регулярно настраиваем наш пользовательский распределитель кучи и делаем все виды небезопасных для памяти вещей, чтобы быть быстрее или использовать меньше памяти). Немногие другие языки позволяют вам в разумной степени перестроить большую часть стандартной библиотеки (у нас есть собственные реализации строк и коллекций, настроенные на наши потребности). Несколько других языков позволяют вам реализовать свой собственный сборщик мусора. И так далее.

Хотя C ++ является очевидным выбором для многих из наших действий, люди, которые предполагают, что мы могли бы написать браузер на Java и написать собственную JVM, если это необходимо, готовы к чему-то. По сути, это то, что мы делаем, но с JavaScript вместо Java. Конечно, большая часть браузера не написана на JavaScript. Но удивительное количество есть.


Являются ли эти небезопасные действия источником проблем безопасности?
Деми

12

Ну, вы должны спросить у разработчиков этих продуктов непосредственно , чтобы получить в ответ, но я подозреваю , что это сочетание знакомства (это то , что эти разработчики лучше знали), производительность (сводную к родному двоичном , в отличие от байткод), и инструменты (по сравнению с такими языками, как C, C ++ полон хороших гаджетов для экономии труда, таких как STL).


10

история

У каждого из браузеров есть своя история, которая повлияла на выбор языка.

Например, и 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 ++ (практически) повсеместны, и поэтому это был логичный выбор.

Для этого выбора нет технической причины. Это просто «казалось хорошей идеей в то время».


8

Сеть на C и C ++ легко оптимизировать, так как вам не нужно использовать библиотеки, если вы этого не хотите. Я подозреваю, что C ++ является языком выбора, потому что он допускает преимущества C:

  • скорость
  • оптимизация
  • Определенное количество портативности
  • Скомпилированный язык, не интерпретируется

в сочетании с преимуществами ООП:

  • растяжимость
  • Более простая визуализация
  • Лучшая поддержка библиотеки для некритических задач, таких как обработка строк и структуры данных

Разве у Java или C # нет таких преимуществ?
Нипуна

5
Я разработал приложения для обоих, и я бы сказал, что для ограниченной сетевой функциональности они хороши. Однако я не хотел бы создавать что-то, что сосредоточено на сетевой части, как это делает браузер. Я хотел бы иметь намного больший контроль над тем, что происходит, и я хотел бы, чтобы скомпилированный язык .
Майкл К

Java и C # также скомпилированы. C # будет иметь преимущество перед Java, когда дело доходит до создания графического интерфейса - критической части любого браузера. У Java было бы преимущество с переносимостью. И Java, и C # перекомпилированы на целевой платформе - для улучшения скорости.
Берин Лорич

5
Нет, они интерпретируются. Они компилируются в байт-код и запускаются на виртуальной машине. Эта ВМ не имеет взаимно-однозначного соответствия от своего набора команд к нативному.
Майкл К

1
Вы не могли бы иметь больше назад! Сеть; Вы могли бы раскошелиться, чтобы свернуться, и браузер был бы столь же быстрым. Код сети не медленный бит. А что такое сокеты, если это не библиотека? Обработка строк; Это ядро ​​любого html-браузера, это НЕ некритично, и я не могу представить себе ни одного языка, который хуже обрабатывал бы строки, чем C ++, кроме C.
Генри

4

Когда были написаны первые строки кода для первого раунда браузеров, C # и Java не существовало. Руби тоже. Python, возможно, был рядом, но в тот момент это был крошечный доморощенный проект.

По сути, не было никаких других вариантов, кроме C ++, которые позволили бы создать браузер, который был бы быстрым и работал бы на разных платформах.

Так почему они были написаны на C ++? Потому что это был единственный доступный язык, на котором они могли быть написаны.


1
Не уверен, что вы подразумеваете под «новый раунд». Но у FF и IE есть кодовые базы, восходящие к середине 90-х, и большинство новых браузеров используют один из механизмов рендеринга (например, Chrome использует WebKit)
GrandmasterB

2
FF избавился от унаследованного кода Netscape (то есть с середины 90-х) и внедрил собственный движок рендеринга. WebKit также является сравнительно новым механизмом рендеринга (используется Chrome и Safari). У IE все еще есть наследственное раздувание, которое продолжает отягощать его. Так что я не согласен здесь.
Берин Лорич

2
По крайней мере, согласно википедии, и геккон, и webkit появились примерно в 1998 году. C # тогда еще не было, и java был новинкой на сцене (и в то время супер медлительным и по-настоящему ужасным для gui), так что это было бы нереально. Так что я не знаю, какие другие языки были бы подходящими. Возможно Паскаль.
GrandmasterB

1
@Berin Loritsch: Да, но ни в коем случае они просто не выбрасывали весь существующий код и начинали все сначала, что им и пришлось бы сделать, чтобы перейти на другой язык. Кроме того, люди, которые знали / знают С ++ достаточно хорошо, чтобы принять решение о том, чтобы придерживаться FF, в любом случае, вероятно, переключатся на другой язык.
Джерри Гроб

2
@ Берин Лорич Мусор. FF по-прежнему основан на Gecko (1997), а Webkit основан на khtml (1998).
Генри

4

Поскольку браузеры (например, HotJava, достаточно очевидно написанные на Java), написанные на других языках, никогда не достигли какой-либо существенной степени признания / проникновения на рынок.

Я ничего не могу сказать о текущей итерации (или самой последней - не обновляющейся в течение долгого времени) HotJava, но когда я попробовал ее, отсутствие проникновения на рынок показалось (по крайней мере мне) чрезвычайно легким для понимания - это было некрасиво, медленно и несовместимо с множеством веб-страниц. В конечном счете, казалось, что оно основано на предпосылке, которая никогда не сработала: сеть будет состоять в основном из Java-апплетов, а HTML - это всего лишь оболочка, сообщающая, какие апплеты отображать где.

Часть этого, вероятно, также историческая: большинство крупных веб-браузеров существуют уже давно. Когда они были впервые написаны, ландшафт сильно отличался: C ++ был «горячим» новым языком, поэтому его использовали для многих новых разработок. Браузеры стали одними из наиболее часто используемых программ, в то время как многие другие с тех пор исчезли в забвении.

Я думаю, что отображаемое «отношение» языка также оказывает влияние: C ++ (как и C до него) всегда подчеркивал практичность и прагматизм. Это основное отношение привлекает программистов, которые также прагматичны. Во многих других языках гораздо больше внимания уделяется таким вещам, как элегантность, и при этом они привлекают программистов, которые думают так же. Проблема в том, что я называю «эффектом Лиспа». Симптомы включают в себя:

  1. Бесконечные споры по поводу самой элегантной реализации самых тривиальных вещей.
  2. Невозможность заморозить функции и закончить что-то, что может быть отправлено (даже с недостатками)
  3. Неспособность идти на компромисс. Любой, кто не согласен со мной, не просто неправ, но должен быть глупым или злым.

Есть и другие, но вы получите общее представление (и да, я в некоторой степени преувеличиваю - но только до некоторой степени). Да, часть кода, который вы получите, будет поразительно красива, но есть вероятность, что он опоздал на шесть месяцев и в основном несовместим с любым другим фрагментом кода (который должен быть) в системе, и к тому времени, когда вы его получите, есть довольно справедливый шанс, что что-то еще изменилось настолько, что вы вообще не сможете его использовать.

Существуют также языки, которые, несомненно, будут работать просто отлично, но (правильно или неправильно) просто не имеют (или в решающий момент, не имеют) доли рынка, чтобы кто-либо когда-либо писал в них браузер. Учитывая размер и сложность полноценного браузера, на его разработку уходит много людей и немало времени. С такими инвестициями многие люди становятся относительно консервативными в отношении таких вещей, как инструменты разработки.


1
В пункте 3, я определенно буду утверждать, без всяких оговорок, что написание сетевого программного обеспечения в семействе C является либо глупым, либо злым, потому что влечет за собой либо неосознанную (глупую), либо сознательную (злую) работу с системой, широко известной для введения безопасности дыры, которые нанесут вред вашим пользователям. С моральной точки зрения это эквивалентно доспехам солдата с нарисованной на нем целью.
Мейсон Уилер

9
@ Мейсон: Ваш показ именно того фанатизма, безусловно, приветствуется.
Джерри Гроб

2
@ Мейсон: Чепуха. Одна дыра в безопасности (которая уже была исправлена, но многие системные администраторы не удосужились установить обновленный код) даже близко не является доказательством того, что весь код, написанный на одном языке, «причинит вред» или что-либо в этом роде. OpenBSD (для одного примера) имеет значительно лучшую историю безопасности, чем версия MacOS на основе Pascal, к которой даже стремились.
Джерри Гроб

5
@ Мейсон: Нет, ты. Во-первых, червь Морриса использовал используемую программу gets, которая является ужасной функцией, но вряд ли неизбежной (и, конечно, не «фундаментальной» для языка или чего-то подобного). Во-вторых, C ++ - это не тот же язык, что и C в любом случае. В-третьих, OpenBSD довольно наглядно демонстрирует, что безопасное программное обеспечение может и написано на языке C. Нет никакого «основного языкового недостатка», который мешает написанию надежного и безопасного программного обеспечения на C. Небольшая доля рынка OpenBSD указывает на то, что безопасность не является серьезной проблемой для большинства люди.
Джерри Гроб

6
@Mason: переполнение буфера getsявляется простым следствием того факта, что вы не передаете ему длину используемого буфера. Ничего фундаментального для языка в этом нет - вы могли бы сделать то же самое в Паскале (как и я). Написание программного обеспечения, защищенного от интеллектуального злоумышленника, нелегко, независимо от языка. Основываясь на опыте всех трех, это немного легче в C, чем в Pascal, и намного легче в C ++, чем в C.
Джерри Коффин

3

Карго-культовое программирование. Восприятие, что «C ++ быстр», все еще существует (несмотря на плохо продуманные функции уровня языка, такие как его сильно сломанная объектная модель, которая замедляет работу), и люди хотят, чтобы их браузеры были быстрыми, поэтому они пишут на C ++ ,

В нормальном мире люди, пишущие программное обеспечение для работы в сети, были бы в ужасе от одной мысли об использовании языка, который связан со всеми присущими С вопросами безопасности, и на самом деле это было бы преступной халатностью. (Просто посмотрите, сколько эксплойтов было переполнено в различных браузерах за последние 15 лет или около того! Сколько миллионов долларов нанесен ущерб этими кодерами?)

Существуют и другие скомпилированные языки, способные создавать быстрые двоичные файлы. Проблема в том, что они не имеют такой же подверженности, как семья С, и нам всем приходится за это страдать.

Забавный факт: к тому времени, как Morris Worm появился в Интернете в 1988 году, убедительно продемонстрировал проблемы с написанием ОС и программного обеспечения для работы в сети на C (которые до сих пор не решены, поскольку они присущи языковым дефектам). Apple выпустила самую совершенную операционную систему, которую когда-либо видел мир, уже несколько лет, написанную на Паскале.


15
А? Мне очень понравилась Mac OS, но называть ее самой продвинутой ОС, которую когда-либо видел мир, глупо. Он даже не был в том же парке, что и UNIX и VMS, не говоря уже о больших железных системах IBM: один пользователь, нет виртуальной памяти, ограниченное управление процессами. Конечно, у него была очень хорошая система управления окнами, но даже она была производной от Xerox Parc, и куча академических проектов. Я также думаю, что большая часть Mac OS была написана в сборке M68k. В библиотеках использовались стандарты вызова функций Pascal, потому что ожидалось, что Pascal будет основным языком приложения.
Чарльз И. Грант

5
До 2000-х годов операционные системы Apple были не более стабильными, чем аналог MS. Когда я работал над двумя проектами в 90-х, один с Mac OS, а другой с NT, у меня было столько же сбоев и перезагрузок, сколько нужно. Теперь все они являются языком на основе Си. (Apple использует Objective-C для своих текущих вещей). Безопасность может быть более сложной в языках на основе C, но использование другого языка не делает ее внезапно более безопасной.
Берин Лорич

13
@ Мейсон, тот факт, что Mac не нуждался в этих функциях в то время, не означает, что они незначительны. Вы сделали безоговорочное заявление о том, что Apple OS была самой продвинутой в мире, но, очевидно, вы действительно имели в виду, что у нее самый совершенный пользовательский интерфейс. Это оправданное утверждение, но менее грандиозное, чем то, что вы написали. Написать полезный графический интерфейс сложно. Написание надежной страничной системы памяти сложно. Сказать, что одно более важно, чем другое, глупо. Вычисления на потребительском уровне в том виде, в котором мы их знаем, не могут существовать без обоих.
Чарльз И. Грант

5
@ Мейсон: ваш опыт явно отличается (в огромной степени) от всех и каждого - во многих отношениях. :-)
Джерри Гроб

3
@ Mason: LOL при упоминании pre-Mac OSX как «продвинутого». Apple OS была постоянным источником сбоев, не в последнюю очередь из-за своей крайне элементарной файловой системы.
анонимный тип

2

Доступ к API системного уровня

В какой-то момент все браузеры должны взаимодействовать с ОС, и большинство основных ОС имеют хорошо разработанные API и библиотеки C и C ++. Обычно легче работать с этими API в C или C ++, чем писать оболочки.


0

Контроль и Переносимость

большинство аргументов скорости могут идти в любом направлении, но во всем, где вам нужен точный контроль над тем, как что-то делается, многие языки более высокого уровня пойдут на ваш парад. Есть исключения из этого, но большинство из них не достаточно кроссплатформенные, чтобы рассчитывать на что-то вроде браузера.


0

Устаревшая совместимость - не могу выбросить старый код

Это не имеет ничего общего с достоинствами C ++ по сравнению с другими языками. Вы, несомненно, можете написать лучший браузер с нуля на таком языке, как Haskell; такой важный проект мог бы даже реализовать свою собственную JVM, если бы им нужно было гарантировать некоторые характеристики производительности. Например, как Facebook написал свой собственный PHP-компилятор / оптимизатор.

Браузер с нестандартной разметкой хуже, чем бесполезный. Legacy Compat настолько критичен и сложен, что переписать его просто невозможно. Много денег и времени вложено в проверенную в бою безопасность и т. Д., Вы не можете просто выбросить эти инвестиции. Опять же, как то, как Facebook все еще написан на PHP.


Я могу понять, почему люди могут не одобрить это ... но понизить? Это странно. Вот +1 для вас.
Томас Эдинг

У вас есть (маленькая) точка, но ваше первое предложение отбрасывает это. Конечно, это связано с достоинствами C ++ и других языков.
Чиль тен Бринке
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.