问题标签 [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# - 就伪代码而言,MIL 中的 IAsyncStateMachine 中的 MoveNext 是做什么的?
我试图了解使用async
-时创建的状态机await
。我采用了一段简单的 C# 代码
并使用 Roslyn 获得反编译的 IL
我想了解的是该MoveNext()
方法的工作原理。我假设这是检查底层操作是否完成的地方。有人可以将其翻译成伪代码吗?
c# - 泛型的占位符是否编译为实际数据类型?
我的问题与泛型(在 C# 中)的编译方式有关。
代码示例
问题
- 中的
Foo
类型MyMethod
会被编译为具体类型吗?我想不会,因为这需要创建同一个类的多个版本(是否应该用不同的类型实例化),所以我想一个泛型类型得到了适当的支持,而不仅仅是语法糖? - 在低层次上,泛型是如何实现的?针对类/方法的通用值是否存储为特殊隐藏字段?
我认为我的假设是不正确的,但我试图了解幕后的内部运作。
更新
如果我正确理解这篇文章,IL 中的一个新类是在运行时使用具体类型创建的。
因此,运行时会生成另一个版本的泛型类型,并在 MSIL 中的适当位置替换 long。不再需要转换,因为每个专门的泛型类本身都包含值类型。
compiler-construction - 如何在三地址代码中用类似 C 的语言表示结构?
声明结构的 C 代码片段的三地址代码 IR 是什么?
optimization - 在 llvm 中添加 InstNamer pass 作为必需的 pass
我正在 llvm 中执行优化,需要在优化之前运行 InstNamer 通行证。目前,我通过手动将“-instnamer”传递给 opt 来运行它。有没有办法可以将 InstNamer 添加为代码中的必填项?
我试着做 AU.addRequired();
但这不会编译,因为它会抛出“未声明的标识符'InstNamer'”。
有没有办法我可以做到这一点?
matlab - MATLAB 和 GNU Octave 是否使用中间表示?
MATLAB 和 GNU Octave 解释器是否像旧意义上的解释器一样工作?他们是解析每一行,将其翻译成机器代码并执行,还是先将整个代码翻译成中间表示(如 Python 字节码、perl AST 等),然后再解释 IR。
对于 GNU Octave 和 MATLAB,使用字节码或中间表示来提高效率似乎很合理(不仅仅是为了混淆)。
scala - 清理阶段后的 Scala 编译器输出
一旦Scala编译器完成了所有繁重的工作,我想开发一个工具来对Scala程序进行后处理。据我了解,Scala 编译器的不同阶段在语法糖和 lambda、闭包、模式匹配等高级功能方面逐步简化程序。但是,我注意到所谓的清理阶段产生的结果 -这是代码生成之前的最后一个阶段 - 看起来像 scala,但它不是真正的 scala。
有谁亲自认识或可以向我指出可以帮助我理解清理阶段产生的语言的资源?
举个例子,在清理阶段的输出中,我看到如下内容:
我的假设是,这是翻译模式匹配的结果,但据我所知,它看起来不像有效的 scala 语法(我根本不是一个有经验的 Scala 开发人员!)。
我想这一切都归结为:是否可以将清理阶段的输出转换为一般的有效-可编译-scala代码?
scala - 从外部工具使用 Scala 语法树
我想开发一个使用 scala 语法树的工具(如标题所示)。更具体地说,如果我可以在每个编译阶段之后使用这些树,那就太好了。
我的研究使我找到了 Dotty 的 TASTY 交换格式,这似乎正是我所寻找的。也许是的。但是,我无法在网上找到足够的文档来弄清楚如何提取和使用它。
我还查看了 dotc 编译器标志,但找不到明显的方法。我注意到选项:“-print-tasty”,但我无法验证预期的输出,或者我错过了什么?
当然,我总是可以在每个阶段之后使用 scala 打印机(即 -Yshow-trees 等)打印 AST。这是我唯一的选择吗?如果是,那很好。
理想情况下,如果您愿意的话,如果我能以更“机器友好”的格式使用 AST,那就太好了。TASTY 似乎是我理论上想要的,即 AST 的序列化,但我不确定如何在每个阶段之后提取它。
如果我的问题太琐碎或已经解决,我深表歉意。任何反馈将不胜感激!谢谢 !
PS:如果 AST 以 JSON 格式编码会怎样?像这样的 scala 工具是否有意义(即,将 Scala AST 转换为 JSON 并返回的工具)?
c# - 空传播算子的性能与编译
这特指我要重写的一些 C# 属性。
原始属性之一的示例:
这将更改为:
注1: MaintenanceRequestPart
可以为空
注2: MaintenanceRequestPart.ReportedQuantity
是一个可以为空的双精度
这会保存或添加一些操作/分支/开销吗?我很好奇是什么?。运算符一旦变成中间语言,实际上就会在幕后翻译。
algorithm - 自动将代码从一种表示形式转换为另一种表示形式?
有没有办法将代码从一种高级表示转换为另一种?例如,在 Javascript 中,一种流行的维护状态的方法是使用名为 Redux 的第三方库。另一方面,VueJS 有自己的 Redux 版本,有点相似但又有所不同。有没有办法在两种表示之间自动转换?
我怀疑可能有一种使用 AST 的方法;然而,至少在 JS 中,AST 似乎擅长低级转换,例如:const x = 2*4
到const x = 8
. 然而(同样,至少对于 JS 而言),像我上面描述的那样进行更高级别的转换似乎很痛苦。
如果没有现成的解决方案,最先进的技术是什么(即当前的研究论文等)?
c# - 同一文件夹中的 C# 单元测试和代码:从已编译的二进制文件中剥离测试
我已阅读您是否将单元测试放在同一个项目或另一个项目中的答案?当时(大约 10 年前)的共识是将单元测试与他们正在测试的代码放在一个单独的项目中。给出的主要原因是避免部署非生产代码,这是相当合理的。
从那以后事情发生了很大的变化,至少对于基于 JavaScript 的项目来说,将我们的测试放在代码旁边是常态,而且实际上大多数人认为这是非常可取的。但我不会在这里讨论优势,因为这不是这个问题的意义所在。
假设我们想为 C# 做同样的事情,但仍然避免将测试代码部署到 prod,我们可以在 IL 级别编织一些编译后的魔法,以作为构建过程的一部分从二进制文件中剥离测试吗?例如,我们可以从具有该[TestFixture]
属性的二进制文件中搜索并销毁所有类吗?
我们可以利用 Roslyn 的某些特性来实现同样的目标吗?
或者,我们可以采取其他方法吗?