科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道深入理解.NET 的JIT编译方式

深入理解.NET 的JIT编译方式

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

   CLR只执行本机的机器代码。有两种方式产生本机的机器代码:实时编译(JIT)和预编译方式(产生native image)。 CLR使用类型的方法表来路由所有的方法调用。类型的方法表由多个入口项组成。

作者:中国IT实验室 来源:中国IT实验室 2007年10月2日

关键字: 编程

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共2页)

   

CLR只执行本机的机器代码。有两种方式产生本机的机器代码:实时编译(JIT)和预编译方式(产生native image)。

CLR使用类型的方法表来路由所有的方法调用。类型的方法表由多个入口项组成。每个入口项指向一个唯一的存根例程(stub routine)。

初始化时,每个存根例程包含一个对于CLR的JIT编译器的调用(它由内部的PreStubWorker程序公开)。在JIT编译器生成本机代码后,它会重写存根例程,插入一个jmp指令跳转到刚才JIT编译器的代码。只有当要调用某个方法时,JIT编译器才会将CIL的方法体编译为相应的本机机器码版本。这样可以优化程序的工作集。

对于如下的例子:

//using System;

public class Bob{

static int x;

static void a(){x+=2;}

static void b(){x+=3;}

static void c(){x+=4;}

public static void f()

{

c();

b();

a();

}

}

public class MyClass

{

public static void Main()

{

Bob.f();

}

}

用调试器进行JIT调试。

首先,看一下每个方法的汇编显示:

Main()的汇编显示为:

push ebp

mov ebp,esp

//调用Bob.f()方法

call dword ptr ds:[00975394h]

nop

pop ebp

ret

[注]00975394h是Bob.f()在CORINFO_CLASS_STRUCT该内部数据结构中对应的内存地址,该地址中的内容是对应的存根例程的开始地址。

f()的汇编显示为:

push ebp

mov ebp,esp

//调用Bob.c()方法

call dword ptr ds:[00975390h]

//调用Bob.b()方法

call dword ptr ds:[0097538Ch]

//调用Bob.a()方法

call dword ptr ds:[00975388h]

nop

pop ebp

ret

[注]00975390、0097538c、00975388分别为Bob.c()、Bob.b()、Bob.a()在CORINFO_CLASS_STRUCT该内部数据结构中对应的内存地址,该地址中的内容是对应的存根例程的开始地址。

c()的汇编显示为:

push ebp

mov ebp,esp

add dword ptr ds:[0097539Ch],4

nop

pop ebp

ret

[注]0097539c是Bob.x的内存地址。

b()的汇编显示为:

push ebp

mov ebp,esp

add dword ptr ds:[0097539Ch],3

nop

pop ebp

ret

[注]0097539c是Bob.x的内存地址。

a()的汇编显示为:

push ebp

mov ebp,esp

add dword ptr ds:[0097539Ch],2

nop

pop ebp

ret

[注]0097539c是Bob.x的内存地址。 

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章