Java 具有惰性评价的复杂结构翻译

Java 具有惰性评价的复杂结构翻译,java,compiler-construction,haskell,immutability,lazy-evaluation,Java,Compiler Construction,Haskell,Immutability,Lazy Evaluation,一些背景:我正在编写一个从高级到低级的通用编译器。在高级方面,它理解类、方法、字段、虚拟方法调用等;在低级方面,它理解函数、结构、数组等。前端将Java(主要关注点)和C#等语言的编译形式转换为我的IR。中间步骤将类、方法、字段和虚拟调用等降低为函数调用和结构。后端输出C、LLVM-IR(主要焦点)或潜在的其他 目前,类型(如整数、浮点、结构、类等)是(大部分)不可变的。类允许您添加字段和方法,因为它们不会更改类型(即类指针)。每个转换单元(“模块”)只有一种给定类型—结构、指针、数组和其他“派

一些背景:我正在编写一个从高级到低级的通用编译器。在高级方面,它理解类、方法、字段、虚拟方法调用等;在低级方面,它理解函数、结构、数组等。前端将Java(主要关注点)和C#等语言的编译形式转换为我的IR。中间步骤将类、方法、字段和虚拟调用等降低为函数调用和结构。后端输出C、LLVM-IR(主要焦点)或潜在的其他

目前,类型(如整数、浮点、结构、类等)是(大部分)不可变的。类允许您添加字段和方法,因为它们不会更改类型(即类指针)。每个转换单元(“模块”)只有一种给定类型—结构、指针、数组和其他“派生”类型。换句话说,类型具有结构等价性,比如LLVM,而不是名称等价性,比如C++。 我遇到的问题是将Java前端吐出的类类型实例转换为LLVM后端能够理解的StructType实例(带有vtable指针和类的所有字段),从而使系统在整个过程中保持一致的状态。其中一个困难是保持结构等价性-两个不同的类可能会被降低到同一个结构中,这必须在降低过程开始时检测到,或者在降低过程后纠正


这个冗长的解释引出了我的问题:像Haskell这样的惰性评估语言能提供一个方便的解决方案吗?如果是这样的话,如何将其翻译回Java,也许使用“承诺”模式?

我不确定您是否在寻找一个一般性的答案或更具体的答案,但听起来像

lower :: Eq b => a -> b
lower = undefined

generate :: Eq b => [a] -> [b]
generate xs = go $ map lower xs
    where go [] = []
          go (y:ys) = y : go (filter (not . (==y)) ys)

它以增量方式生成唯一的元素。增量方面只是由于懒惰的缺点,除非您也可以使Eq实例懒惰(例如,只比较某种结构哈希代码,这可能会让您跳过更昂贵的代码生成步骤)。

我忘记了在函数语言中,引用相等(=)和实际相等之间是如何没有区别的(.equals())。这个简单的事实使得函数式案例中的解决方案更加容易,而且在Java中的适用性更低。就Haskell中的某些人如何实现这一点而言,这是完美的。