2011-07-26 30 views
0

作为学校的项目,我必须制作一个JavaScript解释器。 (包括整个后端都必须由我制作)。基于Java的JavaScript解释器

一切都必须用Java编写 - 我使用ANTLR来解析和生成AST。

当前我可以解析一些.js代码到AST中 - 因此需要将这个AST翻译成som类型的可以在字节码机器上执行的中间表示形式。

我有一些编写静态类型语言的编译器的经验,但我非常怀疑如何从这里开始,因为JS是一种动态类型语言。

如果你可以给我一些关于如何进行我的好建议,我将会是gratefull!

就我个人而言,我认为我必须首先制作字节码机,然后再让IR适合这台机器。不幸的是我真的找不到任何关于如何编写字节码机器的好教程。

PS。 IM熟悉的话题以下书籍:

“在Java中(阿佩尔)现代编译执行”, “在Java中(瓦&布朗)编程语言处理器”, “语言实现模式(帕尔)”

Regards Sune

+1

出于好奇,什么课程要求你写一个完整的Javascript解释器? –

+1

Crikey雄心勃勃的学校项目! –

回答

0

如果您只想执行JavaScript,则不需要将AST转换为IR,然后转换为(某些?)字节码,该字节码也会强制您执行字节码执行器。

为什么不只是在java“引擎”中执行javascript AST?您可以将所有值存储为Map<String, Object>,并在行走AST时对其进行解释。一个新功能获取环境/上下文(新的Map<...>)。

如果在当前上下文中找不到值,则必须回退到全局上下文(= Map)。

对于“动态”的行为:如果你需要一个double为另外你只能分析使用标准方式Object.toString()值的double(比这更动态是很难得到:)):

String value = contextMap.get(key); 
Double dvalue = Double.parseDouble(value.toString()); 
.... 
+0

如果一切都失败了,那就是我的备份计划 - 我应该很容易实现。但我想要更好(在执行速度和进一步的优化改进方面)字节码执行 – Sune1987

+0

我不会使用字符串作为后备值 - Javascript数字是双打。 –

+0

它*很容易实现,比较你想去的路线! :)(@Sean:更新为“Object”) – dacwe