标签: intermediate-language

在IL中看起来像什么?

if语句编译成IL时,语句是什么样的?

这是C#中一个非常简单的构造.sombody可以给我一个更抽象的定义,它究竟是什么?

c# if-statement definition intermediate-language

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

回补如何与标记一起使用?

我在互联网上搜索过,无法找到关于回调如何工作的正确解释?

能否请您解释一下回补是如何工作的?它如何与标记一起使用

我知道它有两种主要类型的标记:

  1. 有下一个四边形
  2. 有下一个列表

我找到了这段代码,他们在这段代码中输入一个输入文件并使用RISKI语言创建一个文件.

在他们的第一次滚动中他们有:

PROGRAM : N FUNCTION M MAIN_FUNCTION
Run Code Online (Sandbox Code Playgroud)

你可以看到N和M是标记(它们是空卷).

language-agnostic compiler-construction bison intermediate-language

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

在.NET中,调用堆栈是否与线程密不可分?

是否可以在函数执行过程中设置指向当前堆栈的指针(稍后获取)然后释放当前线程(不解除调用堆栈)并将其返回给线程池?然后,让另一个线程在该线程停止的地方继续?我知道这意味着调用函数的人不会知道当前的线程上下文会发生变化,并且可能会涉及编写一些自定义的IL代码来做这样的事情,但有没有办法做到这一点?

.net il multithreading intermediate-language

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

如何在Reflection.Emit中使用条件

你好我正在生成一个类使用Reflection.Emit,我想知道你如何使用brfalse命令conditionals.

具体来说,我不知道我如何的翻译IL操作码brfalse.s命令.

我的方法有以下形式:

object MyMethod() { if(isTransaction) //isTransaction is a bool property return Method1(); else return Method2(); }

条件

        IL_0000: ldarg.0      // this
        IL_0001: call         instance bool RediusTests.DaemonBase::get_IsTransaction()
        IL_0006: brfalse.s    IL_0020    //how is this translated within opcodes?
Run Code Online (Sandbox Code Playgroud)

第一分支:

        IL_0008:ldarg_0
        IL_.......          ///INSTRUCTIONS
        IL_......
        IL_001f:ret
Run Code Online (Sandbox Code Playgroud)

第二分支:

        IL_0020:ldarg_0     //How do i specify with OPCODES to jump here?????
        IL_.......          
        IL_......
        IL_001f:ret
Run Code Online (Sandbox Code Playgroud)

对于第一个片段,什么是参数brfalse.s

        ilgen.Emit(OpCodes.Ldarg_0);
        ilgen.Emit(OpCodes.Call, getIsTransaction);
        ilgen.Emit(OpCodes.Brfalse,);  //what do …
Run Code Online (Sandbox Code Playgroud)

c# reflection.emit intermediate-language

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

为什么使用 callvirt 在泛型类型的只读字段上调用方法

考虑以下:

interface ISomething
{
    void Call(string arg);
}

sealed class A : ISomething
{
    public void Call(string arg) => Console.WriteLine($"A, {arg}");
}

sealed class Caller<T> where T : ISomething
{
    private readonly T _something;
    public Caller(T something) => _something = something;
    public void Call() => _something.Call("test");
}

new Caller<A>(new A()).Call();
Run Code Online (Sandbox Code Playgroud)

对 Caller<A>.Call 的调用以及对 A.Call 的嵌套 tcall 都是通过 callvirt 指令进行的。

但为什么?这两种类型都是众所周知的。除非我误解了什么,否则这里不应该使用 call 而不是 callvirt 吗?

如果是这样 - 为什么不这样做?这仅仅是编译器未完成的优化,还是背后有任何特定原因?

c# cil intermediate-language

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