Parrot虚拟机对最终用户(软件开发人员)有什么好处?
例如,如果我可以直接针对Perl或Python进行编程,为什么我会在Parrot下为它们编程呢?
我遇到的大多数语言都使用 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
.NET的虚拟机是否编译CIL字节码(然后执行最低级别的代码--CPU汇编程序),或者它是一个解释器(读取以下指令并执行它们)?
我正在阅读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
我是一名 C 语言初学者(稍微多一点)。我对虚拟机领域非常感兴趣——JVM、Google V8、Erlang VM、PyPy 等。
我的问题是:
我有一个游戏/应用程序引擎,我目前正在整合Lua.应用程序分为包含actor的场景.我想允许用户为每个场景以及每个actor分配一个Lua脚本.处理这个问题的最佳方法是什么?我应该为每个场景创建和管理一个Lua状态,然后为每个场景创建一个Lua状态吗?或者为了性能,我最好每个场景有一个Lua状态,并将每个实例化actor的所有脚本加载到场景Lua状态.我最感兴趣的是表现.使用多个Lua VM是个坏主意吗?
如何更改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) 哪种更有效的调度方法可以使我的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
根据我对javascript虚拟机如何工作的全球理解,我可以清楚地看到微任务/宏任务的概念起着重要作用.
以下是我对此的理解:
以下是我的问题:
为什么没有明确的API来操纵这两个队列.
就像是
pushToMacroTask( function )pushToMicroTask( function )实际上,接触操作这些队列的唯一方法就是使用setTimeout()将任务添加到宏任务队列Promises并将任务添加到微任务队列......
我很好,但是这并没有给我们一个有意义的API,你不觉得吗?
这个概念是否应该保留给JS开发者"隐藏"并仅用于某些hacky情况?
你知道围绕这个主题是否有任何W3C规范?
所有VM引擎都以同样的方式实现这个概念吗?
我很乐意听到有关这方面的故事和意见.
谢谢 !
如何make-array在SBCL工作?在C++中是否有一些等价物new和delete运算符,或者它是否是其他东西,也许是汇编程度?
我偷看了源头,却什么都不懂.
performance ×3
.net ×1
assembly ×1
asynchronous ×1
beam ×1
bytecode ×1
c ×1
c++ ×1
cil ×1
clr ×1
common-lisp ×1
compilation ×1
erlang ×1
java ×1
javascript ×1
jit ×1
lisp ×1
lua ×1
memory ×1
parrot ×1
pid ×1
w3c ×1