===
前端与编译原理彷佛相隔甚远,各类热门的框架都学不过来,那能顾及到这么多底层呢,前端开发者们彷佛对编译原理的影响仅仅是"抽象语法树
",但这只是个开头而已,咱们的目的是利用js直接运行js代码前端
接触过微信小程序开发的同窗或许知道,小程序为运行环境禁止new Function,eval,setTimeout
等方法的使用,限制了咱们执行字符串形式的动态代码,其余小程序平台对此也有诸多限制,可是解析器毕竟也就是那么回事,能够写一个解析器,让Js本身去运行本身git
编译器负责代码转化成语法树,代码通过编译器的词法分析,语法分析等阶段事后,会生成一个树状结构的抽象语法树(AST)
,里面详尽的描述了代码类型,开始结束位置等信息,感兴趣的同窗能够在这个AST Explorer网站自行体验
到了AST阶段代码还不可以运行,可是AST详细的记录了代码的语义化信息,因此Babel,Webpack,Sass,Less,Prettier
等工具能够进行各类处理,可以把AST翻译成目标语言并运行的工具叫作"解释器"github
关于编译器已经有现成的Babel,acron
供咱们选择,他们都较为成熟,选哪一个都没错,看喜爱,因为解释本事干的事情就是,写了什么代码,就按照什么代码去执行,好比有一段代码var a = 1
,那就在执行环境里建立一个变量a并赋值1,接下的一行是a += 10
那就在执行环境里把这个变量a给他加上100,这个执行环境能够是一个对象,每次声明变量或者执行操做,都是在对对象进行操做,当操做结束的时候,释放掉变量便可,不会对执行环境之外的代码有影响,因为是js去运行js,new关键字,this,循环,以及对象的方法等都不须要有太多的改动,可让js解释器的实现变得很是简单小程序
在写解释器的时候,须要考虑关键字判断,标识符节点处理,字符节点,表达式,块级声明,函数定义,函数表达式,this,new,循环,if等各类代码的处理,在这里就不一一详尽的去描述了,源码参考了@jrainlau大神的代码,至于生产环境的使用也能够参考@axetroy的开源项目,能够参考源码中的注释,也能够看大神们的文章segmentfault