似乎大多数常见的Web浏览器(Firefox,Chrome,Safari)都是使用C ++开发的。为什么会这样呢?
似乎大多数常见的Web浏览器(Firefox,Chrome,Safari)都是使用C ++开发的。为什么会这样呢?
Answers:
提出问题的另一种方法是浏览器需要哪种支持?简短列表是:
大多数语言都具有某种解析支持。您具有用于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 不能为您做很多事情,您必须格外警惕。您可以访问所有最低级别的API,但是大多数C开发人员都不使用GUI。甚至C GUI库也以面向对象的方式编写。一旦开始谈论UI,面向对象的语言就会变得更加有意义。
为什么不使用目标C? 如果您的唯一目标是苹果,那么这很有意义。但是,大多数开发人员都不了解Objective-C,而学习它的唯一原因是可以在NeXT或Apple包装盒上工作。当然,您可以将任何C库与Objective-C一起使用,并且有适用于许多平台的编译器,但是要找人工作会更加困难。谁知道?也许苹果可以扭转这种自觉的不足。
为什么要使用C ++? 几乎每个平台都有一个C ++编译器。几乎每个GUI库都有一个C ++接口,有时会更好,有时会有所不同。例如,Microsoft的ATL比win32 C函数调用甚至MFC库好得多。Unix上有用于GTK的C ++包装器,如果有人在Apple的Objective-C GUI库周围没有C ++包装器,我会感到惊讶。在C ++中,过程管理比Java或C#更容易(这些细节为您抽象了)。感觉到的速度更多来自硬件加速,而不是原始性能。与原始C语言相比,C ++确实为您提供了更多服务(例如,有界字符串),但仍然为您提供了调整事物的自由。
就目前而言,C ++确实在替代方案方面有所优势。
我决定写一本关于这本书的小说,希望人们能掩饰并赞扬我。不,不,只是在开玩笑!我受不了每个字。每个字,我告诉你!
所有主要的网络浏览器都可以追溯到90年代。Konqueror成为Safari和Chrome;Netscape成为Firefox;IE和Opera仍然是IE和Opera。这些浏览器在现有产品上都有15年的领先优势。
我建议您甚至尝试命名一种可接受的跨平台(Windows / Mac / Unix,甚至更差)的语言,该语言在1995年左右现代浏览器诞生时就已可用。要用C / C ++以外的任何东西构建内核,您可能不得不构建或购买和修改编译器和平台库。
只是为了好玩,让我们考虑一下今天的问题。是的,有替代方案,但仍然存在重大问题。
语言选择至少存在以下问题:
您会从哪里得到知道该语言或可以学习该语言的人?对于像OCaml,F#,Haskell,Common Lisp和D这样的语言来说,这是一个障碍,这些语言足够快速,高级,可以很好地编写一个浏览器,但是却很少有关注者(也许在10k-100k范围内),即使您放心地数所有的业余爱好者和学者。
上面关于货物的回答的推论:
即使在现代,也需要一种相当快速的语言来处理呈现页面和运行Javascript的计算密集型部分。您可以选择使用高级语言来补充它,以构建GUI元素等(例如,C ++和Javascript的Firefox方法),但是您必须在这些语言之间进行紧密集成。您不能只说“好吧,C#和Lua”。除非您选择C或C ++作为基本语言,否则您可能必须自己构建和调试该桥。
跨平台开发是另一种蠕虫。您可以使用C#或F#并在GTK#和Mono未来还活着的时候投入精力。您可以尝试Common Lisp,Haskell,OCaml ...祝您在Windows , Mac 和 Linux 上都能正常工作。
毕竟,您必须构建大量的功能,因此,如果选择低级语言,则需要比以前更大的编码人员。请注意,大约十五年来,没有人真正从头开始构建浏览器。部分原因是(惊讶!)很难。
具体来说,拥有Javascript解释器是问题3(习得一)或问题4(构建一)。
如果您今天(2011年初)开发了一种三平台(Windows / Mac / * nix)浏览器,那么有哪些选择?
如果我们看到在未来几年内另一个主要的浏览器正在兴起,我敢打赌它将以C或C ++和一种动态语言(如Firefox)(无论是开源还是专有)编写。
编辑(2013年7月31日):Hacker News的评论者似乎在提及Rust and Go(并非专门针对我的回答),这模糊地属于“杂项快速”类别。试图保持这种语言的平等和最新状态将是一场失败的战斗,因此,在撰写本文时,我将其称为具有代表性的示例,不理会它。
速度
尽管很丑陋,但当您需要快速的应用程序并完全控制代码时,仍然使用C ++。
这就是为什么游戏,Office的非核心部分(例如文件导入器)以及更多内容仍使用C ++编写的原因。
编辑以包括来自MSalters的回复
我只能猜测,但是您提到的是针对多个平台的软件产品,并且C ++可以编译为任何平台。
(我在Firefox上工作了大约五年。)
发问者的观点是正确的,许多Firefox的代码都是C ++,实际上,如果按代码行数计算,C ++是大多数(尽管这并不能说明全部,因为我们有很多JavaScript,而JS则更多比C ++简洁)。
但实际上,Firefox是用许多不同的语言编写的:
我肯定会忘记一些。
此列表很重要,因为它暗示了Web浏览器背后令人难以置信的复杂性。
是的,Firefox有很多C ++代码,是的,这与在Netscape成立时C ++是这类事情的最佳语言这一事实有关。但是我也认为,对于我们所做的很多事情,今天没有更好的语言。
没有其他语言具有像库这样强大的生态系统(我们严重依赖外部代码)。很少有其他语言能像C ++那样为您提供全栈控制(我们会定期调整自定义堆分配器,并做各种内存不安全的事情以更快或更节省内存)。很少有其他语言可以让您以理智的方式重新实现大多数标准库(我们有自己的字符串和集合实现,可根据需要进行调整)。很少有其他语言可让您实现自己的垃圾收集器。等等。
尽管C ++是许多工作的明显选择,但那些建议我们可以用Java编写浏览器并在必要时编写我们自己的JVM的人仍在从事某些工作。本质上,这就是我们的工作,但是使用JavaScript而不是Java。当然,许多浏览器不是用JavaScript编写的。但是数量惊人。
每个浏览器都有一些影响语言选择的历史。
例如,Chrome和Safari都基于WebKit,其起源于KDE项目的KHTML部分。KDE最初(部分地)是作为Qt GUI工具包的演示而创建的,因此KDE总体上是一个C ++项目。当时,所有新的KDE项目都是完全用C ++编写的,因此对于KHTML而言,这是合乎逻辑的选择。此后已被移植为使用其他GUI工具箱。
Opera的Presto引擎在编写时考虑到性能和较小的二进制大小:C ++是合乎逻辑的选择。
微软的IE是作为ActiveX组件的集合编写的,可以用具有COM绑定的任何语言来编写,但可能是用C ++的子集来编写的,因为它们的大多数代码库已经以该语言编写。
Netscape的Mozilla用C ++编写,可能是因为可移植性是他们的主要关注点。C和C ++编译器(实际上)无处不在,因此这是一个合理的选择。
这些选择没有内在的技术原因。它只是“当时看起来像个好主意”。
C和C ++中的网络易于优化,因为如果您不想使用库,则无需使用。我怀疑C ++是首选语言,因为它具有C的优点:
加上OOP的优点:
编写用于第一轮浏览器的第一行代码时,C#和Java不存在。露比也没有 Python可能已经存在,但那时它仍然是一个很小的自制项目。
基本上,除了C ++之外,实际上没有其他选择可以允许人们构建一种浏览器,该浏览器可以快速运行在许多不同的平台上。
那么为什么要用C ++编写呢?因为那是唯一可以写的语言。
因为用其他语言编写的浏览器(例如,HotJava,显然用Java编写的足够多)从未获得任何实质性的市场接受/渗透。
我无法说出HotJava 的当前迭代(或最近的-一段时间内没有更新),但是当我尝试使用它时,(至少在我看来)缺乏市场渗透似乎非常容易理解-难看,缓慢,并且与许多网页不兼容。最终,它似乎是基于一个从未出现过的前提:网络将主要由Java小程序组成,而HTML只不过是一个包装器,用于指示在何处显示小程序。
部分原因可能也是历史原因:大多数大型网络浏览器已经存在了很长时间。最初编写它们时,情况大不相同:C ++是一种“热门”新语言,因此它被用于许多新开发。浏览器已成为周围使用最广泛的软件,而从那时起,其他许多浏览器已逐渐淡出人们的视野。
我认为显示的语言“态度”也会产生影响:C ++(就像之前的C一样)一直强调实用性和实用主义。这种基本态度倾向于吸引也很务实的程序员。许多其他语言都更加强调诸如优雅之类的东西,因此,它们吸引了以同样方式思考的程序员。问题在于我称之为“ Lisp效应”。症状包括:
还有更多,但是您已经有了大致的想法(是的,我在某种程度上夸大了,但只是在某种程度上)。是的,您获得的某些代码会非常惊人,但是很可能是迟到了六个月,而且几乎与系统(应该是)中的所有其他代码都不兼容,并且到您收到它时,一个相当公平的机会,其他事物已经发生了足够的变化,以致您根本无法使用它。
也有一些语言无疑可以很好地工作,但是(对或错)根本没有(或者在关键时刻没有)任何人使用过编写浏览器的市场份额。鉴于完整浏览器的大小和复杂性,开发一个浏览器需要很多人和大量时间。通过这种投资,许多人对诸如开发工具之类的东西变得相对保守。
gets
,这是一个可怕的功能,但几乎是不可避免的(并且肯定不是该语言的“基础”,或类似的东西)。其次,C ++在任何情况下都不是与C语言相同的语言。第三,OpenBSD很好地证明了安全软件可以并且可以用C编写。没有“潜在的语言缺陷”可以阻止用C编写可靠的安全软件。OpenBSD的微小市场份额表明,安全并不是大多数人关注的主要问题人。
gets
是一个简单的结果,因为您没有将使用的缓冲区的长度传递给它。语言的基本内容都不是-您可以在Pascal中做同样的事情(我有)。无论语言如何,编写针对智能攻击者安全的软件都不容易。基于在所有三个经验,在C比帕斯卡轻松一点,和很多用C ++更容易比C.
货物崇拜编程。仍然存在“ C ++速度很快”的感觉(尽管语言级别的特性考虑不周,尽管它的对象模型坏得很坏,导致速度变慢),人们希望浏览器速度很快,所以他们用C ++编写。
在一个理智的世界中,编写使用面向网络的软件的人们会因为使用C语言固有的所有安全性问题而感到震惊,而实际上这样做是犯罪行为。(仅查看过去15年左右对各种浏览器发现了多少缓冲区溢出漏洞!这些编码器造成了数百万美元的损失?)
还有其他能够创建快速二进制文件的编译语言。问题是他们没有和C家族一样的风险,因此我们所有人都要为此受苦。
有趣的事实:莫里斯·沃尔姆(Morris Worm)于1988年进入Internet时,最终证明了用C语言编写操作系统和面向网络的软件的问题(由于它们是该语言的固有缺陷,至今仍未解决。 ,)苹果已经发布了迄今为止用Pascal编写的迄今为止最先进的操作系统。
它与C ++与其他语言的优劣无关。您肯定可以使用Haskell这样的语言从头开始编写更好的浏览器。如果他们需要保证某些性能特征,那么这个重要的项目甚至可以实现自己的JVM。就像Facebook如何编写自己的PHP编译器/优化器。
破坏非标准标记的浏览器要比没用的糟糕。传统兼容性是如此关键和复杂,以至于不能重写。很多钱和时间都花在了经过战斗考验的安全性等上,您不能仅仅将这些投资扔掉。同样,就像Facebook 仍然是用PHP编写一样。