首页
学习
活动
专区
工具
TVP
发布

实现JavaScript语言解释(一)

因此为了更好地理解JavaScript的语言特性,我就自己动手实现了一个叫做Simple的JavaScript语言解释,这个解释十分简单,它基于TypeScript实现了JavaScript语法的子集...项目介绍 编译 vs 解释 在开始了解Simple的实现原理之前,我们先来搞清楚两个基本的编译原理概念:编译(Compiler) vs 解释(Interpreter)。...Simple解释 由于Simple不会对编写的JavaScript代码进行中间代码转换,它只会解释并且执行代码的逻辑,所以它是一个不折不扣的JavaScript语言解释。...Simple的架构设计 我们编写的代码其实就是保存在计算机硬盘上面的字符串文本,而实现语言解释的本质其实就是教会计算机如何才能理解并执行这些文本代码。那么计算机如何才能理解我们写的东西呢?...综上所述,一个语言解释的软件架构大体是这样的: 上面其实也就是Simple的软件架构,接着让我们来看一下词法分析的具体实现

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

实现JavaScript语言解释(二)

在语法解析阶段,如果Simple解释发现输入的Token字符串不能通过既定的语法规则来解析,就会抛出一个语法错误(Syntax Error),例如赋值语句没有右表达式的时候就会抛出Syntax Error...那么对于Simple解释来说,它的语法规则又是什么呢?...细心的你可能发现在上面的例子中所有语句都是以分号;结尾的,这是因为为了简化语法解析的流程,Simple解释强制要求每个表达式都要以分号结尾,这样我们才可以将重点放在掌握语言实现原理而不是拘泥于JavaScript...下面是一个分别使用浏览原生API和使用JQuery API来实现同样任务的例子: 外部DSL 和内部DSL不同,外部DSL没有依赖的宿主环境,它是一门独立的语言,例如HTML和CSS等。...因为外部DSL是完全独立的语言,所以它具有下面这些特点: 不能享用现有语言的编译和调试等工具,如有需要要自己实现,成本很高 如果你是语言实现者,需要自己设计和实现一门全新的语言,对自己的要求很高。

51610

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

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

25720

Python语言编译解释

一、解释语言Python Python语言是一种解释型、面向对象、动态数据类型的高级程序设计语言。 ?...编译型语言 先整体编译,再执行 运行速度快,任意改动需重新编译 可脱离编译环境运行 解释语言解释,边执行 运行速度慢 部分改动无需整体重新编译 不可脱离解释环境运行 编译型与解释语言列表...二、Python解释种类 CPython 官方版本的解释。这个解释是用C语言开发的,所以叫CPython。CPython是使用最广的Python解释。...我们通常说的、下载的、讨论的、使用的都是这个解释。 Ipython 基于CPython之上的一个交互式解释,在交互方式上有所增强,执行Python代码的功能和CPython是完全一样的。...PyPy 一个追求执行速度的Python解释。采用JIT技术,对Python代码进行动态编译(注意,不是解释),可以显著提高Python代码的执行速度。

1.4K20

c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(3)- 词法分析

c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(3)- 词法分析 用c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(1)- 目标和前言 用c语言手搓一个600...行的类c语言解释: 给编程初学者的解释教程(2)- 简介和设计 用c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(3)- 词法分析 用c语言手搓一个600行的类c语言解释:...给编程初学者的解释教程(4)- 语法分析1:EBNF和递归下降文法 用c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(5)- 语法分析2: tryC的语法分析实现c语言手搓一个...600行的类c语言解释: 给编程初学者的解释教程(6)- 语义分析:符号表和变量、函数 项目github地址及源码: https://github.com/yunwei37/tryC 这一篇讲讲在...,就得到这样一个标记流: {Sym, num}, {'=', assign}, {Num, 123.4} 词法分析的具体实现 由于词法分析对于各个语言基本都是大同小异,在其他地方也有很多用途,并且手工构造的话实际上是一个很枯燥又容易出错的活计

56130

c语言手搓一个500+行的类c语言解释: 给编程初学者的解释教程(3)- 词法分析

,就得到这样一个标记流: {Sym, num}, {'=', assign}, {Num, 123.4} 词法分析的具体实现 由于词法分析对于各个语言基本都是大同小异,在其他地方也有很多用途,并且手工构造的话实际上是一个很枯燥又容易出错的活计...通常词法分析实现会涉及到正则表达式、状态机的一些相关知识,或者通过正则表达式用上面那些工具来生成。...但对于我们这样一个简单的解释来说,手工构造词法分析,并且完全不涉及到正则表达式的知识,理解起来也并不是很困难啦。...tryC语言中,空格是用来作为分隔用的,并不作为语法的一部分。...因此在实现中我们将它作为“不识别”的字符进行跳过。

1.2K00

c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(1)- 目标和前言

c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(1)- 目标和前言 用c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(1)- 目标和前言 用c语言手搓一个600...行的类c语言解释: 给编程初学者的解释教程(2)- 简介和设计 用c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(3)- 词法分析 用c语言手搓一个600行的类c语言解释:...给编程初学者的解释教程(4)- 语法分析1:EBNF和递归下降文法 用c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(5)- 语法分析2: tryC的语法分析实现c语言手搓一个...这一系列教程希望面向初学者,使用c语言手工实现一个简单的解释来玩,不需要您掌握除了c语言以外的其他前置知识,也不需要您学习过编译原理的相关知识(当然如果能对简单的数据结构有所了解的话会更好,比如树、栈等...; 手把手教你构建 C 语言编译c4的一个重写版,附有详细的中文教程 Let’s Build a Compiler, by Jack Crenshaw 一个英文的初学者教程,讲解如何实现一个编译

40720

c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(2)- 简介和设计

c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(2)- 简介和设计 用c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(1)- 目标和前言 用c语言手搓一个600...行的类c语言解释: 给编程初学者的解释教程(2)- 简介和设计 用c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(3)- 词法分析 用c语言手搓一个600行的类c语言解释:...给编程初学者的解释教程(4)- 语法分析1:EBNF和递归下降文法 用c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(5)- 语法分析2: tryC的语法分析实现c语言手搓一个...600行的类c语言解释: 给编程初学者的解释教程(6)- 语义分析:符号表和变量、函数 项目github地址及源码: https://github.com/yunwei37/tryC 需要了解的一些基本概念...而解释是一种计算机程序,它直接执行由编程语言或脚本语言编写的代码,它并不会把源代码预编译成机器码,而是一行一行地分析源代码并且直接执行,相对编译而言可能效率较为低下,但实现也相对简单,并且容易在不同的机器上进行移植

47210

c语言手搓一个500+行的类c语言解释: 给编程初学者的解释教程(6)- 语义分析

符号表 我们先来回顾一下符号表的定义: 符号表是一种用于语言翻译(例如编译解释)中的数据结构。...作用域可以是块作用域、函数作用域等,tryC中只实现了函数作用域。...pointer.list[index].value; } match(']'); } return temp; } 在变量定义语句中对变量的处理 由于是动态类型语言...函数 tryC的函数实现完整代码:这个函数做了以下几件事: 对变量的作用域进行控制; 将函数参数中的变量直接插入作用域; 保存当前词法分析的源代码位置和token,并跳转到函数定义时的源代码位置和token...就将返回值存入return_val; 恢复保存的当前源代码位置和token; 返回值从全局变量return_val中获取; 由于function()函数本身是递归的,且变量作用域等可以得到控制,因此可以实现函数的递归调用

1.1K00

c语言实现任务调度

素材来源:网络素材 整理:技术让梦想更伟大 | 李肖遥 一、介绍 调度是常用的一种编程框架,也是操作系统的拆分多任务的核心,比如单片机的裸机程序框架,网络协议栈的框架如can网关、485网关等等,使用场合比较多...{ task1(); task2(); ... } } 123456789 2、时间片与时标 1)我们把cpu执行时间分成一段一段的,每一段时间称为时间片 2)时间片的时间计时由定时完成...,把定时定的时间成为时标 3、调度算法介绍 1)时间片轮转调度 2)强占试调度 4、注意事项 1)所有任务的执行时间不能超过时标的时间 2)任务中不能有任何阻塞,比如使用延时函数 3)任务中的延时或者长时间任务利用状态机拆分成多段...三、任务调度代码实现 这里拿linux来测试 schduler.c //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // 头文件区 //~~~~~~~~~...scheduler.c -o main -w echo "build ok " .

55830

c语言手搓一个500+行的类c语言解释: 给编程初学者的解释教程(2)- 简介和设计

项目github地址及源码: https://github.com/yunwei37/tryC 需要了解的一些基本概念 编译解释的区别不同 通常我们说的 “编译” 是一种计算机程序,负责把一种编程语言编写的源码转换成另外一种计算机代码...而解释是一种计算机程序,它直接执行由编程语言或脚本语言编写的代码,它并不会把源代码预编译成机器码,而是一行一行地分析源代码并且直接执行,相对编译而言可能效率较为低下,但实现也相对简单,并且容易在不同的机器上进行移植...先来看看通常的编译是如何实现的: 编译从源码翻译为目标代码大致需要这样几个步骤,每个步骤都依赖于上一个步骤的结果: 词法分析: 编译对源程序进行阅读,并将字符序列,也就是源代码中一个个符号收集到称作记号...解释与编译仅在代码生成阶段有区别,而在前三个阶段如词法分析、语法分析、语义分析基本是一样的。...tryC编译的设计: 从上面可以看出,我们的tryC解释需要这三个模块: 词法分析 语法分析 语义分析和解释执行 需要这两个数据结构(用来在阶段之间保存或传递值): token,用来在词法分析和语法分析之间传递标记

1.6K00

c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(5)- 语法分析2: tryC的语法分析实现

c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(5)- 语法分析2: tryC的语法分析实现c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(1)- 目标和前言...用c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(2)- 简介和设计 用c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(3)- 词法分析 用c语言手搓一个...600行的类c语言解释: 给编程初学者的解释教程(4)- 语法分析1:EBNF和递归下降文法 用c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(5)- 语法分析2: tryC的语法分析实现...用c语言手搓一个600行的类c语言解释: 给编程初学者的解释教程(6)- 语义分析:符号表和变量、函数 项目github地址及源码: https://github.com/yunwei37/tryC...布尔表达式和算术表达式的代码之前已经讲过了,这里看看statement的实现,以及如何在语法分析的同时解释执行: 这里使用的方法是,对于流程控制语句,在语法分析的时候就进行条件判断,如果if判断失败或者

31030

c语言手搓一个500+行的类c语言解释: 给编程初学者的解释教程(1)- 目标和前言

项目github地址及源码: https://github.com/yunwei37/tryC 一个小目标 这一系列教程希望面向初学者,使用c语言手工实现一个简单的解释来玩,不需要您掌握除了c语言以外的其他前置知识...写一个能执行代码的解释不仅是一件很有(zhuang)趣(bi)的事情,大概也可以作为刚学习完c语言的一个练手的小项目啦 不同于大部分常见的其他只支持四则运算的所谓”手工解释“教程,我们希望在代码结构尽量清晰的...,老师要求实现一个四则运算的计算,于是我想...要是能给计算加上函数和变量的定义就好啦...那大概能算一个简单的解释?...,尤其在没有生成中间代码的情况下; 参考资料 《编译原理及其实践》 c4 用四个函数和很少的代码就完成了功能相当完善的 C 语言编译, 并且能够自举;我自己写作的时候也借鉴了c4的许多实现思想;...手把手教你构建 C 语言编译c4的一个重写版,附有详细的中文教程 Let's Build a Compiler, by Jack Crenshaw 一个英文的初学者教程,讲解如何实现一个编译

1.3K00

c语言手搓一个500+行的类c语言解释: 给编程初学者的解释教程(5)- 语法分析2

array array_name length; | // 数组定义 statement的代码实现...布尔表达式和算术表达式的代码之前已经讲过了,这里看看statement的实现,以及如何在语法分析的同时解释执行: 这里使用的方法是,对于流程控制语句,在语法分析的时候就进行条件判断,如果if判断失败或者...statement()) return RETURNFLAG; } match('}'); } .... if语句 由于tryC解释是边进行语法分析...,边解释执行的,因此如果不需要解释执行执行某一个语句块,就调用函数 skipStatments() 跳过该语句块,不对其进行语法分析,不解释执行;(在if语句和while语句中使用): ......(在下一篇文章中还会提及具体变量赋值的实现) 数组需要先定义才能进行赋值。 ...

77200

【Linux】shell命令行简单解释

回顾一下,我们前面学习了进程创建,进程终止,进程等待,进程替换,通过这些内容我们可以来进行实现简单的shell命令解释!!!...下面我们直接来看一看如何去实现shell命令解释: 总体分为(整体需要循环哦): 1.输出提示符 2.输入和获取命令 3.fork创建子进程 4.内建命令 ---- 输出提示符 这里的提示字符为用户名...内建命令 我们在运行自己写的shell的时候,发现输入cd …输入cd path等命令时发现路径并没有改变!...对于cd,我们可以采用内建命令:不需要创建子进程执行,让shell自己执行命令,称为内建命令。...本质就是执行系统接口,我们可以调用一个系统接口chdir,可解决上述问题: 简易shell——代码实现 #include #include #include

14730

c语言手搓一个500+行的类c语言解释: 给编程初学者的解释教程(4)- 语法分析1

项目github地址及源码: https://github.com/yunwei37/tryC 这一章开始进入解释的核心部分: 语法分析; 我们来看看两个概念,EBNF和递归下降文法,以及如何用这两个方法来计算...Algol 60编程语言的语法。...BNF语法定义的语言是一个字符串集合,可以按照下述规则书写,这些规则叫做书写规范(产生式规则),例如一个四则运算表达式可以表示为: exp -> exp op exp | ( exp ) | number...通常我们在编译构建中使用的都是上下文无关文法。...实际上,EBNF文法就是为了映射递归下降分析法的具体程序实现而设计的,因此我们这里就用EBNF文法来实现递归下降分析。

1.6K00
领券