问题标签 [cil]
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.
java - 虚拟机优化
我正在使用Java 中的玩具解释器,我正在考虑尝试编写一个可以为 Java 虚拟机生成字节码的简单编译器。这让我想到,针对 JVM 和 CLI 等虚拟机的编译器需要做多少优化?
即时 (JIT) 编译器是否进行常量折叠、窥孔优化等?
.net - 学习 CIL
有没有人知道任何好的资源来学习如何使用命令的深入描述等来编程 CIL?我环顾四周,但没有发现任何特别好的东西。
.net - 使用 DLR 进行(主要)静态语言编译
我正在构建一个面向 .NET 的编译器,并且我之前直接生成了 CIL,但是生成 DLR 树将使我的生活变得更加轻松。我支持一些动态特性,即运行时函数创建和鸭式,但绝大多数代码是完全静态的。
既然已经解释了,我有以下问题:
- 除了 MSDN 博客上的小示例之外,DLR 是否已用于静态编译?
- 如果是这样,实现了什么样的性能?
- 如果没有,有什么从根本上阻止这种情况吗?
- 有没有比使用 DLR 或直接发出 IL 更好的代码生成机制?
对此的任何见解或对博客/代码/谈话的引用将不胜感激。
cil - 是否可以在堆栈上间接加载值类型
在 Microsoft IL 中,要调用值类型的方法,您需要间接引用。假设我们有一个名为“il”的 ILGenerator,并且当前我们在堆栈顶部有一个 Nullable,如果我们想检查它是否有值,那么我们可以发出以下内容:
但是,最好跳过将其保存为局部变量,而只需在堆栈上已经存在的变量地址上调用该方法,例如:
ldind 指令系列看起来很有希望(尤其是 ldind_ref),但我找不到足够的文档来知道这是否会导致值的装箱,我怀疑它可能会。
我看过 C# 编译器的输出,但它使用局部变量来实现这一点,这让我相信第一种方法可能是唯一的方法。有人有更好的想法吗?
****编辑:附加说明****
尝试直接调用该方法,如以下程序中注释掉的行,不起作用(错误将是“操作可能破坏运行时”)。取消注释这些行,您会看到它确实按预期工作,返回“True”。
因此,您不能简单地使用堆栈上的值调用方法,因为它是值类型(尽管如果它是引用类型,则可以)。
我想要实现(或知道是否可能)是替换显示注释掉的三行,但保持程序正常工作,而不使用临时本地。
.net - 有没有办法将 C++ 代码编译为 Microsoft .Net CIL(字节码)?
即,Web 浏览器客户端将用 C++ 编写!!!
java - MSIL 和 Java 字节码的区别?
我是 .Net 的新手,我试图先了解基础知识。MSIL 和 Java 字节码有什么区别?
.net - VB.NET 可选参数如何“在幕后”工作?它们是否符合 CLS 标准?
假设我们有以下方法声明:
VB.NET 如何使可选参数在 CLR 范围内工作?可选参数是否符合 CLS?
.net - 修改现有的 .NET 程序集
有没有办法修改现有的 .NET 程序集而不求助于 3rd 方工具?我知道PostSharp使这成为可能,但我发现 PostSharp 的开发人员基本上必须重写整个System.Reflection
命名空间的功能才能使现有程序集可修改,这非常浪费。
System.Reflection.Emit
只允许创建新的动态程序集。但是,这里使用的所有构建器类都继承自基本反射类(例如TypeBuilder
,继承自System.Type
)。不幸的是,似乎没有办法将现有的、动态加载的类型强制到类型构建器中。至少,没有官方支持的方式。
那么不支持怎么办?有谁知道允许将现有程序集或类型加载到此类构建器类中的后门?
请注意,我不是在寻找修改当前程序集的方法(这甚至可能是一个不合理的请求),而只是为了修改从光盘加载的现有程序集。我担心没有这样的事情,但我还是想问一下。
在最坏的情况下,人们不得不求助于ildasm.exe
反汇编代码然后ilasm.exe
重新组装,但是.NET 中没有包含工具链(阅读:IL 阅读器)来处理 IL 数据(或者是否存在?)。
/编辑:
我没有具体的用例。我只是对通用解决方案感兴趣,因为修补现有程序集是一项非常常见的任务。以混淆器、分析器或 AOP 库为例(是的,后者可以以不同的方式实现)。正如我所说,被迫在System.Reflection
.
@楔:
你是对的。但是,这里没有特定的用例。我已经修改了原始问题以反映这一点。另一个问题引发了我的兴趣,提问者想知道如何在每个方法的末尾注入指令pop
,ret
以防止 Lutz Roeder 的 Reflector 重新设计(VB 或 C#)源代码。
现在,这个场景可以通过许多工具来实现,例如上面提到的 PostSharp 和用于 Reflector 的Reflexil插件,而后者又使用Cecil库。
总而言之,我只是对 .NET 框架不满意。
@乔尔:
是的,我知道这个限制。无论如何,感谢您指出它,因为它很重要。
@马克思达德:
这似乎是唯一可行的方法。但是,这意味着您仍然必须使用构建器类重新创建完整的程序集,对吗?即,您必须手动遍历整个组件。
嗯,我会调查的。
.net - 是否有在 CLR 上运行的 CLR?
我想知道是否有使用 CLI(公共语言基础结构)实现的与 .NET 兼容的 CLR,例如,使用 .NET 本身,或者至少是否有任何资源可以帮助构建一个。
基本上,类似于 .NET 程序将程序集作为 MemoryStreams 加载、解析字节码、构造类型并执行指令。或者,它可以使用 Reflection.Emit 或然而 JIT 编译为标准 IL。
我不想编译由原始 CLR 运行的 .NET 语言。我想要一个用 .NET 语言(不是通常的非托管 C++ 或 C)编写并运行CIL 的 CLR。如果操作正确,它应该能够自行运行。
对使用 Mono.Cecil 做这种事情有什么想法吗?
c# - 学习 CIL (MSIL) 的最佳资源是什么
我是一名 C# 3 / .NET 3.5 专家,希望开始使用 System.Reflection.Emit.DynamicMethod 进行一些运行时代码生成。我很想通过熟悉 IL 来更上一层楼。
任何指针(双关语)?