CLR是虚拟机吗?

2024-03-07

我读过一本提到 .net 的书CLR 作为虚拟机?任何人都可以证明这一点吗?为什么我们在某些开发平台上需要虚拟机的概念?

是否有可能开发一个完全面向对象且像.net一样强大的本机框架(没有虚拟机的框架)?

将 CLR 称为虚拟机的书是“专业.Net Framework 2.0".


这里存在很多误解。我想如果您确实愿意,您可以将 .Net 视为虚拟机,但让我们看看 .Net Framework 如何真正处理您的代码。典型的场景是这样的

  1. 您可以使用 C#、VB.Net、F# 或其他兼容语言编写 .Net 程序。
  2. 该代码被编译为中间语言 (IL),类似于 Java 的字节码,并分发到最终用户计算机。
  3. 最终用户在安装了正确版本的 .Net 的计算机上首次调用该程序
  4. 计算机认为这是一个 .Net 程序集而不是“原始”机器代码,并将其传递给 JIT 编译器
  5. JIT 编译器将 IL 编译为完全本机代码.
  6. 本机代码在程序执行期间保存在内存中。
  7. 调用保存的本机代码,IL 不再重要。

这里有几个重要的点,但最重要的一点是,任何时候都不会解释任何代码。相反,您可以在步骤 5 中看到它被编译为本机代码。这是huge与将其加载到虚拟机中不同,原因如下:

  1. 完全编译的代码由CPU直接执行,而不是由额外的软件抽象层解释或翻译,这样应该更快。
  2. JIT 编译器可以利用特定于运行程序的单个机器的优化,而不是满足于最低公分母。
  3. 如果您愿意,您甚至可以预编译代码,本质上对用户完全隐藏步骤 5。

我想您可以将其称为虚拟机,从某种意义上说,JITter 从开发人员那里抽象出了真实机器的细节。就我个人而言,我认为这并不正确,因为对于许多人来说,虚拟机意味着远离本机代码的运行时抽象,而对于 .Net 程序来说,不存在。

关于整个过程的另一个关键点是,它真正区别于“虚拟机”环境typical过程。如果您确实愿意,您可以在分发之前预编译 .Net 程序集,并将本机代码直接部署给最终用户(提示:在程序的生命周期中,总体速度会更慢,因为您会失去特定于机器的优化)。当然,您仍然需要安装 .Net 运行时,但此时它实际上与任何其他运行时 API 没有太大区别;它更像是一个带有很好的 API 的 dll 集合,您可以链接到该 API,就像您可以使用 VB 或 C 运行时一样,Microsoft 也随 Visual Studio 一起提供了这些 API。这种方式将 IL 排除在外,使得 VM 的绰号更难证明其合理性。 (我说“有点”是因为 IL 仍然被部署并用于验证保存的代码,但它本身从未被触及来执行)。

另一点是缺乏虚拟机进程。当您运行应用程序时,不会运行常见的“沙箱”进程。与 Java 相比,如果在程序运行时打开任务管理器,您将看到专门针对 Java VM 的进程,而应用程序的实际进程是 VM 创建的沙箱内的线程。在.Net 中,您可以直接在Windows 任务管理器中看到应用程序的进程。

总之:您可以说 IL + CLR + JIT 一起以某种方式构成了虚拟机。我个人不这么认为,但如果你相信这一点,我不会与你争论。我想说的一点是,当你告诉某人 .Net 在虚拟机中运行而无需进一步解释时,你与该人传达的想法是“主机进程中解释的字节码”。那是错误的。


Update这个答案现在有点过时了,事情已经发生了变化,使得 .Net 不再像虚拟机。在容器时代,冷启动时间可能更重要,我的理解是最新版本的 .Net Core 有更多工具可以使部署本机代码(并在每次启动时跳过 JIT 步骤)变得更加容易。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CLR是虚拟机吗? 的相关文章

随机推荐

  • Symfony2 的 role_hierarchy

    我的 role hierarchy 有一个大问题 security role hierarchy ROLE ADMIN ROLE USER ROLE AUTHOR ROLE MODERATOR ROLE SUPER ADMIN ROLE A
  • 在 Linq to Sql 中返回多列?

    如何在 C 中使用 linq to sql 返回多列 我试图用以下方式结束我的查询 select new A Product A Qty 但这会返回一些匿名类型 我不确定该怎么办 如何返回它以及如何从中提取信息 我想把它放在某种数组中 th
  • 右对齐 Facebook 点赞按钮 iFrame 的内容?

    我需要右对齐 Facebook Like 按钮的内容 以便它们始终位于其设置的 宽度 的骑行侧 我可以在 Firebug 中通过将表格设置为 float right 来做到这一点 但如果我在 CSS 中定义该值 它似乎不起作用 Here s
  • 在 C# 中使用 jpegtran、jpegoptim 或其他 jpeg 优化/压缩

    我在网上商店收集了 100 种 也许是 1000 种 产品 其中每种产品都有 10 30 张图片 我需要在不损失图像质量的情况下尽可能优化图像的文件大小 我没有直接使用 jpegtran jpegoptim 或任何其他 jpeg 优化器 但
  • numpy 中的双梯形积分

    我有一个二维函数 f x y exp y x 我想使用 NumPy trapz 计算二重积分 int 0 10 int 0 10 f x y dx dy 经过一番阅读后 他们说我应该重复 trapz 两次 但它不起作用 我尝试过以下方法 i
  • 如何在 Cocoa 中创建并显示自定义工作表? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 这是新手问题 如何在 Cocoa 中创建并显示自定义工作表 就像 Safari 中的 添加书签 表 见下文 任务涉及哪些步骤 每一步如
  • 如何测试你的应用程序被杀死并重新启动?

    我想测试我的应用程序被杀死并在非主要活动中重新启动的情况 假装用户该应用程序只是恢复了 有人知道怎么做吗 我发现的所有想法都不起作用 因为它们都杀死了应用程序 然后该应用程序在主要活动中恢复 我实际上发现这更方便 您的应用程序在上一个活动中
  • 更改 Bazel 中的测试执行目录?

    我有一个简单的 Bazel 项目布局 如下所示 foo BUILD bazel testdata a txt test sh WORKSPACE 测试检查a txt exists foo test sh bin bash FILE foo
  • 如何向表中添加列?

    使用 react native sqlite storage 该应用程序已经在 Google Play 上上线 我想向现有数据库表添加两列 这样应用程序就不会因现有用户而崩溃 当您将列添加到现有表时 您会收到类似错误 error messa
  • 对 SBCL 中的“ql:quickload”和可执行脚本感到困惑

    我一直在尝试在我的可执行脚本中使用 Quicklisp 包 一个 简单的 工作示例是 usr bin sbcl script eval when compile toplevel load toplevel execute ql quick
  • 如何检查php脚本是否在本地服务器上运行?

    是否可以检查网站 php 是在本地运行还是在托管服务器上运行 如果网站在本地运行 我想启用一些日志 并且我不希望这些日志出现在在线网站上 我可以设置一个变量 local 1 但我必须在上传之前更改它 有没有办法自动执行此任务 本地服务器 W
  • 对于属性上的 NOTIFY 信号,如果我给它一个参数,会有什么区别?

    假设我有一个如下所示的类 class Something QObject Q PROPERTY int something READ getSomething NOTIFY somethingChanged signals void som
  • 更改 AngularJS ngTrim 行为

    我正在使用 AngularJS 版本 1 5 6 我有一个带有大量文本区域和文本输入的大型应用程序 我今天发现了一个错误 该错误是由 AngularJS 修剪文本类型输入的默认行为引起的 我想将此行为从默认修剪更改为默认不修剪 有没有一种简
  • 如何仅使用按位运算符实现 Bitcount?

    任务是仅使用按位运算符实现位计数逻辑 我让它工作得很好 但我想知道是否有人可以建议一种更优雅的方法 仅允许按位运算 没有 如果 因为 等 int x 4 printf d n x 0x1 printf d n x gt gt 1 0x1 p
  • 查找我的应用程序中的所有 mongoid 模型名称

    有没有办法找到我的 Rails 应用程序中的所有 Mongoid 模型名称 我可以通过获取 app models 文件夹中的所有文件来找到所有模型 但我特别想要 mongoid 模型名称 您可以在 Mongoid 3 1 及更高版本中执行此
  • AS3如何在有多个影片剪辑时使一次只能点击1个影片剪辑

    好的 我有一个页面 上面有 5 个影片剪辑 按钮 当您将鼠标悬停在每一个上时 它们会亮起 OVER 状态 当您单击它们时 它们会展开 DOWN 状态 问题是 如果您展开了多个影片剪辑 处于 向下 状态 它们会重叠并且看起来很糟糕 我想对它们
  • 如何在 Flask 中获得用户对 cookie 的许可

    我有一个用 Flask 和 Flask Login 构建的网站 所以我知道它在某个时候会生成 cookie 但我的问题比这更基本 Flask 应用程序是否总是立即生成 cookie 如果没有 是否有任何工具可以让我识别应用程序的哪一部分在何
  • 为什么我的堆栈指针仅以 16 的倍数递增?

    使用以下 C 代码 void func int a 1 b 2 c 3 编译使用gcc S O o myfile c我得到输出 file myfile c intel syntax noprefix text globl func type
  • 在Python中将外部函数分配给类变量

    我试图将其他地方定义的函数分配给类变量 以便稍后可以在实例的方法之一中调用它 如下所示 from module import my func class Bar object func my func def run self self f
  • CLR是虚拟机吗?

    我读过一本提到 net 的书CLR 作为虚拟机 任何人都可以证明这一点吗 为什么我们在某些开发平台上需要虚拟机的概念 是否有可能开发一个完全面向对象且像 net一样强大的本机框架 没有虚拟机的框架 将 CLR 称为虚拟机的书是 专业 Net