问题标签 [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.
c# - 为什么具有 SecurityTransparent 属性的程序集会通过探查器导致检测代码抛出 VerificationException?
似乎当我使用OpenCover 检测程序集时,具有SecurityTransparent属性的程序集(以及似乎是 AllowPartiallyTrustedCallers)将引发 VerificationException。我想知道为什么会这样,以及是否有另一种解决方案来重新编译不包含这些属性的程序集,即条件编译,如下载的 MVC3 代码中所示(但奇怪的是,当我浏览codeplex 上的存储库)。请注意,如果没有这些程序集属性,则覆盖范围运行没有问题。
OpenCover 使用CALLI 指令将检测数据(序列点标识符)发送到分析器。似乎调用该指令的行为会导致异常发生;检测部分似乎很好,JIT 编译新的检测方法没有问题。插桩的行为不会引起问题,因为如果我删除所有插桩,而不是让 Tiny 方法变胖和小分支长,代码执行没有问题。
目前我正在使用 Mono.Cecil 检查通过“包含在覆盖范围内”过滤器的程序集并向用户报告问题,同时跳过检测然后继续,但我想知道是否有任何我可以在分析期间执行以避免此问题并避免重新编译。
所以总结两个问题“为什么会发生?” 和“我可以在不重新编译的情况下避免它吗?”
注意:PartCover 似乎也出现了这个问题,它使用不同的方法来记录访问点。
注意:我是 OpenCover(一个开源代码覆盖工具)的开发者,目前是 PartCover 的维护者。
c# - 接口作为类型约束和接口作为参数之间的区别?
如果我想创建一个将 的实例IList
作为参数的方法(或任何其他接口,但让我们IList
用作示例),我可以创建一个具有类型约束的泛型方法,例如:
或者,我可以创建一个直接采用IList
参数的方法:
出于所有意图和目的,这些方法的行为似乎完全相同:
所以这是我的问题——这两种方法有什么区别?第二种方法似乎更具可读性;是否还有其他我应该注意的差异(生成不同的 IL 等)?提前致谢。
c++ - 将 C++ 代码编译成汇编,然后反汇编
有谁知道如何将 C++ 代码转换为汇编代码然后反之?前进的方式很简单:
我想分析输出并查看它是否已正确编译(现在只是为了好奇,但它可以有一些应用程序)。但是,我的汇编知识非常有限,并且输出很难理解(如果我使用优化 (-O) 或使用调试信息 (-g) 编译,则尤其如此)。
是否有用于 C++ (GCC) 的反汇编器来生成 C++ 代码?如果没有,是否有任何中间表示可以让我将 C++ 代码编译成然后从其中返回?
似乎有一些方法可以在这里将 C++ 转换为C。海湾合作委员会对此有任何帮助吗?
c# - 发布的应用程序(windows 窗体)是机器码吗?
我知道,这个问题对许多人来说可能很常见,但我很困惑。我正在用 c# 阅读 .net。我浏览了很多文章和msdn。我的疑问是:
当我在 VS 中开发 C# Windows 窗体应用程序代码并运行它时,Project\bin\Debug\ 中扩展名为“.exe”的文件是中间代码还是机器代码?当我发布它时,我得到安装程序的那一刻,它是机器代码还是中间代码?因为有时安装程序需要安装 .net。
请帮助我理解这个概念。
谢谢你。
java - 逻辑表达式和中间代码生成
我设法获得了词法分析器、语法检查器和语义,现在我想继续生成中间代码。问题是我不知道如何处理逻辑表达式。我读了一些关于 E.true 和 E.false 的东西。这个例子无处不在,但我不明白。
例如,如果我有以下代码
结果必须是这样的
但是在您真正完成对 if 语句的解析之前,不知道跳转的标签。
所以我必须生成四边形,然后对它们进行回补。我怎样才能用这篇文章的语法来做到这一点?
有人可以解释一下它会怎么走,因为我真的很困惑。
c# - c# 编译器是否比 VB.NET 编译器更智能?
如果我查看在 Linqpad 中为以下两个代码片段创建的 IL,我想知道这里会发生什么。
在c#中
产生以下 IL 代码
而在VB中
这是
显然,c# 编译器理解该值从未使用过,因此根本不返回任何内容。在 VB.NET 中,实际代码被翻译。
这是由于编译器优化的差异还是有其他原因?
更新:只是为了澄清这一点-我只是将这一行输入到 LinqPad 中并查看它创建的 IL(最肯定是通过运行相应的编译器)。没有程序。
c# - C# 从 IL 中的静态方法调用并返回对象
这是对此处提供的解决方案的扩展。我创建了一个返回对象的静态方法。我的目标是为我在运行时定义的类型编写一个动态方法,以返回这个静态方法返回的对象。到目前为止我的代码:
更新后的代码现在调用该方法,但似乎传递的是动态创建的类型,而不是变量 returnType。
.net - .NET 中间语言是否具有堆栈操作功能?
可能是一个愚蠢的问题,但是 MSIL 是否具有类似 Forth 的通用函数来操作其堆栈上的数据?(例如,DUP、SWAP 等)
go - 对于实现函数式语言的虚拟机有哪些明显的优化?
我正在研究一种中间语言和一个虚拟机来运行一种具有几个“有问题”属性的功能语言:
- 词法命名空间(闭包)
- 动态增长的调用栈
- 一个慢整数类型(bignums)
中间语言是基于堆栈的,具有当前命名空间的简单哈希表。为了让您了解它的外观,这里是McCarthy91函数:
“大循环”很简单:
- 取指令
- 增加指令指针(或程序计数器)
- 评估指令
除了 之外sto
,rcl
还有更多函数调用指令:
call
复制命名空间(深拷贝)并将指令指针压入调用堆栈call-fast
是一样的,但只会创建一个浅拷贝tail
基本上是一个'goto'
实现非常简单。为了给你一个更好的主意,这里只是“大循环”中间的一个随机片段(更新,见下文)
问题是这样的:用 -10000 的值调用 McCarthy91 16 次,几乎没有区别,3 秒(在优化掉深层复制后,增加了近一秒)。
我的问题是:优化这种语言的解释有哪些常用技术?有没有低垂的果实?
我在列表中使用了切片(参数、各种堆栈、命名空间的映射切片......),所以我到处都在做这种事情:call_stack[:len(call_stack) - 1]
. 现在,我真的不知道是什么代码让这个程序变慢了。任何提示将不胜感激,尽管我主要是在寻找一般的优化策略。
在旁边:
通过规避我的调用约定,我可以大大减少执行时间。该list <n>
指令获取堆栈的 n 个参数并将它们的列表推回堆栈,该args
指令从该列表中弹出并将每个项目推回堆栈。这首先是检查是否使用正确数量的参数调用函数,其次是能够调用具有可变参数列表(即(defun f x:xs)
)的函数。删除它,并添加一个sto* <x>
替换的指令sto <x>; rcl <x>
,我可以将它缩短到 2 秒。仍然不聪明,无论如何我必须有这个list
/生意。args
:)
另一个问题(我知道这是一个很长的问题,抱歉):
用 pprof 分析程序告诉我的很少(我是 Go 新手,以防不明显):-)。这些是 pprof 报告的前 3 项:
这些是我到目前为止所做的更改:
- 我删除了哈希表。相反,我现在只传递指向数组的指针,并且只在需要时有效地复制本地范围。
- 我用整数操作码替换了指令名称。以前,我浪费了相当多的时间来比较字符串。
- 指令消失了(在
call-fast
其他更改之后加速不再可测量) - 我没有“int”、“float”和“str”指令,而是只有一个
eval
,我在编译时评估常量(即编译字节码)。然后eval
只是推送对它们的引用。 - 更改 的语义后
.if
,我可以摆脱这些伪函数。现在是.if
,.else
和.endif
, 隐式 goto 和块语义类似于.sub
. (一些示例代码)
在实现了词法分析器、解析器和字节码编译器之后,速度下降了一点,但不是很严重。计算 MC(-10000) 16 次使其在 1.2 秒内评估 420 万条字节码指令。这是它生成的代码示例(来自this)。
haskell - 了解 STG
GHC 的设计基于一种叫做 STG 的东西,它代表“spineless, tagless G-machine”。
现在 G-machine 显然是“graph reduction machine”的缩写,它定义了如何实现惰性。未求值的 thunk 存储为表达式树,执行程序需要将它们缩减为正常形式。(树是无环图,但 Haskell 的普遍递归意味着 Haskell 表达式形成一般图,因此是图归约而不是树归约。)
不太清楚的是术语“spineless”和“tagless”。
我认为“spineless”是指功能应用程序没有功能应用程序节点的“spine”。相反,您有一个对象来命名被调用的函数并指向其所有参数。那是对的吗?
我认为“无标记”指的是没有用构造函数 ID“标记”的构造函数节点,而是使用跳转指令解析大小写表达式。但现在我不确定这是否正确。相反,它似乎指的是节点没有用它们的评估状态标记的事实。谁能澄清这些解释中哪一个(如果有的话)是正确的?