58得票1回答
类型化中间语言的实用语义学

编译器的一个趋势是使用类型化中间语言。Haskell的ghc使用其core中间语言(System F-omega的变体)作为该架构的实例[1]。另一个例子是LLVM,其核心是一种类型化的中间语言[2]。采用这种方法的好处在于可以早期检测代码生成器中组成部分的转换中的错误。此外,在优化和代码生成...

52得票4回答
理解STG

GHC的设计基于STG,STG代表"无脊椎,无标记G机"。 G机是“图缩减机”的简称,它定义了如何实现惰性执行。未求值的推迟(thunk)被存储为表达式树,执行程序需要将其归约(reducing)到正常形式。(树是无环图,但Haskell的广泛递归意味着Haskell表达式形成一般图(gra...

30得票3回答
.NET IL的.maxstack指令是如何工作的?

我想了解 .maxstack 到底是如何工作的。我知道它与你声明的类型的实际大小无关,而与数量有关。 我的问题是: 这仅适用于函数本身还是所有调用的函数都适用? 即使只是在声明 .maxstack 的函数中,如果有分支,您如何知道 maxstack 是多少? 您会查看所有“路径”并返回可能...

28得票7回答
18得票4回答
为什么.NET IL代码很容易被反编译?

为什么与反编译本地x86二进制文件相比,将.NET IL代码反编译为源代码非常容易?(大多数情况下,Reflector会生成相当不错的源代码,而反编译C ++编译器输出的结果几乎是不可能的。)是因为IL包含了许多元数据吗?还是因为IL是比x86指令更高层抽象的语言?我进行了一些研究,并找到了以...

17得票3回答
有一种二进制的SVG吗?

对于我来说,当编写动态数据可视化的代码时,我似乎总是在不同的语言/平台上重复做同样的事情。如果我有一种跨平台语言(我确实有),以及类似于SVG的二进制版本,我可以让我的代码针对它,并使用/创建解释器,以便在当前需要使用它的任何平台上使用。 我不想使用SVG的原因是因为其中的明文部分使其对我的...

14得票5回答
接口作为类型约束和接口作为参数的区别是什么?

如果我想创建一个以IList实例作为参数的方法(或任何其他接口,但让我们以IList为例),我可以创建一个带有类型约束的通用方法,例如: public static void Foo1<T>(T list) where T : IList { } 或者,我可以创建一个直接接...

13得票5回答
C# 6自动初始化属性和后备字段的使用

C# 6之前,属性的初始化不使用后备字段来初始化默认值。在C#6中,它使用后备字段通过新的自动初始化属性进行初始化。我很好奇为什么在C#6之前,IL使用属性定义来进行初始化。这是有特定原因吗?还是在C#6之前没有正确实现?C# 6.0之前public class PropertyInitial...

12得票6回答
制作一门语言,需要一个好的后端。

我想制作一种编译语言,目前正在评估后端。到目前为止,我正在研究C语言,因为它具有执行速度快、编译快和一个小巧易用的编译器TCC。 在阅读了这里关于将其用作中间语言的讨论后,我正在思考如何使其与垃圾回收和处理异常兼容。目前,我认为我可以解决这两个问题,但开销很大。 以下是我对其他可能后端的一...

12得票2回答
实现函数式语言的虚拟机有哪些明显的优化方法?

我正在开发一种中间语言和虚拟机,用于运行一个具有一些"棘手"特性的函数式语言: 词法命名空间(闭包) 动态增长的调用栈 缓慢的整型(大数) 这个中间语言是基于栈的,使用一个简单的哈希表来存储当前命名空间。为了让你了解它是什么样子,这里有一个麦卡锡91函数的例子:# McCarthy 9...