标签: vm-implementation

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

Parrot虚拟机对最终用户(软件开发人员)有什么好处?

例如,如果我可以直接针对Perl或Python进行编程,为什么我会在Parrot下为它们编程呢?

parrot vm-implementation

3
推荐指数
1
解决办法
582
查看次数

虚拟机的优势

我遇到的大多数语言都使用 VM 或虚拟机。Java(JVM)、Python、Ruby、PHP(HHVM)等语言。

然后是 C、C++、Haskell 等直接编译为 native 的语言。

我的问题是,使用 VM(操作系统独立性之外)有什么优势?通过使用 [源代码 -> 字节码 -> 本机] 而不是 [源代码 -> 本机],使用 VM 是否只是创建了一个额外的解释步骤?

可以直接编译为什么要使用VM?

编辑

我的理解是 Python、Ruby 等。使用类似于 VM 的东西,如果不完全符合这样的定义,脚本被编译为中间表示(对于 Python,例如 .pyc 文件)。

编辑 2

是的。查了一下。Python、Ruby 和 PHP 都使用中间表示,但根本不存储在单独的文件中,而是由 VM 直接执行。请参阅问题:Java“虚拟机”与 Python“解释器”用语?

“尽管 Python 在幕后使用了虚拟机,但从用户的角度来看,大多数时候人们可以忽略这一细节。”

language-agnostic jit operating-system bytecode vm-implementation

3
推荐指数
1
解决办法
524
查看次数

.NET VM是编译器还是解释器?

.NET的虚拟机是否编译CIL字节码(然后执行最低级别的代码--CPU汇编程序),或者它是一个解释器(读取以下指令并执行它们)?

.net clr cil vm-implementation

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

覆盖与查找

我正在阅读SparseArrayandroid中的类,并遇到了以下方法:

public void removeAt(int index) {
    if (mValues[index] != DELETED) {
        mValues[index] = DELETED;
        mGarbage = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

显然,这也可以写成:

public void removeAt(int index) {      Or   public void removeAt(int index) {
    if (mValues[index] != DELETED) {            mValues[index] = DELETED;
        mValues[index] = DELETED;               mGarbage = true;
        if (!mGarbage)                      }
            mGarbage = true;         
    }                                
}                                    
Run Code Online (Sandbox Code Playgroud)

似乎Android开发人员认为数组查找mValues[index]比数组写入更快,但变量查找并不比变量写入快.

这是真的吗?它取决于VM,还是编译语言的常识?

java memory compiler-construction performance vm-implementation

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

虚拟机编程资源

我是一名 C 语言初学者(稍微多一点)。我对虚拟机领域非常感兴趣——JVM、Google V8、Erlang VM、PyPy 等。

我的问题是:

  • 我需要了解/学习哪些内容(语言、概念、算法、数学等)才能构建虚拟机?
  • 任何有帮助的书籍或其他资源

vm-implementation

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

使用Lua的最佳方式

我有一个游戏/应用程序引擎,我目前正在整合Lua.应用程序分为包含actor的场景.我想允许用户为每个场景以及每个actor分配一个Lua脚本.处理这个问题的最佳方法是什么?我应该为每个场景创建和管理一个Lua状态,然后为每个场景创建一个Lua状态吗?或者为了性能,我最好每个场景有一个Lua状态,并将每个实例化actor的所有脚本加载到场景Lua状态.我最感兴趣的是表现.使用多个Lua VM是个坏主意吗?

performance lua vm-implementation

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

修改Erlang VM Pid

如何更改Erlang VM以使用其中一个pid值的随机128位值?

我现在可以设置的最大值似乎是:

32> pid(1, 32767, 8191).
** exception error: bad argument
     in function  list_to_pid/1
        called as list_to_pid("<1.32767.8191>")
     in call from c:pid/3 (c.erl, line 419)
33> pid(0, 32767, 8191).
<0.32767.8191>
Run Code Online (Sandbox Code Playgroud)

看起来pid的产生归结为这样的事情erts/emulator/beam/erl_ptab.h:283:

ERTS_GLB_INLINE Eterm
erts_ptab_make_id(ErtsPTab *ptab, Eterm data, Eterm tag)
{
    HUint huint;
    Uint32 low_data = (Uint32) data;
    low_data &= (1 << ERTS_PTAB_ID_DATA_SIZE) - 1;
    low_data <<= ERTS_PTAB_ID_DATA_SHIFT;
    huint.hval[ERTS_HUINT_HVAL_HIGH] = erts_ptab_data2pix(ptab, data);
    huint.hval[ERTS_HUINT_HVAL_LOW] = low_data | ((Uint32) tag);
    return (Eterm) huint.val;
}
Run Code Online (Sandbox Code Playgroud)

c erlang pid beam vm-implementation

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

哪种虚拟机的调度方法更有效?

哪种更有效的调度方法可以使我的fetch-decode-execute次数更快一点?

为简单起见,我将其保持在最低限度,就像操作在1字节操作数上操作一样,例如只有两个操作数.

我现在使用的方法(简化)是:

typedef unsigned char byte;

vector<byte> _program = { INST::PUSH, 32, INST::POP};

enum INST {
    PUSH =0, /*index=0*/
    POP =1, /*index=1*/
}

//DISPATCHING METHOD #1
switch (curr_instruction) {
    case INST::PUSH: {
        /*declared inline*/ _push_to_stack(_program[instr_ptr+1]);
    }
    case INST::POP: {
        /*declared inline*/ _pop_stack();
    }
}
Run Code Online (Sandbox Code Playgroud)

或者使用函数指针表来执行'program'中的每条指令(vector/vector _program),如下所示:

typedef void (*voidptr)();

void hndl_push(){
    /*declared inline*/ _push_to_stack(_program[instr_ptr+1]);
}
void hndl_push(){
    /*declared inline*/ _pop_stack();
}

funcptr handlers[2] = {&hndl_push /*index=0*/, & hdnl_pop /*index=1*/}'
vector<byte> _program = { INST::PUSH, 32, INST::POP};

size_t …
Run Code Online (Sandbox Code Playgroud)

c++ performance assembly compiler-optimization vm-implementation

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

Javascript API,用于显式添加微任务或宏任务

根据我对javascript虚拟机如何工作的全球理解,我可以清楚地看到微任务/宏任务的概念起着重要作用.


以下是我对此的理解:

  • VM'turn'是将一个宏任务从VM宏任务队列中拉出来并执行它的事实.
  • 在VM转弯期间,可以将微任务添加到当前宏任务的微任务队列中.
  • 微任务可以将其他微任务推送到当前宏任务的微任务队列.
  • 当微任务队列为空时,VM转弯将结束.

以下是我的问题:

为什么没有明确的API来操纵这两个队列.

就像是

  • pushToMacroTask( function )
  • pushToMicroTask( function )

实际上,接触操作这些队列的唯一方法就是使用setTimeout()将任务添加到宏任务队列Promises并将任务添加到微任务队列......

我很好,但是这并没有给我们一个有意义的API,你不觉得吗?

这个概念是否应该保留给JS开发者"隐藏"并仅用于某些hacky情况?

你知道围绕这个主题是否有任何W3C规范?

所有VM引擎都以同样的方式实现这个概念吗?

我很乐意听到有关这方面的故事和意见.

谢谢 !

javascript w3c asynchronous vm-implementation

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

SBCL中的Make-array

如何make-array在SBCL工作?在C++中是否有一些等价物newdelete运算符,或者它是否是其他东西,也许是汇编程度?

我偷看了源头,却什么都不懂.

lisp compilation common-lisp vm-implementation

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