问题标签 [intermediate-language]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
747 浏览

.net - .NET IL 属性设置器

考虑这个类:

现在,当我查看编译器为Bar属性设置器发出的 IL 代码时:

为什么它会做一个ldarg.0?什么位于第一个(索引 0)参数中?由于方法/属性设置器只需要 1 个参数...

吸气剂也是如此:

为什么.locals init?为什么是 ldarg.0 ?为什么它不做一个ldfld支持字段并返回它?:)

0 投票
2 回答
2507 浏览

.net - 用于编辑.IL 文件的工具?

目前我为此目的使用记事本。是否有任何用于编辑 .NET 中间语言文件的特定工具?

Dotnet IL Editor (DILE) 在编辑文件之前会反汇编文件,我不需要该功能 - 只需要以最有效的方式进行实际编辑。

0 投票
2 回答
929 浏览

c# - ILGenerator:加载创建的方法

我正在使用 System.Reflection.Emit,并且在某些时候我想从 MethodBuilder 创建一个委托:

我可以发现从静态函数创建委托使用了这样的方法:

但现在我被困住了。我需要一种方法来 ldftn MethodBuilder,然后我需要一种方法来发出下一行的指令。而且我不知道如何获得一个接受本机 int 的构造函数。

有什么建议么?

0 投票
4 回答
334 浏览

.net - 这个虚方法调用怎么比密封方法调用快?

我正在对虚拟成员与密封成员的性能进行一些修补。

下面是我的测试代码。

输出是

我一定是做错了什么,因为据此虚拟调用比密封调用更快。

我在“优化代码”打开的情况下以发布模式运行。

编辑:在 VS(作为控制台应用程序)之外运行时,时间接近死胡同。但虚拟几乎总是出现在前面。

0 投票
1 回答
872 浏览

.net - F# Interpreter (fsi.exe) 是否也像 F# Compiler (fsc.exe) 那样生成中间语言代码?

目前我正在为大学做关于 F# 的研究。我对 F# 交互式控制台和 F# 编译器有疑问。

F# 编译器在编译 F# 源代码时会生成 Microsoft 中间语言 (MSIL) 代码。然后,在执行编写的程序时,JIT 编译器会将其翻译成机器代码。

但是 F# 解释器控制台有什么作用?它是否还逐行将 F# 代码转换为 MSIL,然后将其 JIT 转换为机器代码?还是将 F#-Code 直接翻译成机器码?

如果它首先将其转换为 IL,那么我认为可能会有一个 IL 解释器,因为 JIT 编译器只编译完整的程序。不会吗?

你怎么看,F#-interpreter 如何处理 F# 代码并翻译它?

问候,马丁

0 投票
1 回答
1092 浏览

.net - .NET 接口上的静态构造函数未运行

您可以在 IL 中的 .NET 接口上定义静态构造函数。但是,如果这样做,则在接口上运行方法时不会运行静态构造函数:

这里发生了什么?CLR 规范 (Partition II, 10.5.3.1) 说当类型初始化器被执行时是在 Partition I 中指定的,但是我在 Partition I 中找不到任何类型初始化器执行的引用。

编辑:

可以让接口静态初始化程序运行,但只能通过向接口添加一个静态字段,并在代码中的某处访问该字段,即使该字段实际上并未在静态构造函数中分配。因此,似乎在接口上调用方法不会使静态构造函数运行,但访问字段却可以。为什么会这样?规范中在哪里提到了这一点?

0 投票
1 回答
216 浏览

c# - 方法调用的所有引用的集成测试

所以,我一直在互联网上搜索了一下,想看看是否有人已经在这里发明了轮子。我想做的是编写一个集成测试来解析当前项目,找到对某个方法的所有引用,找到它的参数,然后检查数据库中的那个参数。例如:

任何其他类都将使用 IOC 将 IContentProvider 注入到其构造函数中,这样他们就可以编写如下内容:

基本上,单元测试会找到所有这些引用,找到文本集 ["SomeDescriptor", "SomeOtherDescriptor"],然后我可以检查数据库以确保为这些描述符定义了行。此外,描述符是硬编码的。

我可以为所有描述符创建一个枚举值,但枚举会有数千个可能的选项,这看起来有点像 hack。

现在,这个关于 SO 的链接:How I can get all reference with Reflection + C#基本上说,如果没有一些非常高级的 IL 解析,这是不可能的。澄清; 我不需要 Reflector 或任何东西——它只是作为一个我可以运行的自动化测试,这样如果我团队中的任何其他开发人员在没有创建数据库记录的情况下签入调用此内容的代码,测试就会失败。

这可能吗?如果是这样,是否有人可以查看资源或修改示例代码?

编辑:或者,也许是一种不同的方法来做这个 VS 试图找到所有的引用?最终结果是我希望在记录不存在时测试失败。

0 投票
1 回答
354 浏览

c# - 关于 C# 编译器如何发出 TypeRef 信息的问题

当我尝试 C# 4.0 中的新特性“可选参数”时,我发现了这个有趣的事情。

我知道在 C# 4.0 中有两种使用“可选参数”的方法:

现在,如果我编译这段代码,然后使用 IL Dasm 查看程序集,那么我会看到在 IL Dasm 的“MetaInfo”窗口中,有一个对 OptionalAttribute 的类型引用,如下所示:

但是没有 DefaultParameterValueAttribute 的迹象。这是为什么?

其实我认为这两个属性都不应该在这里,因为编译器对它们的处理不同,它们有自己的标志值。为了解释我的意思,请看一下:

那是这两种方法的元数据。我们可以看到每个代码段的最后一行已经存储了默认的参数值,那为什么还要引用 OptionalAttribute 呢?

0 投票
3 回答
2071 浏览

c++ - 来自 C++ 的中间代码

我想将 C++ 程序编译为中间代码。然后,我想用当前处理器的所有资源编译中间代码。

第一步是使用优化 (-O2) 编译 C++ 程序,运行链接器并完成大部分编译过程。此步骤必须独立于操作系统和体系结构。

第二步是针对当前计算机的操作系统和处理器编译第一步的结果,没有原始源代码,带有处理器的优化和特殊指令(-march=native)。第二步应该很快并且对软件的要求最低。

我可以做吗?怎么做?

编辑
我想做,因为我想分发一个独立于平台的程序,它可以使用处理器的所有资源,没有原始源代码,而不是为每个平台和操作系统分发一个编译。如果第二步又快又容易,那就太好了。

相同架构的处理器可能具有不同的特性。X86 处理器可能有 SSE1、SSE2 或其他,它们可以是 32 位或 64 位。如果我为通用 X86 编译,它将缺少 SSE 优化。多年后,处理器将具有新功能,并且需要为新处理器编译程序。

0 投票
3 回答
636 浏览

c++ - 部分 C++ 程序的静态分析

我正在考虑对 C++ 代码示例做一些静态分析项目,而不是整个程序。一般来说,静态分析需要一些更简单的中间表示,但如果没有整个程序代码,就无法准确地创建这样的表示。

不过,我知道Java有这样的工具——它基本上“猜测”丢失的信息,因此即使它不再健全或不完整,也允许进行静态分析。

是否有任何类似的东西可用于将部分 C++ 代码转换为某种中间形式(例如 LLVM 字节码)?