问题标签 [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 投票
2 回答
330 浏览

.net - In .NET, is the call stack inextricably tied to a thread?

Is it at all possible in the middle of a function execution to set a pointer to the current stack (to be picked up later) and then release the current thread (without unwinding the call stack) and give it back to the thread pool? And then, have another thread pick up where that thread left off? I know it would mean that someone calling into the function would not know that the current thread context would have changed, and it would probably involve writing some custom IL code to do something like this, but is there ANY way to do this?

0 投票
4 回答
5346 浏览

.net - 为什么反编译 .NET IL 代码这么容易?

与反编译本机 x86 二进制文件相比,为什么将 .NET IL 代码反编译为源代码如此容易?(Reflector 大部分时间都产生了相当不错的源代码,而反编译 C++ 编译器的输出几乎是不可能的。)

是因为 IL 包含很多元数据吗?还是因为 IL 是比 x86 指令更高的抽象?我做了一些研究,发现了以下两篇有用的文章,但它们都没有回答我的问题。

0 投票
6 回答
5186 浏览

compiler-construction - 制作一门语言,需要一个好的后端

我想做一种编译语言。我目前正在评估后端。到目前为止,我关注 C 是因为它的执行速度、编译速度和一个名为 TCC 的小型、易于使用的编译器。

阅读了此处关于将其用作中间语言的讨论后,我正在尝试考虑如何使其与垃圾收集兼容并处理异常。到目前为止,我认为我可以同时解决这两个问题,但开销很大。

以下是我对其他可能的后端的一些想法:

  1. 组装:不便携,编程非常痛苦。
  2. .NET:感觉真的很慢。5 秒启动,5 秒评估 Ironpython 和 Boo 上的 1+2。没有大型库就无法运行。
  3. JVM:感觉有点慢。无法访问二进制库。没有大型库就无法运行。
  4. LLVM:不支持 Windows。我听说编译后的可执行文件大小是 16 mb+
  5. C--:看起来不发达。
  6. C++:可能。找不到我可以捆绑的漂亮的小免费。

你们中的任何人都可以改变我的想法或有更多内容要添加到此列表中吗?

编辑

我最近一直在尝试 LLVM。我发现他们已经预编译了二进制文件,并且可以编译为本机程序集。

http://www.antlr.org/wiki/display/CS652/Generating+machine+executable+binaries+with+LLVM

以下是步骤:

  1. 在 LLVM 程序集上运行 llvm-as,这会产生一个 LLVM 字节码文件。
  2. 在 LLVM 字节码文件上运行 llc 以生成汇编文件。
  3. 对汇编文件运行汇编程序以生成目标文件。(或运行似乎依赖于外部安装的 c 编译器的 llvm-ld)
  4. 使用 gcc 等编译为可执行文件。
0 投票
4 回答
2168 浏览

c# - 哪些工具执行 IL 的编译后修改?

最近提到 PostSharp 让我想起了这一点:

去年我工作的地方,我们正在考虑使用 PostSharp 将检测注入我们的代码。这是在 Team Foundation Server 团队构建/持续集成环境中。

考虑到这一点,我对 PostSharp 的运行方式产生了一种烦人的感觉——它编辑了编译器生成的 IL。这让我有点困扰。

我不太担心 PostSharp 不能正确完成它的工作。我担心这是我第一次记得听说过这样的工具。我担心其他工具可能不会考虑到这一点。

事实上,随着我们的前进,我们确实遇到了一些问题,因为 PostSharp 对原始 IL 所在的文件夹感到困惑。这破坏了我们的构建。这似乎是由于与解决项目引用的 MSBUILD 目标发生冲突。冲突似乎是由于 PostSharp 使用临时目录来存储 IL 的未修改版本这一事实。

无论如何,当时我没有 StackOverflow 可以参考!现在我知道了,我想问你们大家是否知道在构建过程中编辑 IL 的任何其他工具;或者微软是否在 Visual Studio、MSBUILD、Team Build 等中考虑了这种工具。


更新:感谢您的回答。

底线似乎是,至少在 VS 2010 中,微软确实应该意识到这种事情可能会发生。所以如果VS2010在这方面出现问题,那么微软可能会分担责任。

0 投票
1 回答
787 浏览

oracle - PL/SQL 是否执行尾调用优化?

我对这种语言相当陌生,我想知道尾调用是否得到了优化。在其他语言中,我可以检查机器代码或中间表示并自己计算出来,但我不知道如何在 PL/SQL 中做到这一点。

提前致谢。

0 投票
2 回答
6638 浏览

.net - .NET 如何以及何时实际编译代码?

假设你用 C#、VB 和 .NET 编写了一个应用程序。当你点击构建时,它真的编译了你的代码吗?我是这么认为的,直到我开始在我的一些程序集中使用 redgates 反射器并逐字查看我的代码。我本来希望循环展开并进行其他过多的优化,而不是什么都没有。

那么编译实际发生在什么时候呢?我认为当它被构建时,代码变成 IL(中间语言)并且当执行发生时,它正在加载到 CLR 中?它是否仅在 CLR 期间进行优化,而不是在构建时进行优化?

0 投票
3 回答
6907 浏览

c# - .NET IL .maxstack 指令如何工作?

我想知道 .maxstack 是如何工作的。我知道这与您声明的类型的实际大小无关,而是与它们的数量有关。我的问题是:

  1. 这仅适用于函数,还是适用于我们调用的所有函数?
  2. 即使它只是用于声明 .maxstack 的函数,如果你有分支,你怎么知道 maxstack 是什么?您去查看所有“路径”并返回可能的最大值吗?
  3. 如果我将它设置为 16 并且实际上有 17 个变量会发生什么?
  4. 如果我将其设置为 256,是否会有太大的惩罚?
0 投票
4 回答
321 浏览

c# - 如果我们在 IL 代码中添加行并在程序中添加断点会发生什么?

如果我在方法的开头添加 1 行,如果我在第一行通过 Visual Studio 设置断点,它将指向第一行还是第二行?如果它会标记错误的行,在编辑 .exe 文件时我们可以做些什么来确保以后进行常规调试会话?

有没有类似将线x设置为Y的东西?我记得在某处看到过类似的东西,不确定.NET 是否相关。

0 投票
2 回答
441 浏览

.net - IL(中级语言)入门

任何人都可以建议任何好的资源来开始使用 IL。具体来说,如果有人知道任何好书或截屏视频,我将不胜感激。

0 投票
2 回答
216 浏览

context-free-grammar - 将 CFG 转换为 IL

我从任意 IL 构建 CFG,并希望将该 CFG 转换回 IL。CFG中的顶点顺序当然不等于原始IL指令的顺序。

这很好,但会使一些事情过于复杂。想象:

这将导致这样的流程图: (Jump B) -> (Jump C) -> (Return) 这当然是一个简化的示例,但它显示了转换出 CFG 时的问题。

学术界有没有关于这个话题的信息?我认为自下而上遍历图表会非常优雅,但这在更复杂的情况下不起作用。

一个解决方案可能是自上而下搜索 CF 合并,但在这种情况下,我将无法正确处理循环。因此,获得此权利的唯一方法似乎是搜索可能的 CF 合并(如果发生)。如果没有,我们必须有一个循环,这意味着循环是首选的,并且随后会评估持续的路径。这听起来像是一个可以解决的问题,但它也非常昂贵,并且可能存在更优雅的问题解决方案。此外,在考虑“break”语句时,循环也可能导致 CF 合并。