【问题标题】:What language are CLR internal calls written in?CLR 内部调用是用什么语言编写的?
【发布时间】:2020-04-07 23:21:37
【问题描述】:

Pro .NET Performance - Optimize Your C# Applications 的第 86 页底部,它谈到了 ValueType.Equals() 的实现,并说:

CanCompareBitsFastEqualsCheck 的定义是由 CLR 定义的,它们是“内部调用”,在 IL 中没有实现

“内部调用”到底是什么?如果不是 IL,它们是用什么语言实现的?

【问题讨论】:

  • 使用合并的 .NET Core 源代码,您现在只需简单的代码搜索即可查看内部结构,github.com/dotnet/runtime/…
  • CLR和GC的大部分内部代码都是用C++编写的
  • 好吧,全部。装配太少无所谓。 This Q+A 谈机制。

标签: c# .net clr cil


【解决方案1】:

方法,如提到的CanCompareBitsFastEqualsCheck 标有[MethodImpl(MethodImplOptions.InternalCall)],它通知 clr 它需要在其内部找到实现。在 CLR 方面称为 FCall,请参阅 Calling from managed to native code

由于 coreclr 是开源的,因此很容易在 github 上找到实际的实现。 对于FastEqualsCheck,请参阅comutilnative.cpp。 CoreCLR 是用 C++ 和 Mono 编写的,因此所有此类内部调用的所有代码都是 C/C++。

在运行时,与会产生 IL(中间语言)的常规 .net 代码相反,这种内部调用是依赖于平台的汇编指令

【讨论】:

    【解决方案2】:

    编写或编译公共语言运行时的语言。不幸的是,由于 IL 代码有许多不同的运行时/解释器,如果您不告诉我我们正在谈论的具体一个,我无法告诉您更准确的信息。

    .NET 程序被编译成中间语言。 IL 然后由 CLR 运行。如果您认为这听起来像是由 Java 应用程序执行的 Java 字节码 - 您是对的!这绝对是一种灵感。然而,这也是一个进步。

    从几个角度来看,.NET 程序被解释为批处理文件、Java 字节码、JavaScript 或 PHP/Python 脚本。有些事情是所有这些都可以做的,但它们不会让在其中运行的程序可用。

    【讨论】:

    • @MickyD:我在第一句话中就回答了。其余的只是解释为什么会这样。
    • 此外,.NET 是一种编译的 语言,而不是“解释”。仅仅因为它是 JIT'd 或需要 CLR 并不会将其置于与 GW Basic 相同的级别,当然也不是 “批处理文件”
    • OP 已经知道它是“编写公共语言运行时的语言”what 到底是什么?
    • @MickyD “OP 已经知道它是“编写公共语言运行时的语言”,但它到底是什么?取决于您正在运行的 CLR 实现。
    • 编程方式只有两种:1.编译(包括JIT)2.解释。 JIT and NGEN looks like assembler to me。 .NET 与过去的解释型语言完全不同,它们在同一进程生命周期中每次遇到一行时都会重新解释它
    猜你喜欢
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多