编程中很少思考的问题(一)
对编程语言的基本理解
编程语言和人类语言有许多相似之处,就是大家遵从一种公认的约定,通过这种约定达到传递信息的目的。对比人类语言包含的主要要素有:词汇表,语法。
这里自己弄了一份对比表。大致能表达这种意思。
分类 | 词汇表 | 语法 |
---|---|---|
人类语言 | 动词,名词... | 主谓宾... |
编程语言 | 数据类型,操作符... | 编程规则:比如末尾加分号... |
来看一个简单的例子:2+3-1
词汇表包含如下:
INTEGER:0|[1-9][0-9]*
PLUS:+
MINUS:-
这里用正则表达式定义整数
语法通常用BNF格式定义
expression := term operation term
operation := PLUS | MINUS
term := INTEGER | expression
通过上面这样我们差不多就约定了一种交流方式。通过约定这种方式,2+3-1
经过解析之后就能被计算机理解了。
对于平时使用的编程语言,基本的设计思路其实就是这样。只不过在词汇表及语法两部分丰富更多。这样就会有一个庞大的组合。
解释器和编译器的区别
- 解释器是一条一条的解释执行源语言。比如php,postscritp,javascript就是典型的解释性语言。
- 编译器是把源代码整个编译成目标代码,执行时不在需要编译器,直接在支持目标代码的平台上运行,这样执行效率比解释执行快很多。比如C语言代码被编译成二进制代码(exe程序),在windows平台上执行。
他们之间的对比图
浏览器的如何工作
把浏览器和App对应起来看。他们做的事情大部分都是获取数据,然后通过特定的方式展示数据并和用户交互。而浏览器和App最大的区别就是:浏览器是为各式各样的应用程序服务的,而通常情况下App只是为单独的应用程序服务。
浏览器主要构成:
最为重要的是其中的:
- 浏览器引擎- 用来查询及操作渲染引擎的接口
- 渲染引擎- 用来显示请求的内容,例如,如果请求内容为html,它负责解析html及css,并将解析后的结果显示出来
所涉及的东西确实有点多,
渲染引擎主流程如下:
下面这几段来至翻译:
渲染引擎开始解析html,并将标签转化为内容树中的dom节点。接着,它解析外部CSS文件及style标签中的样式信息。这些样式信息以及html中的可见性指令将被用来构建另一棵树——render树。
Render树由一些包含有颜色和大小等属性的矩形组成,它们将被按照正确的顺序显示到屏幕上。
Render树构建好了之后,将会执行布局过程,它将确定每个节点在屏幕上的确切坐标。再下一步就是绘制,即遍历render树,并使用UI后端层绘制每个节点。
值得注意的是,这个过程是逐步完成的,为了更好的用户体验,渲染引擎将会尽可能早的将内容呈现到屏幕上,并不会等到所有的html都解析完成之后再去构建和布局render树。它是解析完一部分内容就显示一部分内容,同时,可能还在通过网络下载其余内容。
webkit解析主流程:
这里有篇非常不错的英文文档。
How Browsers Work: Behind the scenes of modern web browsers