首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

「 giao-js 」用js写一个js解释

前言 在这篇文章中,我们将通过 JS 构建我们自己的 JS 解释,用 JSJS,这听起来很奇怪,尽管如此,这样做我们将更熟悉 JS,也可以学习 JS 引擎是如何工作的!...什么是解释 (Interpreter) ? 解释是在运行时运行的语言求值,它动态地执行程序的源代码。解释解析源代码,从源代码生成 AST(抽象语法树),遍历 AST 并逐个计算它们。...解释 (Interpreter) 工作原理 ?...一个完全使用 javascript 实现的,小型且快速的 javascript 解析 本次实践我们将使用 acorn.js ,它会帮我们进行词法分析,语法解析并转换为抽象语法树。...我们这节来实现 1+1 加法的解释。首先我们通过AST explorer,看看 1+1 这段代码转换后的 AST 结构。 ?

46.5K20

实现JavaScript语言解释(一)

因此为了更好地理解JavaScript的语言特性,我就自己动手实现了一个叫做Simple的JavaScript语言解释,这个解释十分简单,它基于TypeScript实现了JavaScript语法的子集...项目介绍 编译 vs 解释 在开始了解Simple的实现原理之前,我们先来搞清楚两个基本的编译原理概念:编译(Compiler) vs 解释(Interpreter)。...解释 解释顾名思义就是会对我们的代码进行解释执行,它和编译不一样,它不会对源代码进行转换(最起码不会输出中间文件),而是边解释边执行源代码的逻辑。...综上所述,一个语言解释的软件架构大体是这样的: 上面其实也就是Simple的软件架构,接着让我们来看一下词法分析的具体实现。...反之,如果状态机发现没有新的字符可以输入而自己又处于一个非终止的状态,它就会抛一个叫做Unexpected EOF的错误 以上就是使用有限状态机来实现词法分析的一个简单例子,Simple解释的词法分析实现和上面的步骤是一样的

1.3K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    实现JavaScript语言解释(二)

    end": { "line": 1, "column": 21 } } } ] 在语法解析(Syntax Analysis)阶段,Simple解释会根据定义的语法规则来分析单词之间的组合关系...在语法解析阶段,如果Simple解释发现输入的Token字符串不能通过既定的语法规则来解析,就会抛出一个语法错误(Syntax Error),例如赋值语句没有右表达式的时候就会抛出Syntax Error...那么对于Simple解释来说,它的语法规则又是什么呢?...细心的你可能发现在上面的例子中所有语句都是以分号;结尾的,这是因为为了简化语法解析的流程,Simple解释强制要求每个表达式都要以分号结尾,这样我们才可以将重点放在掌握语言的实现原理而不是拘泥于JavaScript...下面是一个分别使用浏览原生API和使用JQuery API来实现同样任务的例子: 外部DSL 和内部DSL不同,外部DSL没有依赖的宿主环境,它是一门独立的语言,例如HTML和CSS等。

    59310

    实现一个 BrainFuck 解释

    最近用 Python 实现了一个BrainFuck 解释,简单介绍一下过程。...实现 BrainFuck 解释 我们使用测试驱动设计的方法来实现 Brainfuck 解释,首先需要约定一下 Brainfuck 解释的接口: 约定接口 def execute(code: str...具体的实现可以看源代码仓库。 可能的改进 这个 Brainfuck 解释实现已经比较完善了,不过受限于 Python,整体的执行效率不会特别高。...我们可以将这个字节码保存到文件中,然后用更高效的编程语言(C,Rust)实现字节码解释,来执行这段字节码,效率可以显著提升。...总结 这个 Brainfuck 语言的解释总体上比较简单,但还是反映了使用虚拟机的方式来实现解释的主要流程。

    60010

    实现一个Brainfuck解释

    最近用 Python 实现了一个BrainFuck 解释,简单介绍一下过程。...-- more --> 实现 BrainFuck 解释 我们使用测试驱动设计的方法来实现 Brainfuck 解释,首先需要约定一下 Brainfuck 解释的接口: 约定接口 def execute...具体的实现可以看源代码仓库。 可能的改进 这个 Brainfuck 解释实现已经比较完善了,不过受限于 Python,整体的执行效率不会特别高。...我们可以将这个字节码保存到文件中,然后用更高效的编程语言(C,Rust)实现字节码解释,来执行这段字节码,效率可以显著提升。...总结 这个 Brainfuck 语言的解释总体上比较简单,但还是反映了使用虚拟机的方式来实现解释的主要流程。

    58060

    解释模式

    一、简介 1、解释模式给定一个语言,定义它的文法的一种表示,并定义一个解释,这个解释器使用该表示来解释语言中的句子。...2、类成员 (1)AbstractExpression(抽象表达式):声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享。...(2)TerminalExpression(终结符表达式):实现与文法中的终结符相关联的解释操作。实现抽象表达式中所要求的接口,主要是一个interpreter()方法。...(3)NonterminalExpression(非终结符表达式):为文法中的非终结符实现解释操作。 (4)Context:包含解释之外的一些全局信息。 3、UML ?...4、所属类别:行为型 二、C++程序 1 // 解释模式.cpp : 定义控制台应用程序的入口点。

    96470

    解释模式

    解释模式 解释模式Interpreter Pattern提供了评估语言的语法或表达式的方式,它属于行为型模式,这种模式实现了一个表达式接口,该接口解释一个特定的上下文,解释模式通常被用在SQL解析...描述 在软件开发中,会遇到有些问题多次重复出现,而且有一定的相似性和规律性,如果将它们归纳成一种简单的语言,那么这些问题实例将是该语言的一些句子,这样就可以用编译原理中的解释模式来实现了。...解释模式是给分析对象定义一个语言,并定义该语言的文法表示,再设计一个解析解释语言中的句子,也就是说,用编译语言的方式来分析应用中的实例。...优点 扩展性好,由于在解释模式中使用类来表示语言的文法规则,因此可以通过继承等机制来改变或扩展文法。 容易实现,在语法树中的每个表达式节点类都是相似的,所以实现其文法较为容易。...缺点 执行效率较低,解释模式中通常使用大量的循环和递归调用,当要解释的句子较复杂时,其运行速度很慢,且代码的调试过程也比较麻烦。

    71800

    解释模式

    解释模式,简单来讲就是一个简版的编译,如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。...解释模式能对一些较频率执行的文法转换为一种特定的文法类型,不过解释模式也有其不足,就是如果文法较为复杂的话,就得需要将每一个文法转换成至少一个类,如果包含许多规则的文法可能难以维护和管理。...这个时候就需要其他的技术,就是我们最开始提到的语法分析程序或编译来处理。 解释模式的基本类结构图很简单,最基本的实现也很简单。...image.png 1 package day_13_interpreter; 2 3 /** 4 * 包含解释之外的一些全局信息,或者说这就是解释解释得文法 5 * @author..."); 17 } 18 19 } 1 package day_13_interpreter; 2 3 /** 4 * 终结符表达式,实现与文法中的终结符相关联的解释操作 5 *

    88160

    使用Rust实现一个Brainfuck解释

    不过你想笑就笑吧,很快就会轮到编译嘲笑你了,你会被告知自己写的解释有多么的慢。 Brainfuck 是一种简单且最小的图灵完备编程语言。...Brainfuck 可以通过解释实现,也能通过编译实现。当然本章将先实现一个解释。我会使用 Rust 来编写这个解释并省略了一部分无关紧要的代码,以使得核心逻辑清晰。...jtable.insert(i, j); } } Ok(Code { instrs, jtable }) } } brainfuck 解释实现...Brainfuck 的解释执行需要首先定义一个无限长的纸带(字节数组),当前指针 SP,Opcode 源代码以及程序计数 PC,然后通过一个主循环匹配不同的指令并解释执行。...PS W:\WorkSpace\Rust\brainfuck> 在测试中,基于中间语言的解释大概要比原始解释快 5 倍左右。

    1K30

    行为型之解释模式C++实现

    解释模式:给分析对象定义一个语言,并定义该语言的文法表示,再设计一个解析解释语言中的句子。也就是说,用编译语言的方式来分析应用中的实例。...这种模式实现了文法表达式处理的接口,该接口解释一个特定的上下文。 优点: 扩展性好。由于在解释模式中使用类来表示语言的文法规则,因此可以通过继承等机制来改变或扩展文法。 容易实现。...抽象表达式角色:定义解释的接口,约定解释解释操作。 终结符表达式角色:抽象表达式的子类,实现文法中与终结符相关的操作。...非终结符表达式角色:抽象表达式的子类,实现文法中与非终结符相关的操作。 环境角色:包含各个解释需要的数据或是公共的功能,一般用来传递被所有解释共享的数据,后面的解释可以从这里获取这些值。...客户端:用解释解释方法,通过环境角色间接访问解释解释方法。 具体案例:小码路接了公司一项目,为北大清华的学生制作出入证,先找到学校学生可以进步,如果找不到侧拒绝进入校园。

    29620

    【说站】python解释如何实现字典合并

    python解释如何实现字典合并 说明 1、实现字典合并生成新字典的逻辑,对应于 | 操作符。 实现字典就地合并逻辑,对应于 |= 操作符。...2、CPython的实现逻辑与纯Python的实现基本相同,只有引用计数的问题与对象的垃圾回收有关。...实例 // 实现字典合并生成新字典的逻辑,对应于 | 操作符 static PyObject * dict_or(PyObject *self, PyObject *other) {     if (!...(new, other)) {         Py_DECREF(new); // 减少引用计数         return NULL;     }     return new; }   // 实现字典就地合并逻辑...self, other)) {         return NULL;     }     Py_INCREF(self); // 增加引用计数     return self; } 以上就是python解释实现字典合并的方法

    80430

    Shell解释

    shell解释,用户和操作系统内核之间的桥梁 一、Shell常见种类 就像不同地区有不同方言一样,不同的Linux/Unix系统使用着不同类型的shell Bsh:由贝尔实验室编写。...Bsh是产生较早的UNIX Shell程序,实现了最基本的命令解释的功能,同时也可以作为脚本编程语言 Csh:是因使用C语言的语法风格而得名,在用户的命令行交互界面上进行了很多改进,并增加了历史,别名...管道操作:**在Bash环境中,为不同命令之间的协同工作提供了一种机制,为于管道符号左侧的命令输出结果,将作为右侧命令的输入,同一行命令中可以有多个管道 三、相关Shell命令 查看当前Shell解释.../bin/zsh 切换系统当前默认的Shell解释 $ chsh 四、关于首行#!...(sha-bang)一方面标志着脚本文件的magic number为脚本文件类型,另一方面告知系统此脚本文件需要使用何种命令解释来执行 #!

    1.2K20
    领券