Evaluate之迷思

evaluate这个词到底是什么意思?按照翻译的解释:

form an idea of the amount, number, or value of; assess.

实在是有点抽象。在应用中,感觉最常见的意思大概就是“评估”了。不过,在数学里,它是“求值”,求出某个表达式的值(区别于solve,solve是解方程的“解”),对应于”value of“;在人机交互里,这个意思有点接近于评估,但是重点在让行为符合用户的精神模型,满足易学性,让用户能够顺利地“理解”系统功能,也是一个form idea的过程;在个别地方,还有隐含的近似于“赋值”的意思,不过这个多半就是意译了。语言么,总要有点只可意会不可言传的东西在里面。

对于JavaScript脚本来说,在parse解析之后,execute执行之前,还有一个evaluate的过程。那么,这个evaluate是什么呢?读了一大堆资料,总觉得对于外国人来说,这个词的意思是常识……不过我注意到,evaluate的同义词里,居然有一个analyze。也就是说,evaluate居然有一个隐藏的“分析”的意思。后来,我在Stack Overflow上看到了这么一段:

When a statement is executed then it comes to the action of evaluation of its expressions. First execution takes place and then evaluation.

In the snippet

int i = 5, j;
j = 10 + 5*i;

when the statement j = 10 + 5*i; is executed then evaluation of expressions j, 10, 5*i, 10 + 5*i and j = 10 + 5*i takes place. Note that first three can be evaluated in any order.

虽然他这里的evaluate似乎指的还是表达式求值,但是倒是提醒我了。我们知道,编译语言在执行之前,会经过词法分析、语法分析、代码生成的阶段。JavaScript事实上是编译语言,只不过是编译后立即执行而已,显然也会经历这三个阶段。因为词法分析阶段进行分词tokenize,语法分析阶段形成抽象语法树AST,也就是parse的过程;那么,evaluate对应的应该是代码生成,也就是将AST转换成可执行代码这个过程。虽然没有这么简单,因为JavaScript引擎(最著名的要数V8了吧)必然会有属于自己的性能优化过程;不过从大体来说应该是这样。

事实上,在《WebKit技术内幕》一书中提到了Chrome加载网页的过程:

  1. 当用户输入网页URL的时候,WebKit调用其资源加载器加载该URL对应的网页。
  2. 加载器依赖网络模块建立连接,发送请求并接受答复。
  3. WebKit接收到各种网页或者资源的数据,其中某些资源可能是同步或异步获取的。
  4. 网页被交给HTML解释器转变成一系列的词语(Token)。
  5. 解释器根据词语构建节点(Node),形成DOM树。
  6. 如果节点是JavaScript代码的话,调用JavaScript引擎解释并执行。
  7. JavaScript代码可能会修改DOM树的结构。
  8. 如果节点需要依赖其他资源,例如图片、CSS、视频等,调用资源加载器来加载他们,但是他们是异步的,不会阻碍当前DOM树的继续创建;如果是JavaScript资源URL(没有标记异步方式),则需要停止当前DOM树的创建,直到JavaScript的资源加载并被JavaScript引擎执行后才继续DOM树的创建。

在这一点上,我和这位的观点是一致的:如果加了async属性就相当于单独开了一个线程,而defer是和将<script>放到<body>底部一样的效果。

打开Chrome的开发者工具,在performance的Bottom-Up标签里能看到整个网页加载的全过程。可以看到,的确如此。compile的过程中有evaluate:

在这里插入图片描述

这里的evaluate可能更接近analyze的意思,进行了语法分析。这个阶段可能会修改DOM,所以会有Parse HTML和appendChild来修改DOM的过程。除此之外,还有一个单独的evaluate阶段:

在这里插入图片描述

这个阶段应该对应的就是代码生成了。

而且,有时候会看到,词法分析阶段会承担evaluate的一部分职责。这个我觉得是因为分词结束后,有一部分代码已经是可执行的了,没有必要进一步转换,可以直接生成可执行代码。至于为什么Parse HTML的时候也会有evaluate,是因为会有HTML内嵌的script;而且,script一直是内嵌在HTML里的,两者密不可分。

所以,如果要我给evaluate一个翻译,我想叫它“生成”。从大体上来看,这个解释是能够对应于analyze这个同义词的,而且也还算符合assess、form idea的定义;生成可执行代码,不算是“form an idea of the code”么?(笑)。

参考资料
  1. What is the difference between execution and evaluation?
  2. The Glossary of Human Computer Interaction
  3. 浅谈script标签的defer和async
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值