• .NET 中的通用语言运行时


    .NET 应用程序如何编译和运行?

    为了确切地了解DotNet应用程序的编译和运行,请查看下图。

    首先,开发人员必须使用任何支持DotNet的编程语言(如 C#、VB、J#等)编写代码。然后,相应的语言编译器将程序编译为称为中间语言 (IL) 代码。
    例如,如果编程语言是 C#,则编译器为 csc,如果编程语言是 VB,则编译器将是 vbc。此中间语言 (IL) 代码是半编译的代码,即部分编译的代码,不能由操作系统直接执行。
    因此,当您想要在计算机上执行此 IL 代码时,DotNet框架提供一些称为CLR或公共语言运行时的东西,它负责执行IL代码。

    CLR采用IL(中级语言)代码,并赋予名为JIT编译器。JIT 编译器采用IL代码并读取IL代码的每一行,并将其转换为计算机特定的指令(即二进制格式),这些指令可由基础操作系统执行。

    中级语言(IL)代码

    IL 代码是半编译或部分编译或独立于 CPU 的部分编译代码。

    为什么部分编译代码或为什么不完全编译代码?

    作为开发人员,您可能会思考为什么部分编译的代码,或者为什么没有完全编译的代码。原因很简单。我们不知道在什么样的环境中运行 .NET 代码将运行 (例如, Windows XP, Windows 7, Windows 10, Windows 服务器等)。
    换句话说,我们不知道什么操作系统将运行我们的应用程序;我们亦不知道CPU配置、机器配置、安全配置等。因此,IL 代码是部分编译的,在运行时,此 IL 代码会编译为使用环境属性(如操作系统、CPU、计算机配置等)的特定于计算机的说明。

    通用语言运行时

    CLR 是 .NET Framework 的核心,它包含以下组件。

    1.安全管理器
    2.JIT 编译器
    3.内存管理器
    4.垃圾收集器
    5.异常管理器
    6.通用语言规范 (CLS)Common Language System
    7.通用类型系统 (CTS)Common Type System

    接下来详细讨论每个组件的哪些功能。

    安全管理器

    基本上有两个组件来管理安全性。它们如下所示:
    1.CAS(代码访问安全性)
    2.CV(代码验证)
    这两个组件基本上用于检查当前用户的权限,即允许用户访问程序集。CLR 还了解此代码具有哪些权利或权限,以及操作系统是否安全。因此,基本上这些类型的检查由安全管理器维护。

    JIT 编译器

    JIT 编译器负责将 MSIL 代码转换为由计算机执行的本机代码。本机代码是系统硬件直接可以理解的。JIT 在执行前编译代码,然后将此转换保存在内存中。

    内存管理器

    内存管理器组件为应用程序要使用的变量和对象分配必要的内存。

    垃圾收集器

    当DotNet应用程序运行时,将创建大量对象。在给定的时间点,我们可能不需要这些对象。因此,垃圾回收器只不过是一个小例程,或者你可以说它是一个后台进程线程,它运行并尝试识别应用程序当前未使用的对象,并取消分配这些对象的内存。

    异常管理器

    每当在运行时发生异常时,此组件都会重定向处理器以执行 catch 或最终阻止。

    通用类型系统(CTS)

    .NET 框架支持许多编程语言,如 C#、VB.NET、J# 等。每个编程语言都有自己的数据类型。一种编程语言无法理解其他编程语言数据类型。但是,在某些情况下,您希望用一种语言编写代码,以其他语言调用。为了确保这些语言之间的顺畅通信,最重要的是它们应该有一个通用类型系统 (CTS),以确保用两种不同语言定义的类型编译为公共数据类型。
    CLR 将执行所有编程语言的数据类型;这是可能的,因为CLR将包含它自己的数据类型,这是所有编程语言通用的。
    在编译时,所有特定于语言的数据类型都转换为 CLR 的数据类型。此数据类型 CLR 是 .NET 的所有编程语言通用的,称为通用类型系统 (CTS)。

    CLS(通用语言规范)

    CLS 是 CLR 的一部分。.NET 支持许多编程语言,并且每个编程语言都有自己的语法规则来编写代码,称为语言规范,即每个编程语言都有自己的语言规范。

    一种编程语言无法理解其他编程语言语法规则(语言规范)。但 CLR 将执行所有编程语言代码。这是可能的,因为CLR无法理解任何编程语言规范,而CLR有其MSIL自己的语言规范(语法规则)。

    每个语言编译器在编译时都应遵循 CLR 的此语言规范,并生成 MSIL;CLR 的 JIT 编译器将从 MSIL 生成本机代码。此 CLR 的语言规范对于 .NET 的所有编程语言代码执行都很常见,称为 CLS。

  • 相关阅读:
    iOS应用程序间共享数据(转)
    解决右滑返回手势和UIScrollView中的手势冲突(转)
    (转)iOS被开发者遗忘在角落的NSException-其实它很强大
    iOS 身份证最后一位是X,输入17位后自动补全X(转)
    springboot单机秒杀之queue队列
    springboot单机秒杀-aop+锁
    springbot单机秒杀,锁与事务之间的大坑
    spring-cloud学习之4.微服务请求打通
    spring-cloud学习之3.使用feign实现负载均衡
    spring-cloud学习之2.搭建请求网关spring-cloud-getway
  • 原文地址:https://www.cnblogs.com/zh7791/p/13702363.html
Copyright © 2020-2023  润新知