问题标签 [interpreter]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
3429 浏览

design-patterns - 为什么解释器模式很烂?

Steve Yegge 对设计模式的评论中,他将解释器模式称为“笑话”。他接着谈到编译器的看法发生了怎样的变化,但解释性语言仍然是如何流行的,尽管我看不出这与模式有何联系。

有人要开导这个无知的学生吗?

0 投票
8 回答
3102 浏览

optimization - 高效解释器中使用了哪些操作码调度策略?

哪些技术可以促进高效的操作码调度以实现快速解释器?是否有一些技术只能在现代硬件上运行良好,而其他技术由于硬件的进步而不再运行良好?必须在易于实施、速度和可移植性之间做出哪些权衡?

我很高兴 Python 的 C 实现终于超越了switch (opcode) {...}操作码分派的简单实现,转为作为编译时选项的间接线程,但我不太高兴他们花了 20 年才到达那里。也许如果我们在 stackoverflow 上记录这些策略,下一种语言会变得更快。

0 投票
1 回答
617 浏览

interpreter - 持续传递风格与积极削减调用堆栈?

我正在考虑将 CPS 之类的东西用于基于演员的语言的解释器中。

函数参数在变量数组中传递,延续在同一个数组中返回,所以一个简单的函数

所以来自 read/eval/loop 的调用将是

入境时会是

其中 _ 是写入函数返回值的空槽。

在执行的下一步,参数变为

然后

等等。C中的实现基本上是

检查是否超出 args 数组的末尾并分配更多空间。

参数是连续的,作为对象的“延续”只是参数的一个子集。

如果我要实现一流的延续,他们将需要克隆参数数组;您也不会免费获得关闭。主要目标是与简单的机器代码生成配合得很好,并让您暂停和恢复执行。

虽然这个方案的灵感来自于对 CPS 的思考,但它并不完全是 CPS,并且非常类似于经过积极修剪的 C 堆栈可能看起来的样子——只是活动变量和每个函数的返回点。

这种风格有名字吗,特别是参数数组?这是一种蹦床+一个堆栈,尽管我习惯于调用“堆栈”更多的是历史而不是执行的未来。

0 投票
8 回答
1962 浏览

c - 如何展开(编译)解释器循环?

我听说有些语言通过“展开解释器循环”从解释变为编译。

假设我有以下用于 ast 树的伪 c 代码解释器。

如何展开此循环以创建已编译的程序?

我看到你们所有人都对此表示反对,就像我不知道我在说什么一样,但这里有一段来自维基百科的引述,它准确地说明了我所描述的内容。

“因子最初只是解释,但现在完全编译(非优化编译器基本上展开解释器循环”

0 投票
4 回答
788 浏览

javascript - GPL、javascript 和在线游戏

我正在为 80 年代的山脉冒险游戏开发 javascript 中的游戏解释器。我移植了名为 Sarien 的现有逆向工程 C 解释器的一部分,它是 GPL 许可的。使我的工作也成为 GPL。到现在为止还挺好。

但是,我的目标是创建一个网站,让人们可以在线玩这些游戏,并增加多人游戏支持。多人游戏需要客户端+服务器代码,多人游戏部分是专有的封闭(商业)代码。那也必须是GPL吗?

我知道其他人在这里问过 GPL 问题,但它通常涉及嵌入、链接等,让我更容易理解。我的设置是基于 javascript 的。我可以将核心解释器代码分发为 GPL 并添加一个单独的 javascript 层,该层挂钩到 IO 部分(以使多人游戏成为可能)而不是 GPL 那部分?

我非常愿意以 GPL 的形式贡献我的所有工作,但多人游戏引擎的某些部分根本不是我可以决定的。如果 GPL 强迫我做一切 GPL 那么它禁止我添加多人游戏,因此阻碍了制作一些很酷的东西:-(

更新:

原始解释器代码 - GPL 许可 - 已合并到 ScummVM 中。解释器文件现在在标题中显示 GPL 版本 2 或更高版本适用于最终用户认为合适的情况。这有什么改变吗?作为旁注;是否允许以这种方式修改许可证?

0 投票
6 回答
3512 浏览

vim - 字节码对比 口译

我记得一位教授曾经说过解释代码比编译代码慢大约 10 倍。解释和字节码之间的速度差异是什么?(假设字节码不是 JIT 编译的)

我问是因为有些人一直在考虑将 vim 脚本编译成字节码的想法,我只是想知道这会得到什么样的性能提升。

0 投票
13 回答
95583 浏览

c - 有 C 的解释器吗?

我想知道是否有类似 C 的解释器。也就是说,在 Linux 终端中,我可以输入“python”,然后在该解释器中编码。(我不确定解释正确的词)。这对于测试不同的东西真的很有帮助,我很好奇 C 是否存在类似的东西。尽管我对此表示怀疑。我唯一能想到的就是C shell ...

0 投票
4 回答
982 浏览

c# - 关闭 JIT,并控制 MSIL(自己的 VM)中的代码流

我正在用 C# 编写自己的脚本语言,具有一些我喜欢的特性,并且我选择使用 MSIL 作为输出的字节码(Reflection.Emit 非常有用,我不必想出另一个字节码)。它可以工作,发出可执行文件,可以运行(甚至可以使用 Reflector 反编译 :))并且速度非常快。

但是 - 我想在一个进程+一个线程中运行多个“进程”,并手动控制它们分配的 CPU 时间(也实现由 .NET 框架提供的更强大的 IPC)有没有办法完全禁用 JIT 并创建自己的VM,使用.NET框架(并控制内存使用等)在指令后步进指令,无需自己编写任何东西,或者要实现这一点,我必须编写整个MSIL解释?

编辑 1): 我知道解释 IL 并不是世界上最快的事情:)

编辑2):澄清-我希望我的VM成为某种“操作系统”-它获得一些CPU时间并将其分配给进程,控制它们的内存分配等等。它不必很快,也不必有效,而只是我的一些实验的概念证明。我不需要在处理每条指令的级别上实现它 - 如果这应该由 .NET 完成,我不会介意,我只想说:第一步指令,等到我告诉你下一步。

编辑 3):我意识到,ICorDebug 可能可以满足我的需求,现在正在查看 Mono 运行时的实现。

0 投票
4 回答
3202 浏览

python - PyPy 在 CPython、Jython 和 IronPython 上提供了什么?

根据我在博客上看到和阅读的内容,PyPy 是一个非常雄心勃勃的项目。与它的兄弟姐妹(CPython、Jython 和 IronPython)相比,它将带来哪些优势?是速度、跨平台兼容性(包括移动平台)、在没有 GIL 的情况下使用 c 扩展的能力,还是这更多的是关于可以做什么的技术练习?

0 投票
4 回答
412 浏览

compiler-construction - 解释器实际上是否在内存中预编译?

好吧,伙计们,我想我会带上我的旧 CS 笔记并多看一下编译器理论。我不得不说我无法记住所有这些东西是如何工作的,但我确实有一个很好的大学时代的示例应用程序,可以帮助我理解一些事情。

此示例应用程序采用组合语言并将其编译为中间汇编代码,如语言。然后有一个简单的 VM 实现,它采用这种中间语言并执行语句。

我无法理解的是,如果我这是一个直截了当的解释器而不是编译器,它是否仍会在内存中构建这些中间命令以在最后执行。还是解释器实际上一次“执行”代码块的隐藏部分?