Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 关闭JIT并控制MSIL(自己的VM)中的代码流_C#_Interpreter_Jit_Cil - Fatal编程技术网

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

C# 关闭JIT并控制MSIL(自己的VM)中的代码流,c#,interpreter,jit,cil,C#,Interpreter,Jit,Cil,我正在用C#编写我自己的脚本语言,其中有一些我喜欢的特性,我选择使用MSIL作为输出的字节码(Reflection.Emit非常有用,我不需要想出其他字节码)。它可以工作,发出可执行文件,可以运行(甚至可以使用Reflector:反编译),速度非常快 但是-我想在一个进程+一个线程中运行多个“进程”,并手动控制分配给它们的CPU时间(同时实现.NET framework提供的更健壮的IPC)有没有办法完全禁用JIT并创建自己的VM,使用.NET framework一条接一条地执行指令(以及控制内

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

但是-我想在一个进程+一个线程中运行多个“进程”,并手动控制分配给它们的CPU时间(同时实现.NET framework提供的更健壮的IPC)有没有办法完全禁用JIT并创建自己的VM,使用.NET framework一条接一条地执行指令(以及控制内存使用等),不需要自己写任何东西,或者为了实现这一点,我必须编写整个MSIL解释

编辑1):我知道解释IL并不是宇宙中最快的事情:)

编辑2):为了澄清——我希望我的虚拟机是某种“操作系统”——它获得一些CPU时间并在进程之间分配,控制它们的内存分配,等等。它不一定要快,也不一定要有效,只是我的一些实验的概念证明。我不需要在处理每一条指令的层面上实现它——如果这是由.NET完成的,我不会介意,我只想说:第一步指令,等我告诉你下一步

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

您可以使用-我相信这允许一个选项来解释IL,而不是将其JITting。事实上,它是开源的,这意味着(需要许可)您也可以根据自己的需要对其进行修改

无可否认,Mono并不具备.NET的所有功能,但它可以满足您的所有需要。

您可以使用它,我相信它允许您选择解释IL,而不是将其JITting。事实上,它是开源的,这意味着(需要许可)您也可以根据自己的需要对其进行修改


无可否认,Mono并不具备.NET的所有功能,但它可以满足您的所有需要。

请注意,MSIL的设计目的是通过JIT编译器进行解析。这不太适合做口译员。一个很好的例子可能是ADD指令。它用于添加各种各样的值类型值:byte、short、int32、int64、ushort、uint32、uint64。编译器知道需要哪种类型的add,但在生成MSIL时会丢失该类型信息

现在您需要在运行时找到它,这需要检查计算堆栈上的值的类型。非常慢


易于解释的IL具有专用的ADD指令,如ADD8、ADD16等。

请注意,MSIL的设计目的是由JIT编译器解析。这不太适合做口译员。一个很好的例子可能是ADD指令。它用于添加各种各样的值类型值:byte、short、int32、int64、ushort、uint32、uint64。编译器知道需要哪种类型的add,但在生成MSIL时会丢失该类型信息

现在您需要在运行时找到它,这需要检查计算堆栈上的值的类型。非常慢


易于解释的IL具有专用的ADD指令,如ADD8、ADD16等。

公共语言运行时的Microsofts实现只有一个执行系统,即JIT。另一方面,Mono同时提供了JIT和解释器

一、 但是,不完全了解您自己到底想做什么,以及您想留给Microsofts实施的是什么:

有没有办法完全禁用JIT并创建自己的VM

。。。不需要自己写任何东西,或者为了实现这一点,我必须编写整个MSIL解释

这有点矛盾

如果您认为,您可以编写一个比MicrosoftsJIT更好的执行系统,那么您必须从头开始编写它。但是,请记住,microsofts和monos JIT都是高度优化的编译器

在用户模式下,无法精确地为操作系统进程安排CPU时间。这就是操作系统的任务

一些绿色线程的实现可能是一个想法,但这绝对是非托管代码的主题。如果这是您想要的,请查看CLR宿主API


我建议您尝试在CIL中实现您的语言。毕竟,它被编译为原始x86。如果您不关心可验证性,可以在必要时使用指针。

Microsofts的公共语言运行时实现只有一个执行系统,即JIT。另一方面,Mono同时提供了JIT和解释器

一、 但是,不完全了解您自己到底想做什么,以及您想留给Microsofts实施的是什么:

有没有办法完全禁用JIT并创建自己的VM

。。。不需要自己写任何东西,或者为了实现这一点,我必须编写整个MSIL解释

这有点矛盾

如果您认为,您可以编写一个比MicrosoftsJIT更好的执行系统,那么您必须从头开始编写它。但是,请记住,microsofts和monos JIT都是高度优化的编译器

在用户模式下,无法精确地为操作系统进程安排CPU时间。这就是操作系统的任务

一些绿色线程的实现可能是一个想法,但这绝对是非托管代码的主题。如果这是您想要的,请查看CLR宿主API


我建议您尝试在CIL中实现您的语言。毕竟,它被编译为原始x86。如果你不关心可验证性,你可以在必要的时候使用指针。

< P>你可以考虑做的是用状态机样式生成代码。让我解释一下我的意思

当你写作时