你们觉得作为一个前端,想去了解浏览器整个的渲染过程和执行过程而去学 C++有必要吗?

2016-02-04 11:37:43 +08:00
 coffeedeveloper

好奇的是两方面。

而这些内容也只能通过网络上的一些文章去了解,只能说不甚理解。或者说不能透彻理解。
你们觉得特意去学 C++会不会显得矫情?

如果真的要去学了,要到什么样的一个级别才能够看得懂浏览器相关的一些代码呢?

11671 次点击
所在节点    程序员
78 条回复
jjgod
2016-02-05 19:57:49 +08:00
后面的回复比较有意思了,作为前浏览器开发者补充一下吧:

- 现代浏览器渲染引擎里 2D 绘图的地位不如以前了,大量新的 CSS / DOM 操作都要求把工作放到 GPU 完成,所以虽然 CoreGraphics/Skia 这样的库依然是渲染引擎的核心依赖,但要理解整个渲染流程只理解绘制 (在 Blink 和 WebKit 里叫 painting) 是远远不够的,还要理解 layout 和 compositing ,三者紧密结合。

- 现代浏览器的复杂程度导致个人要对整个引擎的架构和实现有很清晰的了解都很难了,大部分人会选择专攻一个方向,比如你选择 graphics 方向就会专攻用 GPU 做 compositing ,选择 layout 方向就会研究 CSS 的种种特性 (这倒是跟前段需要了解的部分有重叠),选择 painting 部分则会去学习 CG/Skia 这些库的使用和优化等等。一般都先成为了一个领域的专家再考虑兼顾一下和其他领域接口的细节。

- V8 这种 JavaScript 引擎的内部实现其实跟浏览器以及 DOM 的关系不大,除非你要在 JavaScript 语言方面有作为,否则不怎么需要了解 v8 的实现细节 (事实上大部分 Blink 的开发者和 v8 的开发者尽管在一个公司都很少有交流)。

- 了解内部实现有没有帮助?当然是有的,但见效慢,对于前端而言应该更多关注各个浏览器平台的布道师们的 blog 和讲座,那些才是更立竿见影的,比如 Chrome 的年度开发者会议就是主讲比如怎么用 Chrome DevTools 调试和优化 Web 应用的。如果你真的对内部实现很有兴趣再去关注 Blinkon 、 CSS Houdini 这些会议。
snnn
2016-02-05 19:59:14 +08:00
就跟没考上大学但又想自学量子力学一样
zhgg0
2016-02-05 20:06:49 +08:00
为啥要给自己设限呢?想学什么就学什么啊。
Roycom
2016-02-05 21:28:38 +08:00
标记一下
nino
2016-02-05 22:14:23 +08:00
作为前端你读标准就够了,实现不用太在意,跟前端差太远了
virusdefender
2016-02-05 22:42:29 +08:00
秋怡在上面出现了啊,再贴一个她的知乎回答。

https://www.zhihu.com/question/29973122/answer/46405754
bombless
2016-02-05 23:23:06 +08:00
不一定要学 C++, 233
https://www.zhihu.com/question/29261736/answer/45328232
不过 Servo 的 JS 引擎现在仍然是 C++写的。
Rust 的 JS 引擎倒是有几个,不过都是比较业余的。最近 Chakra 开源应该能带来一阵自己写 JS 引擎的热潮吧, 17 年应该能看到效果。
salmon5
2016-02-05 23:26:39 +08:00
看你什么 level ,如果你是 bat 前端里面或相对 bat 前端顶级高手了,完全没问题;
比如
作为 dba 去读 mysql 源码;作为运维去读 linux kernel 源码;(很有必要)
我的体会,读个屁啊, level 没那么高,不太可能有什么造诣。
joyee
2016-02-06 01:09:18 +08:00
@bombless 记得有一次看 Rust 团队的人出来做 talk 提到过用 Rust 写 JS 引擎这个问题,目前的看法是没什么必要,因为 Rust 最重要的特性之一是 safety ,而给浏览器写一个 JS 引擎没有 JIT 根本不能投入生产,而要写 JIT 那基本上就是无穷无尽的 unsafe 了(本质上就是生成汇编然后塞进一个 executable memory ,如何安全的起来……)
joyee
2016-02-06 01:39:03 +08:00
其实有一类前端应用是真的需要了解这些的——数据可视化和游戏开发,典型特征是富交互+大量动画和计算+浏览器负荷重+需要保持一定帧率才不影响用户体验。如果你的工作强迫你天天打开火焰图和各种 profiler 优化再优化,那么这些知识就比较重要了……

举个栗子,如果你不知道在 WebKit 系内核下访问 offsetParent 之类的属性会导致 relayout ,然后在类似 mousemove 里的事件里不断地去触发这些东西,量到了一定程度就可能导致丢帧卡顿。如果不知道 var 会导致内存分配,并且在 V8 里申请分配足够内存后会引发 GC 停顿,于是在 requestAnimationFrame 里不断分配大量内存用于计算,也会造成动画卡顿。或者在每帧执行的函数里引发各种导致你的函数无法被 inline 的东西,比如 eval/with ……另外虽然 JS 有 GC ,但写的不好依然会引发内存泄露,在需要处理大量数据的可视化项目里,特别是拿去做公关的大屏项目里,是很严重的……你总不能发现内存爆了,在众目睽睽之下刷新网页吧囧……

如果你的项目火焰图稀疏无比且面积小,那一般看浏览器实现对日常工作帮助不大,最多了解一下兼容性问题根源+熟悉一下标准?
meathill
2016-02-06 10:07:43 +08:00
没有。你用到的前端库的源码看完了么?没有的话,为什么要去看跟本职工作距离甚远的代码呢?从另一方面来讲,这种细致的观察,就好比生物学家去研究量子物理,太舍近求远了。

不过,如果真觉得有兴趣,那就学呗。
hst001
2016-02-06 13:28:29 +08:00
只是想了解直接找别人的博客看就行了,要深入去看,那已经完全脱离了前端了范围,不仅数据结构算法基础要好,要熟悉 C++,要熟悉底层图形渲染,要跟系统底层打交道,全部会了之后,你已经不是前端了,工资也高了十几个档次
yangkeao
2016-02-06 14:04:00 +08:00
渲染 HTML 和 V8 没有关系。
V8 是 js 解释引擎。

单纯的 V8 和浏览器都没有关系。你看看 node.js 。

如果想要了解浏览器,绝对不是 V8 。而是 Webkit 这样的大家伙。
doyoubi
2016-02-06 15:27:26 +08:00
了解渲染主要还是学 Opengl 可编程管线吧...
C++如果 webkit 代码没用到什么奇怪的模板技巧,大概去了解语法就可以看懂源代码了吧。
我自己只懂点 html/css ,之前用 shader 做过东西,有一次去翻一本讲解 webkit 的书,渲染那部分读起来还是挺好懂的。
nicevar
2016-02-08 22:58:06 +08:00
有时间兴趣就学,学了只有好处没坏处
WalkingEraser
2016-02-09 14:21:03 +08:00
不用 C++,这是基础。。。
Neveroldmilk
2016-02-10 08:51:04 +08:00
了解个大概就差不多了,没必要扣底层代码。
ericgui
2021-05-09 15:52:00 +08:00
我也是前端,也在学习 C++
但目的不是为了了解浏览器
而是为了其他的,比如无人机

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/255348

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX