自己写一个浏览器引擎吧(1)-启程[译] | 普通一码农



自己写一个浏览器引擎吧(1)-启程[译] | 普通一码农

写在前面的话,又开了一个新坑,之前想写的关于Tomcat的源代码的系列还没完成,就看到了这个系列的文章,觉得非常有意思,就想翻译一下,本人英语非常一般,唯希望可以完成吧。

原文地址:http://limpet.net/mbrubeck/2014/08/08/toy-layout-engine-1.html

一、启程

我正在写一个玩具式HTML的渲染引擎,我觉得你也应该能成,今天这篇是这个系列的第一篇:

通过这个系列,我来解释我所写的这个引擎,同时也帮你也做一个属于你的浏览器引擎(听起来很高大上呀),在开始之前先让我来解释一下为什么要做这件事吧。

1 要做个什么东西?

从专业角度来说,浏览器引擎是浏览器的一部分,用来从网络上获取数据,然后将它们转换为我们可以看懂的形式。比如 Blink , Gecko , WebKit , 和 Trident 这些都是浏览器引擎。与之相对,浏览器的UI部分,比如标签页、下拉框、菜单等,这些就被称为"外壳"(原文是 chrome ,这里翻译的可能不太准确)。Firefox 和 SeaMonkey 有不同的"外壳",但它们的内部都用的是 Gecko 这个引擎。

一个浏览器引擎包括了很多子模块,包括 HTTP 客户端、HTML 解析器、CSS 解析器 、Javascript 引擎(里面包括解析器、解释器和编译器)等等。这些模块组合起来,能够将 HTML 和 CSS 这些代码"翻译"成我们在屏幕上看到的网页,有时我们也称浏览器因为叫做布局引擎或是渲染引擎。

2 为什么是一个"玩具式"的渲染引擎?

一个功能完整的浏览器因为是非常复杂而庞大的。Blink,Gecko,Webkit这些知名的浏览器引擎每一个都由上百万行代码组成。就算是一个"年轻点儿",轻量级的渲染引擎比如,Servo和WeasyPrint也有几万行代码。对于一个新手来说想读懂这些代码几乎不太可能。

想要理解一个复杂的软件:如果你学过编译原理或是操作系统的话,你都应该会自己写过或是改过一个"玩具式"的编译器或是内核,它们只是一个用来学习的模型,也许你并不会真正使用它们。但你写的过程才会真正理解它们是如何组成和实现的,是一个非常有效的学习方法。尽管你甚至没有写过一个真正可以"商用"的编译器或是系统内核,但你明白它们的运行原理,也会对你自己的写代码有很大的帮助。

所以,如果你想成为一个浏览器的开发者,或是只是想了解一些浏览器的内容工作原理,都应该自己写一个玩具式的浏览器引擎,不是吗?就想一个"玩具式"的编译器只是实现了一部分,一个"玩具式"的浏览器也只是实现HTML和CSS的一部分功能,当然也不能取代你现在正在用的浏览器,虽然如此,应该也是可以用来渲染一些基本的HTML页面内容的。

3.易于上手
读到这里,希望你已经被我说服,愿意来尝试一下了。如果你已经有一定的编程经验,并且对于HTML和CSS有一些基本了解的话,那么跟着这个系列继续下去应该不难。但如果你还只是一个新手或是你在遇到了一些不懂的地方,请直接来问我,不要客气!
在正式开始前,你需要做几道选择题:

编程语言的选择:

你可以用任何一种语言来写这个引擎。真的!你可以使用一种你熟悉并且喜欢的语言来做吧。或是你也可以给自己一个"借口"去学一门新的语言,这个听起来也挺不错的吧。

如果你想以后可以给一些主流的浏览器引擎比如Gecko或是Webkit贡献代码的话,你可能需要使用C++。因为这些浏览器引擎主要都是用C++写的,使用C++的话,你会比较容易学习它们的代码。

我自己的一个"玩具式"项目,robinson,是用 Rust 写的。我是在 Mozilla 公司 的 Servo 组工作的,所以我们肯定会愿意使用 Rust 这门语言。另外我还有一个目标就是,希望可以通过这个项目可以让人更多的理解 Servo 的实现。 Robinson 很多地方使用的就是简化后的 Servo的 数据结构和代码。

捷径与库的使用

在做这样的"练习"的时候。你会遇到这样的问题,使用别人的代码还是自己来写,这样算不算"作弊"。就此,我的建议是,对于你真正想弄明白的部分,你要自己来写代码,但使用别人的库也不用心理压力。学会如何使用一个库的使用,本事也是一件很有价值的事情。

这里我写 robinson 这个项目也不仅仅是为了我自己,也是希望可以可以作为我的博客的例子来使用。因为这些原因,我就希望它是比较小的且独立的。到目前为止,我除了 Rust 的标准库之外,没有使用其他的外部的代码。(这也是因为 Rust 这门语言在开发中,避免因为多个引用之间编译造成的麻烦)但这也不是一成不变的,举个例子,后面我就准备用一个图形库,而不是自己写一些底层的绘制方面的代码。

另外一个可以不写一部分的代码的方法,就是不做这方面的功能。举个例子来说, robinson 目前还是没有和网络相关的功能,它只能读取本地文件。对于"玩具式"的项目来说,你完全可以根据你的喜好来放弃一部分功能。我也会在后面的文章中提到这些"捷径",你也完全可以跳过这些你不感兴趣的内容。然后如果你后面又改变主意了,也可以回来再"补课"。


Read full article from 自己写一个浏览器引擎吧(1)-启程[译] | 普通一码农


No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts