写在前面的话,又开了一个新坑,之前想写的关于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