当前位置: 首页 > news >正文

从头创建一个新的浏览器,这合理吗?

从头构建一个新浏览器?这如果是不是个天大的“伪需求”,便是一场开发者的噩梦!
要知道,如果没有上百亿的资金和数百名研发工程师的投入,从头开始构建一个新的浏览器引擎,几乎是不可能的。然而SerenityOS系统的作者Andreas Kling却带领着一支仅有数十人且几乎没有资金支持的开源项目小队仅花两个月便完成了这项任务——从0到1构建了一款跨平台Web浏览器Ladybird(瓢虫)。截至目前,瓢虫已实现了在Linux、macOS、Windows(WSL)和Android等系统上运行。本文就带领大家一探此事的究竟。

一、“轮子之王”两个月实现小目标

起初,Andreas希望将瓢虫作为 SerenityOS 系统的“LibWeb”浏览器引擎,随后Andreas Kling为其构建了一个简单的GUI。随着瓢虫项目的不断完善,在启动仅两个月后,它已经成为一个跨平台的Web浏览器。

在此之前,Andreas Kling曾有过Qt和WebKit项目的开发经验,而除了Qt,整个Ladybird浏览器的组件(包括LibWeb和LibJS等渲染组件)几乎全是Andreas Kling一手打造的,这也使其在圈内拥有了“轮子之王”的绰号。
在这里插入图片描述
在完成这项难以置信的壮举后,Andreas Kling收到了不少来自圈内朋友的赞誉和提问,而其中重复度最高的一个问题便是:“你的团队为何能在构建瓢虫浏览器方面取得如此快速的进展,这从表明看起来是完全不可能的。”

二、也许不能复制的五个秘诀

近期,Andreas Kling也正式通过一篇博客回应了这个问题,并将这次成功归结为了五个方面。

1.更强的网页规范

在启动Ladybird项目前,我们已经在HTML4和CSS2.1的模糊时代走了很长一段路。今天的ECMAScript、HTML和CSS规范(在大多数情况下)都拥有一流的技术文档,与过去相比,它们的算法可以用更少的工作和测试来实现。

瓢虫在体系结构层面会尽可能地匹配在各种网络规范中所描述的体系结构。这使得新加入项目的开发人员更容易适应,因为他们在参与开发前只需要学习一种架构而不是几种。

然而尽管如此,这与理想情况仍然存在差距,一些较为独特且不常见的特性给研发工作带来了一定困难。但值得庆幸的是,W3C有一个活跃的编辑社区致力于改善这些问题。我们在Ladybird上所做的大量工作包括使我们的代码库都能够适应这些规范编辑器所进行的更新。

我们也在努力改进规范:瓢虫的开发人员经常会报告规范错误,有时甚至还会提交pr来直接改进规范。但归根结底,在一个全新的浏览器引擎中实现一个规范,可以很好地验证该规范的完整性及可靠性。
在这里插入图片描述

2.专注于垂直领域

虽然今天的网页规范确实比以往任何时候都好,但许多特性仍然跨越多个规范,通常在子系统之间有细微的交互,实现者必须理解这些交互。如果开发人员试图一次只构建一个规范的浏览器,甚至一次只构建一个特性,那么其很可能会失去动力并因繁杂的工作而失去兴趣。

因此,我们倾向于专注于构建功能的“垂直切片”。这意味着需要设定实际的、交叉的目标,比如“让我们加载twitter.com/awesomekling”,“让我们登录discord.com”,以及其他类似的目标。在垂直切片上工作有助于保持开发者的动力,随着网站的进步,每一位参与者都能看到实际的变化,这会给大家带来极大的动力。

这种方法在一定程度上是可行的,因为web本身是围绕优雅降级设计的,这意味着浏览器可以呈现web内容,同时只支持站点使用的一些功能。你可能认为这种方法会产生一个“兼容网站”的小集合和一大堆无法运作的代码,但实际情况是水涨船高的,当我们专注于改进一个网站时,成千上万的其他网站也会得到改进。

3.后置性能优化

我们目前并没有花太多精力优化瓢虫的性能。相反,我们的主要关注点是解决与正确性和兼容性相关的问题。这种方法能帮助我们在深入优化之前专注于确保浏览器按预期工作。当然这并不是说我们不关心浏览器性能。我们希望瓢虫浏览器最终能够实现快速响应。

这是一个遵循一定规律的选择,不要花太多时间优化一个还不能正常工作的产品。例如,虽然我们几乎可以确定将会优化JavaScript执行或渲染速度的区域,但我们会有意识地选择优先修复渲染错误或与流行网站的兼容性问题。

但有时我们也确实会为慢得难以忍受的事情破例。毕竟对于一个开源项目而言,我们不想让开发者的贡献过程变得不愉快。在遇到这种情况时,我们会花一定时间解决最重要的性能瓶颈,以保持相对良好的开发体验。但在这个阶段,我们并没有跟踪基准分数之类的东西。不过,一旦我们在正确性和兼容性方面取得了坚实的基础,那么下一步要做的便是优化性能。

4.强大的团队文化

在Ladybird开发团队一起工作的时间里,我们形成了强大的团队文化。这里的文化是高度乐观的,每个人都抱有“我能行”的态度。虽然由于采取开源协作的工作模式,Ladybird团队分布在世界各地,但我们都会在Discord上见面聊天,互相激励。团队中的开发人员也经常合作,参与彼此的项目。每个在Ladybird团队中工作的人都被鼓励在项目中探索自己的个人兴趣而不是被指定任务。团队中的大多数人在加入我们之前都从未接触过浏览器代码,但在加入项目后,他们会迅速成为世界级的浏览器开发人员,这也使得每一个项目的参与者能够收获足够的获得感。此外,由于瓢虫是SerenityOS项目的一个分支,它具有与SerenityOS同样的责任感和自力更生的文化。我们在开发瓢虫浏览器时几乎避免了所有的第三方依赖,由开发人员自己构建一切。这样做的一部分原因是由于从0开始是一件很有趣的事情,此外也正因如此,这种开发模式为我们的软件创建了全面的责任制,每个人都会尽力对自己所写的代码负责,在出现问题时也能更快的进行响应,而无需等待第三方的反馈。5.拥有一位经验丰富的领导在比较复杂的项目中,一位经验丰富的领导可以发挥重要作用。我曾有机会在产品浏览器领域工作多年(在苹果和诺基亚),这让我对浏览器的构建以及各组件的组成方面有着比较深刻的理解。当没有这方面经验的开发者看到需要组合一个浏览器的大量技术和规范时,可能会感到不知所措,但我能够清楚地知道如何将它们合理的组合在一起并使其工作。在瓢虫浏览器的开发过程中,参与其中的开发者不需要过多考虑自己的想法或所写的代码是否可行,而是可以直接在与团队进行简单沟通后便开始工作,这会为整个项目省了大量时间,参与者也不会因为过多的意见分歧而产生不良情绪。在更实际的情况下,我真正负责的工作通常是在各组件的链接与交互之间-浏览器的部分没有严格指定(例如布局和渲染)。对于缺乏经验的浏览器开发人员来说,他们可以更专注自己所擅长的领域而不必过多担心其他问题。

三、关于再造浏览器:杠精之间的讨论

既然有了Chrome、Firefox浏览器,为什么还要再造一个呢?这当然不是个好主意。在这里插入图片描述
一位Reddit用户对于之所以会出现“再造浏览器”的情况,是因为历史上所有的浏览器都构建了自己的“怪癖”库,或者超出了标准范围的功能,或者干脆不符合标准。他还举例说:IE、Chromium、Safari一直都是“越界”来满足用户的需求,并期待自己的实现版本能成为标准。这位用户还吐槽:Safari是唯一一个给我带来真正麻烦的浏览器。
简言之,用户所期望的域浏览器的标准本身就存在差距。即便再造一个,也可能只会是制造适用于某些站点的浏览器。因为有的网站只支持Chrome。很多用户在遇到类似的情况下只能选择它,而放弃Firefox。
在这里插入图片描述
有网友进一步分析,这个浏览器跟Chrome相比,是不需要完美的像素渲染的。并指出“如果排名前100的网站能在其上正常运行,那这个项目才是成功的”。
有网友反驳道:这个浏览器是为开发人员自己准备的,不应吹毛求疵。

四、写在最后

虽然时至今日,Ladybird浏览器中的部分功能依然存在一些错误,甚至一些功能还需要很长时间才能真正投入日常使用。但目前这只小瓢虫已经震动双翅飞向了天空。Ladybird 的出现,增加了浏览器和浏览器引擎的多样性,不少开发者也表示了对项目的赞许:“这是一项令人难以置信的艰巨任务,虽然一个小型的非商业项目不太可提供一个可行的替代浏览器平台。但这只小瓢虫成功击碎了‘不可能’的标签。”对此,Andreas Kling也表示:我们依然在努力让Ladybird变得更好、更快,我们会持续关注关注Ladybird各类功能的正确性和功能支持,并对整体新能进行优化。在博客末尾,Andreas Kling提到:尽管我不确定我们的工作方式可以直接转移到其他软件项目上(除非它们也是浏览器)并给其他团队带来帮助,但是通过一个由聪明、专注的个人组成的小团队和一个知识渊博的领导者来指导他们,你可以尝试构建任何你想要的软件。你当然可以做到,即使没有数十亿美元和数百名员工,没必要听取那些从未开发过浏览器的失败主义者的纸上谈兵。

相关文章:

从头创建一个新的浏览器,这合理吗?

从头构建一个新浏览器?这如果是不是个天大的“伪需求”,便是一场开发者的噩梦! 要知道,如果没有上百亿的资金和数百名研发工程师的投入,从头开始构建一个新的浏览器引擎,几乎是不可能的。然而SerenityOS系统…...

TypeScript泛型类型和接口

本节课我们来开始了解 TypeScript 中泛型类型的概念和接口使用。 一.泛型类型 1. 前面,我们通过泛型变量的形式来存储调用方的类型从而进行检查; 2. 而泛型也可以作为类型的方式存在,理解这一点,先了解下函数的…...

docker命令

1.运行 docker-compose up 2.查看命令 docker images 3.删掉docker镜像: docker rmi -f [id] docker卸载 1.杀死docker有关的容器: docker kill $(docker ps -a -q) 2.删除所有docker容器:docker rm $(docker ps -a -q) 3.删除所有docker镜像&…...

2023 年 3 月 NFT 月度报告

作者:Danielfootprint.network 数据来源:NFT Monthly Report 三月份的 NFT 市场上出现了两个有趣的趋势。一方面,Polygon 链尽管在二月份有所突破,达到了 NFT 总交易量的 4.2%,但于三月再次跌至 1% 以下,…...

【http】 get方法和Post方法区别;http和https

get方法和Post方法 get方法:通过url传参,回显输入的私密信息,不够私密 Post方法:通过正文传参,不会回显,一般私密性有保证。 一般如果上传的图片,音频比较大,推荐Post方法&#x…...

第三章 法的渊源与法的分类

目录 第一节 法的渊源的分类 一、法的渊源释义二、法的渊源种类 第二节 正式法源 一、正式法源的含义二、当代中国的正式法源三、正式法源的一般效力原则 第三节 非正式法源 一、当代中国的非正式法源 第四节 法的分类 一、法的一般分类二、法的特殊分类 第一节 法的渊源的…...

在Ubuntu18.04或者20.04下搭建edk2运行环境

#更新完之后依次执行下面两条命令 1.apt-get update 2.apt-get upgrade 如果执行之后出现源不能更新的问题,到/etc/apt/sources.list.d 下删除对应的ppa源重新更新即可解决 git clone https://github.com/tianocore/edk2.git cd edk2 git submodule update --init 如果git cl…...

多线程编程常用函数用法

一、多线程编程常用函数用法 1、pthread_create 头文件 #include<pthread.h>函数声明 int pthread_create(pthread_t*restrict tidp,const pthread_attr_t *restrict_attr,void*&#xff08;*start_rtn)(void*),void *restrict arg)函数功能 pthread_create是UNIX环境…...

C++ 标准模板库(Standard Template Library,STL)

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…...

一个寄存器的bit2 bit3位由10修改成11,C示例

方法1&#xff1a; 如果需要将一个寄存器中的 bit2 和 bit3 两个位从 11 修改为 10&#xff0c;可以使用如下的 C 语言代码实现&#xff1a; // 将寄存器的 bit2 和 bit3 位从 11 修改为 10 volatile uint32_t *reg_addr (volatile uint32_t *)0x12345678; // 假设寄存器地址…...

【洛谷】P1631 序列合并

【洛谷】 P1631 序列合并 题目描述 有两个长度为 N N N 的单调不降序列 A , B A,B A,B&#xff0c;在 A , B A,B A,B 中各取一个数相加可以得到 N 2 N^2 N2 个和&#xff0c;求这 N 2 N^2 N2 个和中最小的 N N N 个。 输入格式 第一行一个正整数 N N N&#xff1b; 第二…...

2023年七大最佳勒索软件解密工具

勒索软件是目前最恶毒且增长最快的网络威胁之一。作为一种危险的恶意软件&#xff0c;它会对文件进行加密&#xff0c;并用其进行勒索来换取报酬。 幸运的是&#xff0c;我们可以使用大量的勒索软件解密工具来解锁文件&#xff0c;而无需支付赎金。如果您的网络不幸感染了勒索软…...

prettier 命令行工具来格式化多个文件

prettier 命令行工具来格式化多个文件 你可以使用 prettier 命令行工具来格式化多个文件。以下是一个使用命令行批量格式化文件的示例&#xff1a; 安装 prettier 如果你还没有安装 prettier&#xff0c;你可以使用以下命令安装它&#xff1a; npm install -g prettier 进入…...

我发现了PMP通关密码!这14页纸直接背!

一周就能背完的PMP考试技巧只有14页纸 共分成了4大模块 完全不用担心看不懂 01关键词篇 第1章引论 1.看到“驱动变革”--选项中找“将来状态” 2.看到“依赖关系”--选项中找“项目集管理” 3.看到“价值最大化”--选项中找“项目组合管理” 4.看到“可行性研究”--选项中…...

Medical X-rays Dataset汇总(长期更新)

目录​​​​​​​ ChestX-ray8 ChestX-ray14 VinDr-CXR VinDr-PCXR ChestX-ray8 ChestX-ray8 is a medical imaging dataset which comprises 108,948 frontal-view X-ray images of 32,717 (collected from the year of 1992 to 2015) unique patients with the text-mi…...

一文告诉你如何做好一份亚马逊商业计划书的框架

“做亚马逊很赚钱”、“我也来做”、“哎&#xff0c;亏钱了”诸如此类的话听了实在是太多。亚马逊作为跨境电商老大哥&#xff0c;许多卖家还是对它怀抱着很高的期许。但是&#xff0c;事实的残酷的。有人入行赚得盆满钵盈&#xff0c;自然也有人亏得血本无归。 会造成这种两…...

原来ChatGPT可以充当这么多角色

充当 Linux 终端 贡献者&#xff1a;f 参考&#xff1a;https ://www.engraved.blog/building-a-virtual-machine-inside/ 我想让你充当 linux 终端。我将输入命令&#xff0c;您将回复终端应显示的内容。我希望您只在一个唯一的代码块内回复终端输出&#xff0c;而不是其他任…...

数据结构_第十三关(3):归并排序、计数排序

目录 归并排序 1.基本思想&#xff1a; 2.原理图&#xff1a; 1&#xff09;分解合并 2&#xff09;数组比较和归并方法&#xff1a; 3.代码实现&#xff08;递归方式&#xff09;&#xff1a; 4.归并排序的非递归方式 原理&#xff1a; 情况1&#xff1a; 情况2&…...

“成功学大师”杨涛鸣被抓

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 4月15日&#xff0c;号称帮助一百多位草根开上劳斯莱斯&#xff0c;“成功学大师”杨涛鸣机其团队30多人已被刑事拘留&#xff0c;培训课程涉嫌精神传销&#xff0c;警方以诈骗案进行立案调查。 …...

【hello C++】内存管理

目录 前言&#xff1a; 1. C/C内存分布 2. C语言动态内存管理方式 3. C内存管理方式 3.1 new / delete 操作内置类型 3.2 new和delete操作自定义类型 4. operator new与operator delete函数 4.1 operator new与operator delete函数 5. new和delete的实现原理 5.1 内置类型 5.2…...

AppArmor零知识学习十二、源码构建(9)

本文内容参考&#xff1a; AppArmor / apparmor GitLab 接前一篇文章&#xff1a;AppArmor零知识学习十一、源码构建&#xff08;8&#xff09; 在前一篇文章中完成了apparmor源码构建的第六步——Apache mod_apparmor的构建和安装&#xff0c;本文继续往下进行。 四、源码…...

Unity - 带耗时 begin ... end 的耗时统计的Log - TSLog

CSharp Code // jave.lin 2023/04/21 带 timespan 的日志 &#xff08;不帶 log hierarchy 结构要求&#xff0c;即&#xff1a; 不带 stack 要求&#xff09;using System; using System.Collections.Generic; using System.IO; using UnityEditor; using UnityEngine;public…...

Python 智能项目:1~5

原文&#xff1a;Intelligent Projects Using Python 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 深度学习 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 不要担心自己的形象&#xff0c;只关心如何实…...

C++设计模式:面试题精选集

目录标题 引言&#xff08;Introduction&#xff09;面试的重要性设计模式概述面试题的选择标准 设计模式简介 面试题解析&#xff1a;创建型模式&#xff08;Creational Patterns Analysis&#xff09;面试题与解答代码实例应用场景分析 面试题解析&#xff1a;结构型模式&…...

蓝桥 卷“兔”来袭编程竞赛专场-10仿射加密 题解

赛题介绍 挑战介绍 仿射密码结合了移位密码和乘数密码的特点&#xff0c;是一种替换密码。它是利用加密函数一个字母对一个字母的加密。加密函数是 yaxb(mod m) &#xff0c;且 a,b∈Zm &#xff08;a、b 的值在 m 范围内&#xff09;&#xff0c;且 a、m 互质。 m 是字符集的…...

android so库导致的闪退及tombstone分析

android中有3种crash情况&#xff1a;未捕获的异常、ANR和闪退。未捕获的异常一般用crash文件就可以记录异常信息&#xff0c;而ANR无响应表现就是界面卡着无法响应用户操作&#xff0c;而闪退则是整个app瞬间退出&#xff0c;个人感觉对用户造成的体验最差。闪退一般是由于调用…...

图结构基本知识

图 1. 相关概念2. 图的表示方式3. 图的遍历3.1 深度优先遍历&#xff08;DFS&#xff09;3.2 广度优先遍历&#xff08;BFS&#xff09; 1. 相关概念 图G(V,E) &#xff1a;一种数据结构&#xff0c;可表示“多对多”关系&#xff0c;由顶点集V和边集E组成&#xff1b;顶点(ve…...

Hibernate 的多种查询方式

Hibernate 是一个开源的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;它可以将 Java 对象映射到数据库表中&#xff0c;实现对象与关系数据库的映射。Hibernate 提供了多种查询方式&#xff0c;包括 OID 检索、对象导航检索、HQL 检索、QBC 检索和 SQL 检索。除此…...

FreeRTOS 任务调度及相关函数详解(一)

文章目录 一、任务调度器开启函数 vTaskStartScheduler()二、内核相关硬件初始化函数 xPortStartScheduler()三、启动第一个任务 prvStartFirstTask()四、中断服务函数 xPortPendSVHandler()五、空闲任务 一、任务调度器开启函数 vTaskStartScheduler() 这个函数的功能就是开启…...

飞桨paddlespeech语音唤醒推理C实现

上篇&#xff08;飞桨paddlespeech 语音唤醒初探&#xff09;初探了paddlespeech下的语音唤醒方案&#xff0c;通过调试也搞清楚了里面的细节。因为是python 下的&#xff0c;不能直接部署&#xff0c;要想在嵌入式上部署需要有C下的推理实现&#xff0c;于是我就在C下把这个方…...