it-swarm.cn

为什么大多数浏览器都是用C ++开发的

似乎大多数常见的Web浏览器(Firefox,Chrome,Safari)都是使用C++开发的。为什么会这样呢?

101
Nipuna

提出问题的另一种方法是浏览器需要哪种支持?简短列表是:

  • 支持解析(需要理解[X] HTML,CSS和[ECMA/Java] Script)
  • 树行走/解释功能(解析和构建UI的一部分)
  • 支持加速图形
  • 快速联网
  • 对于更高级的浏览器:控制进程并隔离页面之间的内存
  • 必须在所有支持的平台上工作

大多数语言都具有某种解析支持。您具有用于C,C++,C#,Java等的解析器生成器。但是,C和C++在其余的替代方案上已有相当长的发展,因此算法和实现更加成熟。在Java)中访问加速图形是不行的,除非您具有一些本机扩展才能使它工作。C#上的WPF可以访问加速图形,但是它太新了,无法构建一个严肃的浏览器与技术。

实际上,网络是选择C++而不是Java或C#)的最少原因。原因是通信比继续显示页面的其余处理慢很多倍。线速是限制因素。Java和C#都具有无阻塞IO支持,就像C++一样。因此,确实没有明显的赢家。这片区域。

为什么不使用Java?您是否曾经尝试使用Java构建UI?与其他任何东西相比,它感觉麻烦且缓慢。没有加速图形在这里也是一个很大的负面影响。 Java的沙箱非常好,如果使用正确,可以帮助提高浏览器的安全性,但是配置和工作很麻烦。更不用说图形格式支持落后于大多数现代浏览器。

为什么不使用C#?如果您的唯一目标是Windows,则C#实际上可以很好地表示。当您想支持其他任何东西时,问题就来了。 Mono还没有赶上足够多的精力来跨平台完成这项任务,尤其是在加速图形支持和WPF方面。谁知道更改需要多长时间。

为什么不使用C?几乎每个平台(包括嵌入式设备)都有一个C编译器。但是,C会为您做很多事情not,您必须格外警惕。您可以访问所有最低级别的API,但是大多数C开发人员都不使用GUI。甚至C GUI库都以面向对象的方式编写。一旦开始谈论UI,面向对象的语言就会变得更加有意义。

为什么不使用Objective C?如果您的唯一目标是Apple,那么这很有意义。但是,大多数开发人员都不了解Objective-C,学习它的唯一原因是可以在NeXT或Apple框上使用。请确保您可以将任何C库与Objective-C一起使用,并且有许多平台的编译器,但是要找人工作要困难一些。谁知道呢?也许Apple可以扭转这种已知的缺陷。

为什么要使用C++?几乎每个平台都有一个C++编译器。几乎每个GUI库都有一个C++接口,有时会更好,有时会有所不同。例如,Microsoft的ATL比win32 C函数调用甚至MFC库好得多。 Unix上有用于GTK的C++包装器,如果有人在Apple的Objective-C GUI库周围没有C++包装器,我会感到惊讶。 C++中的流程管理比Java或C#(这些细节已为您抽象出来))要容易得多。它认为速度更多的是来自硬件加速,而不是原始性能。C++会处理更多的事情比原始C(例如,有界字符串)对您而言更适合您,但仍然可以让您自由地进行调整;更不用说渲染网页所需的许多库也是用C或C++编写的。

目前,C++确实淘汰了替代方案。

165
Berin Loritsch

我决定写一本关于这本书的小说,希望人们能掩饰它并支持我。不,不,只是在开玩笑!每个字我都受了苦。每个字,我告诉你!

在“为什么”之前询问“何时”

所有主要的网络浏览器都可以追溯到90年代。 Konqueror成为Safari和Chrome; Netscape成为Firefox; IE和Opera仍IE和Opera。这些浏览器都在现有公司上有15年的领先优势。

我建议您甚至尝试使用name一种可接受的跨平台(Windows/Mac/Unix甚至更糟)语言,该语言在1995年左右的现代浏览器中可用起源。要用C/C++以外的任何东西构建内核,您可能不得不构建或购买和修改编译器和平台库。

今天怎么样有哪些选择?

只是为了好玩,让我们考虑一下今天的问题。是的,有替代方案,但仍然存在重大问题。

语言选择至少存在以下问题:

  1. 知识问题-雇用/培训开发人员或吸引贡献者
  2. 组织/社会问题-语言接受
  3. 语言实施:速度,平台支持,工具
  4. 语言能力

1:知识问题

您会从哪里得到知道该语言或可以学习该语言的人?对于像OCaml,F#,Haskell,Common LISP和D这样的语言来说,这是一个障碍,这些语言足够快速,高级,可以很好地编写浏览器,但是很少有关注者(也许在10k-100k范围内),即使您放心地数所有的业余爱好者和学者。

2:社会/组织问题

上面关于货物的回答的推论:

  • 一个不使用C,C++,C#或Java)((== --- ==))可能会的开源浏览器在与贡献者之间有困难。
  • 不使用C,C++,C#或Java的专有浏览器将使大多数组织中的项目经理受到大吼大叫。

3.技术问题

即使在现代,也需要一种相当快速的语言来处理呈现页面和运行Javascript的计算密集型部分。您可以选择使用高级语言来补充它,以构建GUI元素等(例如,C++和Javascript的Firefox方法),但必须在这些语言之间进行紧密集成;您不能只说“好吧,C#和Lua”。除非您选择C或C++作为基本语言,否则您可能必须自己构建和调试该桥。

跨平台开发是另一种蠕虫。您可以使用C#或F#并在GTK#和Mono未来还活着的时候动动手指。您可以尝试Common LISP,Haskell,OCaml ...祝您好运,让所有功能都可以在WindowsMacLinux。

4.语言能力

毕竟,您必须构建大量的功能,因此,如果选择低级语言,则需要比以前更大的编码人员。请注意,大约十五年来,没有人真正从头开始构建过浏览器。部分原因是(惊讶!)很难。

具体来说,拥有Java解释器是问题3(习得一)或问题4(构建一)。

结论:

如果您今天(2011年初)开发了一种三平台(Windows/Mac/* nix)浏览器,那么有哪些选择?

  • C:参见(2)。每个人都会大喊C++。选择一个跨平台工具箱或构建一个(1、2、3和4)很有趣。另见(4);在其中构建稳定,安全的浏览器很有趣。
  • C++:选择一个跨平台工具箱或构建一个(1、2、3和4)很有趣。玩得开心(4)在其中构建稳定,安全的浏览器。
  • C或C++和HLL:您最好的选择。用动态语言挑选毒药;参见(1)和(2)。好的语言太多,每种语言的追随者太少。 (1、2、3和4)在工具箱上。
  • Java:如果您要讨好中层管理人员,那就是第二好的选择。见(4);在Java中构建大量内容比在此列表中其他任何东西上花费更多的代码,但也许是C。
  • Scala:Beats Java在(4);(1)和(2)上,但正在流行)。
  • C和Javascript:作为一种特例,这很有吸引力,因为您已经必须构建或获取并吸收Java解释器。 (因此使用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++库。
  • Objective-C:(3)我不确定在这里如何进行跨平台开发。

如果我们看到在未来几年内另一个主要的浏览器正在兴起,我敢打赌它将以C或C++和一种动态语言(如Firefox)(无论是开源还是专有)编写。

编辑(2013年7月31日):《黑客新闻》的评论者似乎在提及Rust和Go(与我的回答没有特别联系),它们含糊其词)试图保持这种语言的平等性和最新性将是一场失败的战斗,因此,在撰写本文时,我将其称为具有代表性的示例,不理会它。

89
Jesse Millikan

速度

尽管很丑陋,但当您需要快速的应用程序并完全控制代码时,仍然使用C++。

这就是为什么游戏,Office的非核心部分(例如文件导入器)以及更多内容仍使用C++编写的原因。

编辑以包含来自MSalters的响应

36
Ryan Hayes

可移植性

我只能猜测,但是您提到的是针对多个平台的软件产品,并且C++可以编译为任何平台。

17
Pete

(我已经在Firefox上工作了大约五年了。)

发问者说的很对,Firefox的很多代码都是C++,实际上,如果按代码行数计算,C++是大多数(尽管这不能说明全部,因为我们有很多JavaScript,而JS则更多比C++简洁)。

但实际上,Firefox是用许多不同的语言编写的:

  • C++
  • C (NSS, NSPR, various libraries we've imported)
  • x86和ARM汇编
  • 的JavaScript
  • XUL(一种类似HTML的标记语言)和CSS
  • 目标C(仅限MacOS的代码)
  • Java(仅限Android的代码)
  • 多种自定义界面定义语言(XPIDL,IPDL)
  • WebIDL(另一种接口定义语言,尽管代码生成器是自定义的,但这不是自定义的)
  • Python(代码生成器)

我肯定会忘记一些。

此列表很重要,因为它暗示了Web浏览器背后令人难以置信的复杂性。

是的,Firefox有很多C++代码,是的,这与在Netscape成立时C++是这类事情的最佳语言这一事实​​有关。但是我也认为,对于我们所做的很多事情,今天没有更好的语言。

没有其他语言具有像库这样强大的生态系统(我们严重依赖外部代码)。很少有其他语言能像C++那样为您提供全栈控制(我们定期调整我们的自定义堆分配器,并做各种内存不安全的事情以更快或使用更少的内存)。很少有其他语言可以让您以理智的方式重新实现大多数标准库(我们有自己的字符串和集合实现,可根据需要进行调整)。很少有其他语言可让您实现自己的垃圾收集器。等等。

尽管C++是许多工作的明显选择,但那些建议我们可以使用Java并在必要时编写我们自己的JVM的人)的人正在从事某种工作。我们要做的是使用JavaScript而不是Java,当然,大多数浏览器不是用JavaScript编写的,但是数量惊人。

13
Justin L.

好吧,您必须直接要求那些产品的开发人员获得答案,但是我怀疑这是熟悉的结合(这就是那些开发人员最了解),性能(编译为与字节码相对应的本地二进制文件)和工具(与C之类的语言相比,C++充满了尼斯的节省劳力的小工具,如STL)。

12
John Bode

历史

每个浏览器都有一些影响语言选择的历史。

例如,Chrome和Safari都基于WebKit,它起源于KDE项目的KHTML部分。KDE最初(部分地)是作为Qt GUI工具包的演示而创建的,因此总体而言,KDE是一个C++项目,当时所有新的KDE项目都是完全用C++编写的,因此对于KHTML来说是一个合理的选择,此后已移植到其他GUI工具包中。

Opera的Presto引擎在编写时考虑了性能和较小的二进制大小:C++是合乎逻辑的选择。

Microsoft的IE是作为ActiveX组件的集合编写的,可以用具有COM绑定的任何语言来编写,但可能是用C++的子集编写的,因为它们的大部分代码库是已经用那种语言写了。

Netscape的Mozilla用C++编写,可能是因为可移植性是他们的主要关注点。 C和C++编译器(实际上)无处不在,因此这是一个合理的选择。

这些选择没有内在的技术原因。它只是“当时看起来像个好主意”。

10
greyfade

C和C++中的网络易于优化,因为如果您不需要的话,就不必使用库。我怀疑C++是首选语言,因为它具有C的优点:

  • 速度
  • 优化
  • 一定程度的可移植性
  • 编译语言,未解释

加上OOP的优点:

  • 可扩展性
  • 可视化更容易
  • 更好的库支持非关键任务,例如字符串处理和数据结构
8
Michael K

编写用于第一轮浏览器的第一行代码时,C#和Java不存在。露比也没有Python可能已经存在,但是那时它仍然是一个很小的自制项目。

基本上,除了C++之外,确实还有提供其他选择,它允许人们构建一种浏览器,该浏览器可以快速运行在许多不同的平台上。

那么为什么要用C++编写呢?因为那是唯一可以写的语言。

4
GrandmasterB

由于用其他语言编写的浏览器(例如,HotJava,显然用Java编写的足够多)从未获得任何实质性的市场接受/渗透。

关于HotJava的当前迭代(或最近的一段时间没有更新),我什么也没说,但是当我尝试时,似乎缺乏市场渗透力(至少对我来说)非常容易理解-难看,缓慢且与很多网页不兼容。最终,它似乎基于一个从未出现过的前提:网络将主要由Java)小程序组成,而HTML只是一个包装器,它告诉哪个小程序显示在哪里。

部分原因可能也是历史原因:大多数大型网络浏览器已经存在了很长时间。最初编写它们时,情况大不相同:C++是一种“热门”新语言,因此它被用于许多新开发。浏览器已经成为周围使用最广泛的软件,而从那时起,许多其他浏览器已逐渐淡出人们的视野。

我认为显示的语言“态度”也会产生影响:C++(就像之前的C)一直强调实用性和实用主义。这种基本态度倾向于吸引也很务实的程序员。许多其他语言都更加强调诸如高雅之类的东西,因此,它们吸引了以同样方式思考的程序员。问题在于我称之为“ LISP效应”。症状包括:

  1. most最琐碎的事情的优雅实现的无休止的争论。
  2. 无法冻结功能并完成可以交付的产品(即使存在缺陷)
  3. 无法妥协。任何不同意我的人不仅是错误的,而且必须是愚蠢或邪恶的。

还有更多,但是您已经有了大致的想法(是的,我在某种程度上夸大了,但只是在某种程度上)。是的,您获得的一些代码会非常惊人,但是很可能是迟到了六个月,而且几乎与系统(应该是)中的所有其他代码都不兼容,并且到您收到它时,一个相当公平的机会,其他事物已经发生了足够的变化,以致您根本无法使用它。

还有一些语言无疑可以很好地工作,但是(对还是错)根本没有(或者在关键时刻没有)任何人使用它们编写浏览器的市场份额。鉴于完整浏览器的大小和复杂性,开发一个浏览器需要很多人和大量时间。通过这种投资,许多人对诸如开发工具之类的东西变得相对保守。

4
Jerry Coffin

货物崇拜编程。仍然存在“ C++速度很快”的感觉(尽管语言级别的特性考虑不周,尽管它的对象模型坏得很坏,导致速度变慢),人们希望浏览器速度很快,所以他们用C++编写。

在一个理智的世界中,编写使用面向网络的软件的人们会因为使用C语言固有的所有安全性问题而感到震惊,而实际上这样做是犯罪行为。 (仅查看​​过去15年左右对各种浏览器发现了多少缓冲区溢出漏洞!这些编码器造成了数百万美元的损失?)

还有其他能够创建快速二进制文件的编译语言。问题是他们没有和C家族一样的风险,我们所有人都为此受苦。

有趣的事实:莫里斯·沃尔姆(Morris Worm)于1988年进入Internet时,最终证明了用C语言编写操作系统和面向网络的软件的问题(由于它们是该语言的固有缺陷,至今仍未解决。 ,)Apple)发行了迄今为止用Pascal编写的迄今为止迄今为止最先进的操作系统。

3
Mason Wheeler

访问系统级API

所有浏览器都必须在某个时候与操作系统进行交互,并且大多数主要的操作系统都具有完善的C和C++ API和库。使用C或C++中的这些API通常比编写包装更容易。

2
TMN

旧版兼容性-无法丢弃旧代码

它与C++与其他语言的优劣无关。您肯定可以使用Haskell这样的语言从头开始编写更好的浏览器。如果他们需要保证某些性能特征,那么这个重要的项目甚至可以实现自己的JVM。就像Facebook如何编写自己的PHP编译器/优化器。

破坏非标准标记的浏览器要比没用的糟糕。传统兼容性是如此关键和复杂,以至于不能重写。大量金钱和时间都花在了经过战斗考验的安全性等上,您不能只是舍弃这些投资。同样,就像Facebook是如何用PHP编写still一样。

0
Dustin Getz

控制性和便携性

大多数速度参数可以任意选择,但是在任何需要精确控制完成方式的事情中,许多高级语言都会在您的游行队伍中大放异彩。对此有一些例外,但是其中大多数都没有足够的跨平台来支持类似浏览器的功能。

0
Bill