Giter VIP home page Giter VIP logo

animac's People

Contributors

bd4sur avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

animac's Issues

【特性】非递归的循环结构“while”

特性描述:增加非递归的、直接的循环结构(while condition body)。这个特性应当优先实现,因为该结构无法通过宏构造出来。

实现思路:①将while设置为关键字;②编译器将其作为特殊结构,使用现有的AIL指令集直接编译为AIL代码。

【故障】REPL中应容忍`define`中出现的未定义符号

故障描述:在REPL中执行define表达式,会因为其内有尚未定义的符号而报错。而对于REPL来说这是需要(暂时)容忍的。

补救措施:凡define表达式(及其子表达式)内出现未定义符号,REPL可以给出警告,但不能报错终止。当前轮次的代码需要加入缓冲区,供后续轮次执行。那么什么时候报错呢?只有在非define表达式中引用了未定义的符号,才报错。

【优化】基本运算符支持不定长参数列表

特性描述:支持+等基本运算符传入多于2个的参数,以实现不定长参数列表。

实现思路:此特性不紧急,未来将使用宏实现。进一步地,将所有算术逻辑运算符封装为宏。

【特性】增加`this`特殊变量

特性描述:增加this特殊变量,这一变量的值,①为它所出现的词法Lambda节点的把柄。②为运行时确定的所在闭包的把柄。

实现思路:这一特性涉及反射,需要通盘考虑。目前的想法是:若值为闭包,则返回currentClosureHandle。若值为Lambda节点把柄,则静态分析阶段作替换。

需要考虑this①能否用来模拟面向对象特性;②能否用来实现define;③能否用来实现匿名函数递归进而实现(function ..)特殊结构。等等。

【故障】脏标记泄露问题

现象描述:由set!函数引入的脏标记会通过executor.getBoundValue函数泄露到执行机中。

补救措施:此函数的所有出口均做去掉脏标记的处理。

【故障】Native函数的一等化未实现

复现用例与故障描述

((lambda (f x) (f x)) Native.Read "path..")
;; 报错“变量Native.Read未定义”

原因分析与补救措施

原因在于编译阶段未对Native函数名作特殊处理,而是当成普通变量直接load。再由于VM中也未处理,导致出错。

Native函数的本质是用于指明外部库的符号,因此Native函数的一等化,实际上是指将Native函数的名称作为符号原子处理。

补救措施是,在编译阶段增加相应分支,改load为push。另外Process类中的工具函数IsUseNative宜移动至AST类。

【优化】对IL代码中出现的变量名作优化

特性描述:目前,变量名是直接以原始形式被保留在编译得到的AIL代码中,这很冗长,且字符串形式的变量名并不利于后续的处理。因此,有必要将IL代码中出现的变量,全部替换为全局唯一的数字形式(变量编号),这样VM就可以使用数组之类的简单数据结构去实现闭包,也便于以后用C语言实现VM。

实现思路:在适当位置保留变量名与变量编号的映射表,也就是所谓的符号表。

【特性】REPL

如题,需要交互式的REPL。

进一步的思考记录在下面。

【特性】增加“普通”函数调用相关指令

特性描述:计划增加3条指令,使AVM可执行不具有闭包特性的非一等函数(例如C、Java等语言的函数、方法等)。3条指令分别为:

  • invoke <label> 执行<label>处定义的函数。
  • setlocal <variable> 将OP栈顶对象保存到位于栈帧的局部变量中。
  • getlocal <variable> 从栈帧中取出局部变量的值,并压入OP栈顶。

还需要加入全局变量操作指令。

实现思路:①栈帧增加局部变量字段。②或者invoke的栈帧并不与call共用同一类栈帧。

【特性】准引用支持R5RS中规定的层级嵌套

特性描述:见R5RS对准引用的描述。

实现思路:①Parser、Analyser和Compiler都需要做修改;②需要恰当处理单个符号(变量)的unquote情形,尤其是Analyser中需要区分因嵌套层数不同,而导致unquote在unquote和variable之间变化的情况。例如:(quasiquote ,a)(quasiquote (quasiquote ,a))两个qq中,,a应当被分别解释成变量和符号。作为变量的a,应当作未定义的检查。

【特性】约束变量声明+初始化结构`(var <variable> <init>)`

特性描述:增加(var <variable> <init>),用于声明一个变量<variable>(即建立当前词法作用域上的一个约束变量绑定),并用<init>参数初始化其值。新声明的变量在作用域内是全局有效的,这类似于JavaScript的var变量声明,以及RnRS规定的letrec

为什么要增加这个结构?因为(set! var val)只能修改已绑定的变量为已求值的右值参数,而(define var init)的右值参数只能是未经求值的词法节点把柄/立即值/函数所在IL代码的标签。二者的功能某种程度上是正交的,这一点与RnRS中定义的有所不同。

实现思路:接续执行defineset!。在实现卫生宏之前,在编译器层面实现之。

【故障】准引用列表编译实现有误

复现用例与故障描述

(define foo (lambda (a lst) (cons `(,a) lst)))
(define lst '())
(set! lst (foo 100 lst))
(display lst)  ;; 期望输出((100)),实际输出同
(set! lst (foo 200 lst))
(display lst)  ;; 期望输出((200) (100)),实际输出((200) (200))

原因分析与补救措施:在目前的(错误)实现中,qq是被编译成set-child!语句,直接修改AST(静态数据)上的qq节点的children,这是错误的。正确的做法应当是:

  • 提供copylist指令,用于将AST上的列表及其全部子表递归地复制到堆区中,并对所有列表对象分配把柄,指令返回根节点的把柄。
  • 在已有CompileQuasiquote实现的基础上,增加copylist的步骤。这样,Scheme代码中的每个qq,实际上都是起到了只读模板的作用,每次引用qq,都会在堆区新建一个实例。

【计划】固化版本0.1.0

目前处在盲目开发的状态,因此有必要固化现有工作成果,梳理现有特性集合,为后续制订开发计划、规划新特性提供依据。

争取十一之前关闭现有的所有故障单,将当前开发状态固化为0.1.0版本。

【优化】本地库函数和内置函数的一等化改造

特性描述:目前的本地库函数和内置函数尚未支持一等函数特性,严格来讲算是表达式而非函数。改造后,本地库函数和内置函数应当获得与普通函数相同的一等地位,即可以作为值传递。

实现思路:①取消callnative指令,由calltailcall指令统一处理本地库函数的调用问题。②在进程VMI中增加判断变量是否是内置函数调用的谓词,在运行时VMI增加内置函数谓词(如加减乘除等)。③Dereference函数要对内置函数名和本地库函数名作特殊处理,例如直接返回字符串。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.