我是靠谱客的博主 乐观小土豆,最近开发中收集的这篇文章主要介绍C#系列学习笔记1:.Net和JIT,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

C#系列学习笔记1:.Net和JIT

      • .Net
      • JIT

.Net

.NET是跨语言的一个平台,核心就是.NET Framwork,是.NET程序开发和运行的环境。语言可以是C#,f#,j#,VB.net等等。c#是运行在.Net平台下的一种面向对象的高级编程语言。

  1. .Net框架的组成分为两部分:
  • CLR:公共语言运行时(Common Language Runtime),提供内在管理,代码安全性检测等功能。
  • FCL:.NET框架类库(.NET Framework Class Library),提供大量应用类库,类库中有很多线程的资源可使用(比如:类,方法,属性),提高开发效率。
  1. CLR的结构:
  • CLS:公共语言规范,获取各种语言转换成统一的语法规范,是.Net跨语言开发的基础。
  • CTS:通用类型系统,将各种语言中的数据类型转换成统一的类型
  • JIT:实时编译器(即时编译器)用于将转换之后的语言编译为二进制语言,交给CPU执行。
    CLR一个很重要的特性就是Type安全。CLR在任何时候都知道某个对象的类型。你可以通过GetType方法获得,由于该方法不是虚函数,因此不能被覆盖,也就是说返回的值是永远真实的。
  1. .Net运行的机制流程
    各种语言(c#,F#,j#等对应的源程序)-> 经过CLS,CTS第一次编译 -> 统一规范语言(中间语言)MSIL(.EXE,.DLL) -> JIT第二次编译 -> 二进制语言 -> 运行在CPU中

  2. .Net的基础类库BCL
    当通过VS创建一个项目后,这个项目就已经引用好了通过.NET下的语言编写好的一些类库。比如ConSole类,System.IO类,这些都是微软帮你写好的,不用你自己去编写,它帮你编写了一个面向.NET的开发语言中使用的基本的功能。这部分类,我们称之为BCL(Base Class Library)基础类库,它们大多都包含在System命名空间下。由微软开发的类库统称为:FCL,Framework Class Library,.NET框架类库,我上述所表达的BCL就是FCL中的一个基础部分,FCL中大部分类都是通过C#来编写的。

基础类库BCL包含:基本数据类型,文件操作,集合,自定义属性,格式设置,安全属性,I/O流,字符串操作,事件日志等的类型

JIT

JIT(Just-in-time compilation, JIT)编译器会使用即时编译,对不同架构的机器生成不同的机器码,大部分的代码优化都在这里完成。JIT 只有在运行时才会工作,当生成(Build)项目时,JIT 不会工作。编译器在编译时,会对代码进行检查,对于只调用过一次的代码,不会JIT优化。多次使用的代码(例如for循环)才会进行JIT。

通常,程序有两种运行方式:预先编译(AOT)与动态编译。预先编译的程序在执行前全部被翻译为机器码,而动态编译则是一句一句,边运行边翻译。即时编译则混合了这二者,一句句编译源代码,但是会将翻译过的代码缓存起来以降低性能损耗。

当运行程序时,CLR 先会调用类加载器加载需要的类型,加载完成之后,就创建了类型对象,包括方法表。

img

当首次调用该类型的 X 方法。由于其没有对应的机器码(除非它预先编译好了,例如Console 类中的方法),CLR 会在调用时遭遇 jmp 指令(目标为 JIT 编译器),将 X 方法的 IL 代码转换为机器码。

JIT 编译过程中,会做运行时的类型验证,将代码和元数据中的定义进行比对,确定代码的类型安全性。

编译完成之后,将机器码存储在缓存中,并将缓存地址放在 jmp 指令的后面,代替之前的 JIT 编译器地址。

img

以后对该方法的所有调用都不需要再次 JIT 编译, JIT 已将将机器码储存在内存中。当程序结束后,这些机器码就会消失,所以每次程序运行都伴随着即时编译。

不过,这个现象带来的性能损耗仅仅会在方法第一次调用时体现,而大部分程序都会调用方法不止一次。

最后

以上就是乐观小土豆为你收集整理的C#系列学习笔记1:.Net和JIT的全部内容,希望文章能够帮你解决C#系列学习笔记1:.Net和JIT所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部