随笔分类 - V8源码系列
摘要:上一篇讲了字符串的解析过程,这一篇来讲讲标识符(IDENTIFIER)的解析。 先上知识点,标识符的扫描分为快解析和慢解析,一旦出现Ascii编码大于127的字符或者转义字符,会进入慢解析,略微影响性能,所以最好不要用中文、特殊字符来做变量名(不过现在代码压缩后基本不会有这种情况了)。 每一位Jav
阅读全文
摘要:AST模块其实要写的话,100篇都写不完,我将一些简单知识点翻译成JavaScript代码来进行讲解(v8内部的复杂性永远都能超出我的意料,现在看到万行的源码都已经没感觉了),如果谁想看C++源码,就去翻我前面的流水账。 代码地址:https://github.com/pflhm2005/V8rec
阅读全文
摘要:花了5篇才把一个字符串词法给解析完,不知道要多久才能刷完整个流程,GC、复杂数据类型的V8实现那些估计又是几十篇,天呐,真是给自己挖了个大坑。 前面几篇实际上只是执行了scanner.Initialize方法,并未开始全面解析,继续跑流程。 后面的方法域都在Parser类下,毕竟这是整个AST的执行
阅读全文
摘要:懒得发首页了,有时候因为贴的代码太多会被下,而且这东西本来也只是对自己学习的记录,阅读体验极差,所以就本地自娱自乐的写着吧! 由于是解析字符串,所以在开始之前介绍一下词法结构体中关于管理字符串类的属性。之前在TokenDesc中,有两个属性,如下。 当时没有详细讲,主要也是比较麻烦,在这里介绍一下该
阅读全文
摘要:(再声明一下,为了简单暴力的讲解AST的转换过程,这里的编译内容以"'Hello' + ' World'"作为案例) 上一篇基本上花了一整篇讲完了scanner的Init方法,接下来就是Scan了,Init的方法基本上都是在Stream类下操作,但是本节回到了scanner层级。 虽然这里只有简简单
阅读全文
摘要:上篇简单介绍了入口方法的流程以及scanner类相关的部分内容,这一篇主要讲scanner的初始化,即 注意,这不是调用静态方法。实际上Parser实例生成的时候也把scanner属性初始化了,所以这里可以直接用。 实际上,就是初始化了scanner上的source_属性与模块的flag,以便调用I
阅读全文
摘要:先声明一下,这种长系列的大块头博客只能保证尽可能的深入到每一行源码,有些代码我不乐意深究就写个注释说明一下作用。另外,由于本地整理的比较好,博客就随心写了。 整个Compile过程目前只看到asmjs之前,简单的过了几遍,大部分方法没有点进去看,实在是太复杂了。上一篇的结尾指出了AST的入口,也就是
阅读全文
摘要:没办法了,开坑吧,接下来的几篇会讲述JavaScript字符串源码在v8中转换成AST(抽象语法树)的过程。 JS代码在V8的解析只有简单的几步,其中第一步就是将源字符串转换为抽象语法树,非常类似于vue中将html转换为VNODE的过程。该过程涉及的类并不多,均位于/src/parsing文件夹中
阅读全文
摘要:不知不觉都快月底了,看了看上一篇还是6号写的,惭愧惭愧,说好的坚持。为了证明没有偷懒(其实还是沉迷了一会dota2),先上一个图自证清白。 基本上从初始化引擎,到Isolate、handleScope、Context一直到编译其实都有记录,但是实在是无从下手。虽说我的博客也没有什么教学意义,但是至少
阅读全文
摘要:上一篇其实想讲初始化的第二步,但是内容比较无聊,所以换了一个话题,谈了谈v8的命名空间和宏,稍微轻松一下。 在这里还是接着说说初始化过程,毕竟写博客的初衷是对自己努力的记录,不是为了吸粉,这篇没图,对代码本身没有兴趣的可以跳过了。 再多说几句,讲一下我怎么看的源码吧。源码的一些方法涉及很多类和文件,
阅读全文
摘要:v8的初始化三部曲,前面花了三篇解决了第一步,由于只是生成了一个对象,第二步就是将其嵌入v8中,先看一下三个步骤。 第一步可以由用户自己手动实现platform,只要按照规范来继承对应基类,一般也不会有人搞吧。 这里的嵌入,如果用代码来进行解释,实际上是叫做"命名空间"。v8引擎的体量非常巨大,所以
阅读全文
摘要:先说结论,V8引擎在默认Platform中初始化的这个线程是用于处理类似于setTimeout的延时任务。 另外附一些图,包括继承树、关键属性归属、纯逻辑工作流程,对代码木得兴趣的看完图可以X掉了。 上一篇讲了V8初始化默认Platform对象时会做三件事,其中生成空白DefaultPlatform
阅读全文
摘要:又到了常规的堆砌代码凑文章字数环节,很多API我就直接贴官方的英文释义,个人翻译其实有时候并不是很准确,搞错了甚至会误导,还是尽量自己去理解。 首先看看入口方法。 这里比较头疼的是我没找到NewDefaultPlatform方法是在哪里定义的,所以默认参数不知道是什么,只能打断点调试看变量值,已经在
阅读全文
摘要:本来寻思着写一篇"'Hello' + ', World'"是怎么从JS代码编译然后输出的,然而compile过程的复杂性远超我的想象,强上怕会走火入魔,还是老老实实先回家种田,找点咸鱼方法先写着。虽然说是咸鱼方法,但是V8任何一块拿出来都不简单,之前讲的Time模块说实话大概是属于源码里面幼儿园级别
阅读全文
摘要:这一篇讲windows系统下TimeTicks的实现。 对于tick,V8写了相当长的一段discussion来讨论windows系统上计数的三种实现方法以及各自的优劣,注释在time.cc的572行,这里直接简单翻译一下,不贴出来了。 CPU cycle counter.(Retrieved vi
阅读全文
摘要:上一篇的源码看得十分无趣,官方文档跟黑心棉一样渣。 这一篇讲讲windows操作系统上的时间戳实现,由于类的声明,方法解释上一篇都贴过了,所以这次直接上对应版本的代码。 windows与mac很不一样,实现了一个新的Clock类来管理时间,如下。 从注释和方法名可以看出,windows完全用这个新类
阅读全文
摘要:由于底层逻辑实现不同操作系统区别很大,所以干脆分篇来说。 主要讲一下Time、TimeTicks两个类里面对于时间戳的实现,其余的运算符重载、边缘工具方法就不看了,先是Time。 Time 类本身的说明在上一篇有,这里就去掉了。 从注释可知,这里的Now是返回国际时间戳的通用方法,但是操作系统可能会
阅读全文
摘要:积跬步,行千里,先从最简单的开始写。 这一篇介绍V8中的时间模块,与libuv粗糙的update_loop_time方法不同,V8有一套独立完整的类负责管理时间。 该类位于src/base/platform/time.h,是一个辅助模块,首先来看一下继承树。 整个模块的继承关系比较简单,一般常用的就
阅读全文
摘要:这一篇不打算讲技术,聊点别的吧,写这个的原因主要是看到了我博客园的签名,开始这个最终源码系列前想说点什么。 转行前端(达成) 入行1年vue源码(达成)、webpack源码(半达成) 入行2年争取读通node源码 (学习中) 入行3年进大厂(提前达成)或者入门V8引擎 目前转前端第二年,抓紧时间啦
阅读全文
摘要:记录一下步骤,方便以后换了电脑重新编译。 1、搞定depot_tools,git地址:git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git,弄完后设置为环境变量(export PATH=$PATH:/pa
阅读全文

浙公网安备 33010602011771号