标签: vm-implementation

python字节码,解释器和虚拟机

这是一个非常大的问题,我主要在寻找能够了解以下内容的资源.

我知道python解释器是用C语言编写的,它产生的字节码可以在用C编写的python虚拟机上运行(对吧?).我的问题是可以在python本身实现这两个吗?我想我要去的地方是(技术)在python中编写类似操作系统的东西的可能性,特别是没有静态编译任何东西?

如果我理解正确,python没有一个必须在python中编写的汇编程序.这些东西可以在技术上(可行吗?)完成吗?或者python的动态类型会出现某种问题吗?

我对微处理器架构,装配和机器代码有所了解,这是最近的EE毕业生在学校学到的东西.但是我很想看到像python这样的高级语言的全貌.

python operating-system bytecode vm-implementation

5
推荐指数
2
解决办法
1965
查看次数

对于自定义字节码VM,使用LLVM/CLANG的程序大小是多少?

我正在评估自定义VM的不同可能性,而我从另一个问题中遗漏了LLVM.由于我还在研究嵌入式语言VM的评估,我现在无法自己测试/检查.我想知道有关LLVM/CLANG的以下信息:

  • 它在Windows上得到了很好的支持吗?还是Solaris?(跨平台对我来说是一个加分)
  • 如果我想用类似C语言编写自己的/自定义VM,我需要在项目中包含什么?(LLVM/CLANG部分或组件等)
  • 我会将编译器与VM分开,原因很明显(不是编写解释器).所需组件的大小是多少?我可以在程序中构建它们而不是动态链接到它们吗?
  • 我可以避免JIT吗?我想有一个字节码VM,它不一定转换为本机代码.当平台不支持JIT时(例如,具有限制性内存权限且不允许wx/rwx内存映射的系统),这将有所帮助.

我知道clamav防病毒实例使用LLVM/clang支持的字节码来支持动态/运行时签名.但是,我不知道是否存在实现此功能和/或教程或文档的现有工具,它们将指导您完成实现此类操作的过程.

谢谢!:)

compiler-construction bytecode llvm clang vm-implementation

5
推荐指数
1
解决办法
1227
查看次数

如果我有翻译,为什么要使用Parrot(或其他VM)?

如果我已经有一个解释器,我为什么要使用像Parrot这样的VM来使用我使用的动态语言(Python,Perl,...)?我可以获得什么,在我的代码和我的机器之间使用不同的VM,以及使用单独的解释器的成本?

(我是VM问题的新手,所以答案很明显)

编辑

Parrot VM对最终用户有什么好处?

python perl interpreter parrot vm-implementation

5
推荐指数
1
解决办法
918
查看次数

窥孔优化模式

我一直在阅读本地优化编译器技术,但我一直没有得到它们的实现方式.我们的想法是,优化器每次都会查看代码的"窗口",并以某种方式检测模式并用更优化的版本替换它们.

我的问题是,如何发现这些模式?(假设您的平台是一个虚拟机,可以输出组装计算机的汇编代码,如Schocken的Hack).

人们实际上是手动检查代码(使用控制流图或DAG或其他),然后收集所有识别的模式并将它们编码到优化器中?或者是否有自动方式.

例如,您在分析器中提供要优化的代码,并且它会喷出所述模式.如果是这样,怎么开始写一个呢?

compiler-construction design-patterns control-flow-graph vm-implementation peephole-optimization

5
推荐指数
1
解决办法
1635
查看次数

Erlang BEAM 机器的减少

Erlang是一种众所周知的编程语言,因其轻量级线程而闻名(除其他外)。Erlang 通常是用BEAM 机器实现的。Erlang BEAM 机器的描述 (H'97) 说

为了保证公平调度,一个进程在经过固定数量的减少后被挂起,然后从队列中恢复第一个进程。

我对这种减少的概念很感兴趣。根据 (H'97),只有以下 BEAM 命令算作减少:

  • C/CO/ResC : 调用本地/常驻 Erlang 函数
  • CL:丢弃当前堆栈帧。调用本地 Erlang 函数。
  • CEx/TrCEx:调用外部 Erlang 函数(跟踪或其他方式)。
  • CExL/TrCExL:丢弃当前堆栈帧并调用外部 Erlang 函数(跟踪或其他方式)。
  • M_C_r:加载参数寄存器 x(0)。调用常驻 Erlang 函数。
  • M_CL_r:加载参数寄存器 x(0)。丢弃当前堆栈帧。调用本地 Erlang 函数。

所有这些都涉及函数调用。相比之下,调用 C 函数(例如TrC/TrCO)和调用内置函数(例如由Bif_0_ 调用)不算作减少。

问题。在这个序言之后,这是我想知道的。

  1. 为什么减少用于线程之间的调度,而不是时间片?
  2. 为什么只有上述命令使减少计数器前进?
  3. (H'97) 中的描述有点过时了,当代 Erlang 如何处理调度?

(H'97) B. Hausman,Erlang BEAM 虚拟机规范

concurrency erlang multithreading scheduling vm-implementation

5
推荐指数
1
解决办法
1987
查看次数

代码为系统映像(序列化运行时环境)vs源(文本)

今天几乎所有传统语言都将程序员的意图表示为文本源,然后(为简单起见)将其转换为某些字节码/机器代码并由VM/CPU解释/执行.
还有另一种技术,出于某种原因,它并不是流行的日子:"冻结"VM的运行时间并将环境(符号绑定,状态,代码(无论是什么))转储/序列化为图像,然后您可以传输,加载和执行.因此,您不能以通常的方式"编写"代码,而是在"运行时"中使用新符号修改环境.
我看到这项技术的巨大优势:

  • 功率提升的REPL:您可以在编写代码时自省代码,部分评估代码,直接测试代码并查看更改的效果.如果你搞砸了再做一遍,或者最后将它提交给环境,那就回滚一下.无需长编译运行调试周期;
  • 关于动态语言的一些常见问题(它们无法编译,因为编译器无法静态推理环境)被忽略了:解释器知道所在的位置,并且可以用静态偏移替换符号引用并进行其他优化;
  • 程序员的大脑更容易:你从头脑中"卸载"有关代码的不同上下文信息,即你​​不需要跟踪你的代码已经对某些变量/数据结构做了什么,或者哪个变量保存了什么:你看到了它直接在你眼前!通常的方式(编写源代码),程序员在代码中添加新的抽象或注释以澄清意图,但这可能(并且将会)变得混乱.

问题是:这种方法的缺点是什么?我没有看到任何严重的劣势吗?我知道,它有一些问题,即:

  • 尝试用它构建一个模块系统,这不会导致依赖地狱或严重的链接问题
  • 安全问题
  • 尝试对这些图像进行版本控制并启用并发开发

但是,这些是,恕我直言,可以用一个好的设计解决.

EDIT1:关于"已关闭,主要是基于意见"的状态.我已经描述了两种现有的方法,很明显,一种方法比另一方更受欢迎.我不知道其原因是纯粹的"以意见为基础"还是有研究支持,但是即使他们是以意见为基础的,如果有人将这些意见列为开发的原因,那么实际上应该回答我的问题.

lisp smalltalk selflanguage vm-implementation

5
推荐指数
1
解决办法
92
查看次数

为什么许多虚拟机在看起来像是具有C++功能时用C编写?

我注意到一些不太老的VM语言,比如用C语写的Lua,NekoVM和Potion.

看起来他们正在重新实现许多C++功能.

用C而不是C++编写它们有什么好处?

c c++ programming-languages vm-implementation

4
推荐指数
4
解决办法
863
查看次数

函数调用虚拟机查杀性能

我在C中编写了一个虚拟机,其中有一个调用表填充了指向函数的指针,这些函数提供了VM的操作码的功能.当虚拟机运行时,它首先解释一个程序,创建一个索引数组,该索引数组对应于所提供操作码的调用表中的相应函数.然后它循环遍历数组,调用每个函数直到它到达结尾.

每条指令都非常小,通常是一行.适合内联.问题是编译器不知道何时将调用任何虚拟机的指令,因为它是在运行时决定的,所以它不能内联它们.函数调用和参数传递的开销正在扼杀我的VM的性能.关于如何解决这个问题的任何想法?

c performance inline function vm-implementation

4
推荐指数
1
解决办法
425
查看次数

为什么erlang需要虚拟机?

消息传递是Erlang的核心 - "消息传递进程".

但是,当涉及到erlang时,虚拟机的概念仍然模糊不清.

任何帮助?

erlang vm-implementation

4
推荐指数
1
解决办法
256
查看次数

在垃圾收集语言中实现垃圾收集器是否有意义

我想在Java或Haskell中实现垃圾收集器(GC),但这有意义吗?

我是否能够控制我自己的GC实现何时启动而不是GC的实现语言?

我想这个问题可以有三种答案:

  1. 在运行禁用实现语言的GC的虚拟机(VM)时设置标志.
  2. 使用一个特殊的构造,让我管理自己的记忆,比如使用延续传递方式(CPS)来管理我自己的评估策略.
  3. 不,使用没有GC的语言.

看看这些:

  1. 我更喜欢第二种选择,因为我将能够在所有语言中使用该构造.
  2. 我不喜欢第一个选项,因为我还必须管理我的解释器的内存.
  3. (而且我不喜欢第三种选择,但我无法控制它)

这与我在带有垃圾收集器的语言上构建解释器并不重复.我需要一个翻译垃圾收集器?因为我希望我的引导与解释底层GC.

java compiler-construction interpreter garbage-collection vm-implementation

4
推荐指数
2
解决办法
343
查看次数