前端与编译原理 用js去运行js代码 js2run

# 前端与编译原理 用js去运行js代码 js2run

前端与编译原理似乎相隔甚远,各种热门的框架都学不过来,那能顾及到这么多底层呢,前端开发者们似乎对编译原理的影响仅仅是"抽象语法树",但这只是个开头而已,我们的目的是利用js直接运行js代码

项目地址
安装及使用方法

写这个干嘛,有现成的eval不香么

接触过微信小程序开发的同学或许知道,小程序为运行环境禁止new Function,eval,setTimeout等方法的使用,限制了我们执行字符串形式的动态代码,其他小程序平台对此也有诸多限制,但是解析器毕竟也就是那么回事,可以写一个解析器,让Js自己去运行自己

编译器和解释器

编译器负责代码转化成语法树,代码经过编译器的词法分析,语法分析等阶段过后,会生成一个树状结构的抽象语法树(AST),里面详尽的描述了代码类型,开始结束位置等信息,感兴趣的同学可以在这个AST Explorer网站自行体验
到了AST阶段代码还不能够运行,但是AST详细的记录了代码的语义化信息,所以Babel,Webpack,Sass,Less,Prettier等工具可以进行各种处理,能够把AST翻译成目标语言并运行的工具叫做"解释器"

关于编译器已经有现成的Babel,acron供我们选择,他们都较为成熟,选哪个都没错,看喜好,由于解释本事干的事情就是,写了什么代码,就按照什么代码去执行,比如有一段代码var a = 1,那就在执行环境里创建一个变量a并赋值1,接下的一行是a += 10那就在执行环境里把这个变量a给他加上100,这个执行环境可以是一个对象,每次声明变量或者执行操作,都是在对对象进行操作,当操作结束的时候,释放掉变量即可,不会对执行环境以外的代码有影响,由于是js去运行js,new关键字,this,循环,以及对象的方法等都不需要有太多的改动,可以让js解释器的实现变得非常简单

后续

在写解释器的时候,需要考虑关键字判断,标识符节点处理,字符节点,表达式,块级声明,函数定义,函数表达式,this,new,循环,if等各种代码的处理,在这里就不一一详尽的去描述了,源码参考了@jrainlau大神的代码,至于生产环境的使用也可以参考@axetroy的开源项目,可以参考源码中的注释,也可以看大神们的文章

感谢以下成员
@jrainlau
@axetroy 这位大神的runjs更成熟一些,如果项目需要可以参考这个

原文地址:https://www.cnblogs.com/moshuying/p/11829135.html

时间: 2024-10-16 23:02:47

前端与编译原理 用js去运行js代码 js2run的相关文章

wex5 教程 前端UI编译原理与记事本编辑

一 前言 wex5页面,与html页面有何差异?两者之前的关系是什么?是如何完成转译的? 能否像编辑html那样用记事本来修改w页面? wex5前端UI在云部署后能否在云端进行二次编辑,而不需要在wex5编辑器里修改后再次上传?? 带着这些问题,重新认识wex5的UI设计与编译原理,有助于我们分离前端开发. 二 页面结构分析: wex5页面由w.js,css三个页面构成,具体功能与对应关系如下: 三 编译后页面结构 1 在公有云部署时,要将wex5页面进行编译,得到部署需要的Native下的ww

0前端 框架 库_千万别去碰js呀 混合APP_webAPP_美工 选有类型的语言,比如TypeScript

component 组件 成分; 零件; [数]要素; 组分; Angular2怎么使用第三方的component库(如 jquery,easyUI ,Bootstrap 等) PWA  增强web app helloWorld跑起来了,之前失败是因为Chrome服务器插件要FQ才能下载 https://developers.google.cn/web/fundamentals/getting-started/codelabs/your-first-pwapp/ 安装谷歌插件 web-serve

编译原理之Lexical Analysis(js实现)

// 实验存档 效果图: 代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Lexical_Analysis</title> <link href="https://fonts.googleapis.com/css?family=Noto+Serif+SC" rel="stylesheet"&

前端要以正确的姿势学习编译原理(上篇)

转自:https://zhuanlan.zhihu.com/p/36301857 前言 最近在我的 timline 上面出现了很多类似<前端为什么要学编译原理>这类文章以及<前端怎么学AST>这类的问题,但是却发现并没有人给大家介绍前端要如何以系统并且正确地学习编译原理,所以我就结合自己的经验以及走过的弯路来给大家分享点心得和经验,希望能让大家少走点弯路. 最后我并不是前端,只是恰好会写点 JavaScript 而已. 目录 上篇: 编译原理为什么难 怎么学好编程语言 代码到底是什

0909走进编译原理

1.编译原理学什么? 编译原理这一学科,主要学习的是编译器方面的原理与技术,我们能从中学会各种算法与代码的原理,明白计算机是如何“听懂人话”,我们的代码是如何经过编译器转换成机器语言,这样不仅能实现自己去编写简单的小编译器,也能通过此学科去接触已有各编译器的思想,认识到编程方面更多要注意的问题以及解决的方向,站在本质的角度看代码,从而更能成就计算机专业人员的计算机逻辑思维. 2.为什么要学编译原理? 说到编译原理,人们喜欢把这门学科比作人体解剖和造轮子,是计算机中和代码作斗争的一门学科.据本人理

前端工程师为什么要学习编译原理?

转自:https://zhuanlan.zhihu.com/p/31096468 前言 普遍的观点认为,前端就是打好 HTML.CSS.JS 三大基础,深刻理解语义化标签,了解 N 种不同的布局方式,掌握语言的语法.特性.内置 API.再学习一些主流的前端框架,使用社区成熟的脚手架,即可快速搭建一个前端项目.胜任前端工作非常容易.再往深处学习,你会发现前端这个领域,总是有学不完的框架.工具.库,不断有新的轮子出现.技术推陈出新,版本快速迭代,但万变不离其宗.工具致力于流程自动化.规范化,服务于简

大前端开发者需要了解的基础编译原理和语言知识

转自:https://yq.aliyun.com/articles/180879 在我刚刚进入大学,从零开始学习 C 语言的时候,我就不断的从学长的口中听到一个又一个语言,比如 C++.Java.Python.JavaScript 这些大众的,也有 Lisp.Perl.Ruby 这些相对小众的.一般来说,当程序员讨论一门语言的时候,默认的上下文经常是:“用 xxx 语言来完成 xxx 任务”.所以一直困扰着的我的一个问题就是,为什么完成某个任务,一定要选择特定的语言,比如安卓开发是 Java,前

Sea.Js的运行原理

1.CMD(Common Module Definition)规范 Sea.js采用了和Node相似的CMD规范,使用require.exports和module来组织模块.但Sea.js比起Node的不同点在于,前者的运行环境是在浏览器中,这就导致A依赖的B模块不能同步地读取过来,所以Sea.js比起Node,除了运行之外,还提供了两个额外的东西: a.模块的管理 b.模块从服务端的同步 即Sea.js必须分为模块加载期和执行期.加载期需要将执行期所有用到的模块从服务端同步过来,在再执行期按照

前端开发环境之GRUNT自动WATCH压缩JS文件与编译SASS文件

前端开发环境之GRUNT-JAVASCRIPT任务运行器 前言: 1.sass编译为css文件,早先时刻写css,后来看了sass挺不错的,于是在新的项目中开始使用上了sass. 原方法: ①安装ruby ②编译sass文件(eg:style) sass style.scss style.css ③监控文件/文件夹的变化来自动编译sass文件 sass --watch style.scss:style.css #file sass --watch cssFilePath