我正在编写一个js到js解释器(即,一个以Javascript程序作为参数并执行它的Javascript程序)。我没有接受过编译器理论方面的培训,只是在伪造它。表达式评估机器正在运行(使用一种笨拙的运算符优先算法),但尚未实现功能。所以这是我的问题。
我想到的实现函数的方式看起来像这样:调用函数时,我将为其创建一个名称空间/上下文,还允许访问封闭函数的名称空间和全局名称空间。
我尚未实现闭包,但这些命名空间旨在用于它们。基本上,据我了解,闭包只是Javascript在没有忘记包含函数的变量时拒绝忘记函数上下文的方式。
因此,在调用函数时,我会将调用它的语句的副本以及指向触发该函数调用的表达式的指针传递到其上下文对象中。该语句中已被求值的每个表达式都将记住其值。当我们从函数中返回时,该语句成为当前语句,并且我再次开始执行它-但我不重新评估已经被评估的表达式,包括刚刚完成的函数。因此,我很乐意与语句的其余部分一起,可能会调用更多函数,等等。
每个语句,表达式和函数都有在解析过程中构建的抽象表示。在执行期间,除了该抽象表示之外,仅当前语句具有任何实际存在,因为实际上在任何给定时间我需要记住的是:
当前上下文中的变量
封闭上下文中的变量(即,包含当前函数的函数的最新调用(包括全局上下文))
当前声明
接下来是什么语句
我内心有什么障碍(只是让我知道当我击打时该怎么办
一个的结尾)
调用堆栈,它是上下文的堆栈,包括变量和
触发调用的语句及其表达式。
指向要用函数/上下文的返回值更新的特定表达式的指针。
那我有道理吗?谢谢你的帮助!
最佳答案
您所描述的基本上是解释器的工作,是的,但是我仍然强烈建议您重新考虑您的方法。一旦您执行比加数更复杂的操作,使用Javascript解释Javascript的运行就会非常缓慢。您是否由于某些原因无法将调试器与实际执行分开?如果那不可能,我真的建议您使用插件或其他会降低您速度的翻译器来做您的解释器。或者考虑修改以下内容:https://developers.google.com/blockly/installation/js-interpreter?hl=en