How-Browers-Work

##### 浏览器的主要功能

浏览器的主要功能是展示你所选择的资源,这些资源通常是HTML文档,也可能是PDF,图像,以及其他格式内容。这些资源通过统一资源定位符(Uniform Resource Identifier, URI)来定位。

HTML文档是通过HTML和CSS规范类具体说明的。这些规范由W3C组织维护。

##### 浏览器的高层结构

1. **The user interface**
2. **The browser engine**
3. **The rendering engine**
4. **Networking**
5. **UI backend**
6. **JavaScript interpreter**
7. **Data storage**

###### The render engine

默认渲染展示HTML,XML和图片。通过插件或扩展支持PDF之类的展示。

渲染引擎,也就是通常所说的浏览器内核。不同浏览器使用不同的渲染引擎:

- Firefox --> Gecko
- Safari --> WebKit
- Chrome --> Blink

##### The main flow

* Parsing HTML to construct the DOM tree(content tree)
* Render tree construction (add style)
* Layout of the render tree (giving each node the exact coordinates)
* Painting the render tree (painted node using the UI backend layer)

这是一个渐进的过程,为了更好的用户体验,渲染引起会尽快地展示内容。当还有一部分内容还在通过网络传输过来时,另一部分内容已经被解析展示了。

###### Parsing-general

解析一个文档意味着将它翻译成一个代码可以使用的**结构**。解析的结果通常是一个代表着文档结构的节点树,也叫解析树或语法树。

###### Grammars

解析是基于文档所遵循的语法规则进行的。可以进行解析的格式,必须要有由**词汇**和**语法规则**构成的**确定的语法**,也被称为**上下文无关语法**。

###### Parser-Lexer combination

解析可以分为**词法分析(lexical analysis)**和**语法分析(syntax analysis)**。

* lexical analysis: 把输入转化成token(language vocabulary),即有效的构建块
* syntax analysis: 运用language语言规则

通过**lexer**获得有效的token block,再通过**parser**,用语法规则将这些token block结构化。

###### Translation

在一些情况下,parse tree不是最终产品,而是在translation中使用的中间格式。比如编译(compilation)。

###### Formal definitions for vocabulary and syntax

* vocabulary is usually expressed by **regular expressions**
* syntax is usually defined in a format called **BNF**

一个语言的语法必须是**上下文无关语法(context free grammar)**才可以被正则解析。上下文无关语法的一个直观定义是:语法可以通过BNF完全表达。

###### Type of parsers

There are two types of parses:

* top down parsers: 从语法的高层结构(high level structure)开始,寻找匹配的规则。
* bottom up parsers: 从输入开始,逐步地转化为语法规则,从低层的规则(low level rules)到高层的规则(high level rules)。

###### Generating parsers automatically

手写高效的解析器是很难的,不过这里有工具可以通过输入语法(vocabulary & syntax rules)自动生成解析器。

WebKit使用了两个知名的解析器生成器:

* Flex for creating a lexer
* Bison for creating a parser

###### HTML Parser

将HTML markup解析成parse tree。

###### The HTML grammar definition

The vocabulary and syntax of HTML are defined in **specifications** created by the W3C organization.

###### Not a context free grammar

相较于XML严格的语法,HTML有着较宽松的语法,这使得HTML不是上下文无法语法的,也就无法使用常规的解析器来进行解析。

###### DOM

解析的输出树(解析树)是一个由DOM元素和属性节点构成的树形结构。DOM(Document Object Model)是HTML的对象表示法,以及HTML元素的接口。

###### The parsing algorithm

HTML不能用常规的解析技术:

1. 语言的宽松本质
2. 浏览器对有名的无效HTML的容错支持
3. 解析过程是可重入的(re-entrant),调用document.write()会更改动态更改HTML。

HTML的解析算法由HTML5规范给出了,该算法包含两个阶段:标记化(tokenization, 也就是lexical analysis)和树构建(tree construction)。

###### The tokenization algorithm

这个算法的输出是HTML token。它被表达为一个状态机。

###### Actions when the parsing is finished

HTML解析完成后,开始解析执行“延迟模式”的脚本。文档状态会被设置为"complete"并且"load"事件会被触发。

###### CSS parsing

CSS是上下文无关语法,可以用常规的parser直接解析。而CSS规范中定义了CSS lexical和syntax grammar。

猜你喜欢

转载自www.cnblogs.com/qiuyi116/p/9008784.html