标签: interpreter

VM设计:更多操作码或更少的操作码?什么是更好的?

不要被震惊.这是很多文字,但我害怕没有提供一些详细的信息,我无法真正展示这是什么(并可能得到很多答案,并没有真正解决我的问题).而这绝对不是一项任务(正如他的评论中有人可笑地声称的那样).

先决条件

由于除非至少设置了一些先决条件,否则根本无法回答此问题,以下是先决条件:

  • 应解释虚拟机代码.不禁止有JIT编译器,但设计应该以解释器为目标.
  • VM应基于寄存器,而不是基于堆栈.
  • 答案可能既没有假设有一组固定的寄存器,也没有无限数量的寄存器,或者可能是这种情况.

此外,我们需要更好地定义"更好".必须考虑几个属性:

  1. 磁盘上VM代码的存储空间.当然,您可以在此处废弃所有优化并仅压缩代码,但这会对(2)产生负面影响.
  2. 解码速度.如果将代码转换为可以直接执行的东西需要很长时间,那么存储代码的最佳方法是无用的.
  3. 内存中的存储空间.该代码必须可以在有或没有进一步解码的情况下直接执行,但是如果涉及进一步的解码,则在执行期间和每次执行指令时完成该编码(在将代码计数加载到项目2时仅解码一次).
  4. 代码的执行速度(考虑常见的解释器技术).
  5. 虚拟机的复杂性以及为其编写解释器的难度.
  6. VM自身需要的资源量.(如果VM运行的代码大小为2 KB并且执行速度比眨眼快,那么这不是一个好的设计,但它需要150 MB才能完成此操作并且其启动时间远远高于代码的运行时间它执行)

现在通过或多或少的操作码实际意味着我的例子.它可能看起来实际上设置了操作码的数量,因为每个操作需要一个操作码.然而,它并不那么容易.

用于相同操作的多个操作码

你可以进行类似的操作

ADD R1, R2, R3
Run Code Online (Sandbox Code Playgroud)

添加R1和R2的值,将结果写入R3.现在考虑以下特殊情况:

ADD R1, R2, R2
ADD R1, 1, R1
Run Code Online (Sandbox Code Playgroud)

这些是您在许多应用程序中可以找到的常见操作.您可以使用现有的操作码来表达它们(除非您需要不同的操作码,因为最后一个操作码具有int值而不是寄存器).但是,您也可以为这些创建特殊的操作码:

ADD2 R1, R2
INC R1
Run Code Online (Sandbox Code Playgroud)

和之前一样.优势在哪里?ADD2只需要两个参数,而不是3个,INC甚至只需要一个参数.因此,这可以在磁盘和/或内存中更紧凑地编码.由于将任何一种形式转换为另一种形式也很容易,因此解码步骤可以在两种方式之间转换以表达这些语句.不过,我不确定这两种形式会影响执行速度.

将两个操作码组合成一个操作码

现在让我们假设您有一个ADD_RRR(R表示寄存器)和一个LOAD来将数据加载到寄存器中.

LOAD value, R2
ADD_RRR R1, R2, R3
Run Code Online (Sandbox Code Playgroud)

您可以拥有这两个操作码并始终在整个代码中使用这样的构造...或者您可以将它们组合成一个名为ADD_RMR(M代表内存)的新操作码

ADD_RMR R1, value, R3
Run Code Online (Sandbox Code Playgroud)

数据类型与操作码

假设您有16位整数和32位整数作为本机类型.寄存器为32位,因此数据类型适合.现在,当您添加两个寄存器时,可以将数据类型设为参数:

ADD int16, R1, R2, R3
ADD int32, R1, R2, R3
Run Code Online (Sandbox Code Playgroud)

例如,对于有符号和无符号整数也是如此.这样,ADD可以是一个短操作码,一个字节,然后你有另一个字节(或者可能只是4位)告诉VM如何解释寄存器(它们是否保持16位或32位值).或者您可以废弃类型编码,而是有两个操作码:

ADD16 R1, R2, R3
ADD32 R1, R2, R3
Run Code Online (Sandbox Code Playgroud)

有些人可能会说两者完全相同 - 只是解释第一种方式,因为16位操作码可行.是的,但是一个非常幼稚的翻译可能看起来很不一样.例如,如果每个操作码有一个函数并使用switch语句调度(不是最好的方式,函数调用开销,switch语句也许不是最优的,我知道),这两个操作码可能如下所示:

case ADD16: add16(p1, p2, …
Run Code Online (Sandbox Code Playgroud)

performance interpreter opcode vm-implementation

21
推荐指数
2
解决办法
2822
查看次数

在运行时编译并执行Scala代码

是否可以在Scala或Java中在运行时将scala代码编译为字符串?

我的想法是使用Scala构建DSL,然后让Java程序员在Java中使用DSL.

我听说类scala.tools.nsc.Interpreter可以做类似的事情,但当我在scala文件中导入它时,我得到"对象工具不是包scala的成员".

所以有人能给我一个暗示吗?

dsl interpreter scala

21
推荐指数
2
解决办法
1万
查看次数

从Scala解释器打印Unicode

当使用scala解释器(即在命令行上运行命令'scala')时,我无法正确打印unicode字符.当然,正确打印az,AZ等,但例如€或ƒ打印为?.

print(8364.toChar)
Run Code Online (Sandbox Code Playgroud)

结果是 ?而不是€.可能我做错了什么.我的终端支持utf-8字符,甚至当我将输出管道传输到一个单独的文件并在texteditor中打开时,?被展示.

这一切都发生在使用Scala 2.8(每晚构建)和Java 1.6.0_17的Mac OS X(Snow Leopard,10.6.2)上

interpreter scala utf-8

20
推荐指数
1
解决办法
1万
查看次数

口译语言:越高越快?

到目前为止,我已经为他们设计了大约5种实验语言和口译员,用于教育,作为一种爱好和乐趣.

我注意到的一件事:类似汇编的语言只有子程序和条件跳转作为结构,比if,while等高级语言要慢得多.我同时开发它们,两者都是解释语言.我用C++编写了解释器,我试图尽可能快地优化代码执行部分.

我的假设:在几乎所有情况下,解释语言的表现都随着它们的水平(高/低)而上升.

  • 我基本上对吗?(如果不是,为什么?)

编辑:我没有提到这里编译的单词,甚至一次,它是解释与解释!

performance interpreter programming-languages language-design

20
推荐指数
3
解决办法
1982
查看次数

Python 3.2 - GIL - 好/坏?

Python 3.2 ALPHA 已经发布.

从更改日志中,看起来GIL已完全重写.

几个问题:

  1. 有GIL好还是坏?(以及为什么).
  2. 新的GIL更好吗?如果是这样,怎么样?

更新:

我对Python很新.所以这一切对我来说都是新的,但至少我明白用CPython存在GIL是一件大事.

问题但是,为什么CPython不仅像Perl那样克隆解释器而试图消除对GIL的需求?

python multithreading interpreter locking

20
推荐指数
2
解决办法
1万
查看次数

如何在Simple Build Tool项目中调用scala解释器?

我的scala程序正在使用scala.tools.nsc.interpreter.IMain中的编译器接口.当我使用scalac进行编译时,一切都按预期工作.但是当我用sbt编译它仍然编译时,但在执行时它会在从IMain实例调用explain-method时抛出以下错误消息:

Failed to initialize compiler: object scala not found.
** Note that as of 2.8 scala does not assume use of the java classpath.
** For the old behavior pass -usejavacp to scala, or if using a Settings
** object programatically, settings.usejavacp.value = true.
Run Code Online (Sandbox Code Playgroud)

如果我在IMain实例上使用settings.usejavacp.value = true,则会出现以下异常:

java.lang.Error: typeConstructor inapplicable for <none>
Run Code Online (Sandbox Code Playgroud)

我的SBT项目定义:

class Project(info: ProjectInfo) extends DefaultProject(info){
    val scalaSwing = "org.scala-lang" % "scala-swing" % "2.9.0"
    val scalaCompiler = "org.scala-lang" % "scala-compiler" % "2.9.0"
}
Run Code Online (Sandbox Code Playgroud)

这有什么不对?如何在Simple Build Tool Project中使用解释器?

我正在使用 …

interpreter scala sbt

20
推荐指数
2
解决办法
7317
查看次数

有Dart VM吗?

刚刚看过谷歌宣布新网络编程语言Dart的早期预览的消息.dartlang.org上的文档说明:

您将能够以多种方式运行Dart代码:

  • 将Dart代码转换为可在任何现代浏览器中运行的JavaScript:Chrome,Safari 5+和Firefox 4+(不久将提供更多浏览器支持).

  • 直接在服务器端的VM中执行Dart代码

  • 使用Dartboard在任何浏览器窗口中编写,修改和执行小型Dart程序

我很好奇是否已有VM可用于运行Dart代码?无论如何都找不到它,也许它可以通过一些beta程序获得?

interpreter runtime dart vm-implementation

20
推荐指数
2
解决办法
4685
查看次数

是否可以在OCaml解释器中使用箭头键?

每次我在解释器中使用这些键时,我都会看到这样的符号出现:

[[D^[[C
Run Code Online (Sandbox Code Playgroud)

我在ZSH中使用Linux Mint 12,但是我在使用bash的Ubuntu中获得了相同的结果.另外,在ssh中也是如此.

interpreter ocaml arrow-keys ledit

20
推荐指数
2
解决办法
3801
查看次数

Haskell中Futamura预测的证明

我读了Dan Piponi关于Futamura 医生的三个预测的优秀博客文章.在文章的最后,他有一个附录,其中包含了Haskell中Futamura投影的证明.但是,我发现他的文章缺乏有关所涉及语言的信息.为了使Futamura预测有效,专业化师的源语言,目标语言和对象语言必须具备哪些内容?例如,如果我在Haskell中将Haskell写入LLVM专用器,那么Futamura投影会起作用吗?如果您编写一个Haskell程序来证明这一点就像Dan Piponi在他的文章中所做的那样会很有帮助.

compiler-construction interpreter haskell

20
推荐指数
1
解决办法
597
查看次数

vscode 提示“选择了无效的 python 解释器”

我一直在尝试在 vscode 上设置我的 python 工作区,但该软件似乎没有识别出我安装了 python,并且一直告诉我安装 python。我尝试手动添加 .exe 文件的路径,但每次都会出现“无效解释器提示”。只是为了证明我在设置中拥有正确的路径,这里是.json 文件的屏幕截图以及 我用来获取路径的命令提示。

python interpreter visual-studio-code

20
推荐指数
2
解决办法
3万
查看次数