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

怎样写解释器

解释器其实不是很难的东西,可是好多人都不会写,因为在他们心目中解释器就像一个 Python 解释器那样复杂。如果你想开头就写一个 Python 解释器,那你多半永远也写不出来。...解释器是什么 首先我们来谈一下解释器是什么。说白了解释器跟计算器差不多。它们都接受一个“表达式”,输出一个 “结果”。比如,得到 '(+ 1 2) 之后就输出 3。...从广义上讲,解释器是一个通用的概念。计算器实际上是解释器的一种形式,只不过它处理的语言比程序的解释器简单很多。...模式匹配和递归:一个简单的计算器 既然计算器是一种最简单的解释器,那么我们为何不从计算器开始写?下面就是一个计算器,它可以计算四则运算的表达式。...所以在写解释器,编译器的时候,我都只使用函数式数据结构来表示环境。 下一步 在懂得了这里讲述的基本的解释器构造之后,下一步可以做什么呢?

1.6K70

写一个自己的命令行解释器

写一个自己的命令行解释器 当我点开xshell运行服务器的时候bash就被加载到了内存中,此后我在bash上执行的所有程序都是作为bash的子进程。...所以我们让子进程去执行程序替换,在我们的程序内执行命令,那我们不就是写了一个自己的命令行解释器吗?本文将带领各位读者通过实现一个简单的命令行解释器来巩固前面所学的部分知识。...一.搭建框架 当我们打开服务器的时候在最右边有提示符,包括用户名和服务器名称以及当前路径;并且支持多次输入,所以这里可以采用一个死循环,进程替换的事情由子进程来执行,所以肯定要用fork函数。...如果不太懂可以去看看博主的基础IO:基础IO 也就是说只要使用dup2系统调用更改fd中struct file*的指向即可,当我们完善这个功能以后一个简单命令行解释器也就完成了。...start++; } } } int main() { while(1) { redirType=NON; readfile=NULL; //写一个自己的

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

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

    前言 在这篇文章中,我们将通过 JS 构建我们自己的 JS 解释器,用 JS 写 JS,这听起来很奇怪,尽管如此,这样做我们将更熟悉 JS,也可以学习 JS 引擎是如何工作的!...什么是解释器 (Interpreter) ? 解释器是在运行时运行的语言求值器,它动态地执行程序的源代码。解释器解析源代码,从源代码生成 AST(抽象语法树),遍历 AST 并逐个计算它们。...解释器 (Interpreter) 工作原理 ?...rhs: 2 } 解释器解析 Ast,得到 LHS 节点,接着收集到操作符(operator)节点+,+操作符表示需要进行一次加法操作,它必须有第二个节点来进行加法操作.接着他收集到 RHS 节点。...Rollup Rollup 是一个 JavaScript 模块打包器,我们使用它来打包,以 UMD 规范对外暴露模块。

    46.5K20

    Python写的Python解释器(六)

    如果有一个递归调用自己10次的函数,就会有11个frame(每个递归级别拥有一个,另外一个是用于你的module)。通常,Python程序中的每个域都有一个frame。...例如,module,函数调用和类定义都会有一个frame。 frame位于call stack上(call stack和平常的堆栈一样)。解释器在执行字节码时操作的堆栈被称为data stack。...call to bar ... ... >>> foo() # <--- (1) We're in the middle of a call to foo ... 3 此时,解释器正处于函数调用的中间...调用堆栈有三个frame:一个用于模块级别,一个用于函数foo,另一个用于bar。一旦bar返回,与其关联的frame就会弹出call stack并被丢弃。...字节码RETURN_VALUE会告诉解释器需要在frame之间传递一个值。这时它会将推出call stack顶层的frame的data stack的顶层值。

    53010

    Python写的Python解释器(一)

    Python被称为“解释型语言”是因为编译步骤的工作量相对于编译语言较少(而解释器的工作量相对较多)。 Python写的Python解释器 Byterun是一个用Python编写的Python解释器。...使用Python的最大优点是我们可以更容易地实现解释器。例如,当需要创建一个类时,Byterun可以回退到“真正的”Python。另一个优点就是是Byterun易于理解。...解释器的工作原理 Python解释器如何工作的呢?...首先,Python解释器是一个虚拟机,这意味着它是模拟物理计算机运行的软件,并且也是一个堆栈机:它操作多个堆栈来执行其操作,与寄存器机相比,堆栈机会写入和读取特定存储器位置。...其次,Python解释器是一个字节码解释器:它的输入是字节码的指令集。当您编写Python时,词法分析器,解析器和编译器将生成代码对象供解释器进行操作。

    1.5K20

    Python写的Python解释器(五)

    在代码中编写循环和if语句时,解释器必须能够在指令进行跳转。Python在字节码中用GOTO语句处理循环和条件语句。...该指令将从解释器堆栈弹出顶部的值。如果这个值是真的,那么什么都不会发生。如果该值为false,则解释器将跳转到另一条指令。这条指令被称为跳转目标,它作为参数提供给POP_JUMP指令。...如果x 解释器将直接跳转到第6行(返回“否”),而跳过第4行(返回“是”)。因此,解释器使用跳转指令来有选择地跳过指令集的一部分。 Python循环也依赖于跳跃。...在两种情况下,都会先比较值,然后POP_JUMP_IF_FALSE控制下一个执行的指令。在第4行的末尾指令JUMP_ABSOLUTE总是将解释器返回循环顶部的指令9。...当x 解释器到指令34。 >>> def loop(): ... x = 1 ...

    86620

    Python写的Python解释器(三)

    www.aosabook.org/en/500L/a-python-interpreter-written-in-python.html 作者:Taavi Burns 翻译:鸿 如有翻译问题或建议,请公众号留言 变量 接下来,给解释器添加变量...目前,先忽略命名空间和范围,将变量映射存储在解释器对象本身上。 最后,除了常量列表之外,我们必须确保what_to_execute具有变量名称列表。 >>> def s(): ......解释器通过检查正在执行的指令知道它应该是哪个索引。 实现这种逻辑(指令和参数的映射关系)。...如果继续保持这种结构,就需要给每条指令一个if语句分支。这时可以利用Python的动态方法查找进行简化。...定义一个名为FOO的方法来执行名为FOO的指令,所以我们可以使用Python的getattr函数来实现方法查找,而不是使用大量的if语句。

    54630

    Python写的Python解释器(四)

    a-python-interpreter-written-in-python.html 作者:Taavi Burns 翻译:鸿 如有翻译问题或建议,请公众号留言 真正的Python字节码 现在让进入真正的Python字节码中,从一个简单的函数开始...通过使用Python标准库中的dis模块(dis是一个字节码反汇编工具,可以翻译低级代码,例如汇编代码或字节码,并以人类可读的方式进行打印出来。)...,运行dis.dis时,就会给出cond函数传递的字节码的解释。...(Python的LOAD_CONST与之前玩具解释器的LOAD_VALUE相同,LOAD_FAST与LOAD_NAME功能相同。)因此,这六个字节代表第一行代码,x = 3。...如果Python只使用一个字节来定位常量和名字,那么就只能有256个名字/常量与单个代码对象相关联,而使用两个字节,最多可以有256的平方,即65,536个)。

    59830

    Python写的Python解释器(二)

    首先从一个玩具解释器开始,这个微型解释器只能做加法,而且值包含了三个指令,这三个指令是: LOAD_VALUE ADD_TWO_VALUES PRINT_ANSWER 由于我们跳过了词法分析,语法分析和编译过程...解释器将首先执行第一条指令LOAD_VALUE,将第一个数字推入堆栈,再会将第二个数字推入堆栈。 对于第三条指令ADD_TWO_VALUES,它将推出堆栈里的两个数字,将它们加在一起将结果推入堆栈。...LOAD_VALUE指令表示解释器将一个数字推入堆栈,但指令本身并未指定哪个数字,所以每条指令都需要一条额外的信息,告诉解释器在哪里找到所需要的数字。...现在让我们开始写解释器本身。解释器对象拥有一个列表来表示堆栈。该对象还具有描述执行每条指令的方法。例如,对于LOAD_VALUE,解释器会将值推入堆栈。...(只要有一个编译器来处理格式良好的指令集)。

    65220

    解释器模式举例-TypeScript 类型体操天花板,用类型运算写一个 Lisp 解释器

    具体的不展开讲了,可以看一下面这个回答,如果我们把一个环境(闭包)当成参数传递给函数解释器模式举例,那意味着并不需要高阶函数一样能实现闭包的效果。   ...我们在这里介绍几个常见的技巧:   用于拆出来数组和字符串第一个元素的匹配,常用语递归一个数组里面的每一个元素:    // 递归处理数组常用的匹配 type Test0 = [0...并且可以得到以下推论:   普通递归   不做赘述解释器模式举例,用下面两个例子为例为例演示用 类型实现递归运算:    // 遍历数组 type ArrayStuct = [Head...: never ) : never; type Test = Eval // => Test = 4   在线体验:   实现 Lisp 解释器...  基础知识补充完了以后我们开始实现解释器,开始着手实现解释。

    46230

    java解释器虚拟机-【Java解释器和编译器】解释器和编译器的深入理解

    作为一个看过JVM虚拟机的小白,不懂解释器和编译器之间的区别的,那就是糗大了~   1 参考文献 深入理解JVM虚拟机 2 简单地区别解释器和编译器   JVM:Java字节码(Java )在上面可以直接运行...JVM把每一条要执行的字节码交给解释器,翻译成对应的机器码,然后由解释器执行。JVM解释执行字节码文件就是JVM操作Java解释器进行解释执行字节码文件的过程。   ...Java编译器:将Java源文件(.java文件)编译成字节码文件(.class文件,是特殊的二进制文件java解释器虚拟机,二进制字节码文件),这种字节码就是JVM的“机器语言”。...javac.exe可以简单看成是Java编译器。   Java解释器:是JVM的一部分。Java解释器用来解释执行Java编译器编译后的程序。java.exe可以简单看成是Java解释器。   ...先说前端编译过程,也就是Java中javac.exe文件所做的事情java解释器虚拟机,主要是三件事   1.

    51640

    JVM、Java编译器和Java解释器

    JVM、Java编译器和Java解释器 java解释器就是把在java虚拟机上运行的目标代码(字节码)解释成为具体平台的机器码的程序。...javac.exe可以简单看成是Java编译器。 Java解释器:是JVM的一部分。Java解释器用来解释执行Java编译器编译后的程序。java.exe可以简单看成是Java解释器。...执行环境用于保存解释器对Java字节码进行解释过程中所需的信息。它们是:上次调用的方法、局部变量指针和操作数栈的栈顶和栈底指针。执行环境是一个执行一个方法的控制中心。...2.4JVM碎片回收堆   Java类的实例所需的存储空间是在堆上分配的。解释器具体承担为类实例分配空间的工作。解释器在为一个实例分配完存储空间后,便开始记录对该实例所占用的内存区域的使用。...Java解释器实际上就是特定的平台下的一个应用程序。只要实现了特定平台下的解释器程序,Java字节码就能通过解释器程序在该平台下运行,这是Java跨平台的根本。

    6.5K31

    Java解释器和编译器

    这可能也正是自学乐趣之所在,知识无限延展,层层连贯,于是晚上就整理了一下关于java编译方面总结。 Java代码如何运行 我们写的Java代码是高级语言,机器肯定是读不懂的。...class中字节码内容如下: 解释器和即时编译器 我们通过javac将java文件编译成class文件,当jvm启动加载class,需要逐条执行字节码指令来完成程序功能。...解释器 解释器是一行一行地将字节码解析成机器码,解释到哪就执行到哪,狭义地说,就是for循环100次,你就要将循环体中的代码逐行解释执行100次。...计数器分为方法调用计数器(默认阈值C1是1500次,C2是1w,到达阈值则触发即时编译)和回边计数器(统计一个方法中循环体的执行次数)。...下图为方法调用计数器的执行过程: 目前主流的HotSpot虚拟机中默认是采用解释器与其中一个编译器(C2编译器)直接配合的方式将字节码转换成机器码 运行参数 在执行java程序的时候,以下参数是和编译方面的运行及调试参数

    58010

    Python写的Python解释器(七)--完结篇

    调用函数会在解释器中创建一个新frame。 Block类,它包含了block的三个属性。...The VirtualMachine Class 在程序运行时,只会创建一次VirtualMachine实例,这是因为只有一个Python解释器。...这些属性包括由编译器创建的代码对象; 本地,全局和内置命名空间; 对前一个frame的引用、data stack、block stack。...在CPython解释器中是通过一个超过1500行的switch语句完成的!但是这次为每个字节名称定义一个方法,然后使用getattr来查找它。...为了跟踪额外的信息,解释器会设置一个标志来表示其状态。这个标志是一个叫做why的变量,有着None或字符串“continue”,“break”,“exception”或“return”。

    52330

    日拱一卒,伯克利大招,带你写一个解释器(一)

    我们继续来肝伯克利CS61A,今天看的是这门课最后一个project,非常干货非常硬核。 我们要写一个Lisp语言的解释器,代码量不算很大,但很考验思维,20道题我足足爆肝了10个小时才做完。...Scheme 解释器读入Scheme语句,evaluate它们的值,再打印出来。和Python解释器类似: 老师提供的框架代码当中已经支持了单个运算符的计算,如上图当中,我们输入2可以返回2。...,你会发现Python本身在执行Scheme语句的时候会抛出各种异常,并且导致解释器中断。...理想情况下,解释器中不应该出现无法被handle的异常。...目前的代码可以处理简单的表达式,比如: 可以使用Ctrl + D或者exit语句退出解释器: Part I: The Reader 项目的第一个部分处理读入和转换用户的输入,我们的Reader将会将

    81621
    领券