Haskell GHC是否支持无GC编程?

Haskell GHC是否支持无GC编程?,haskell,garbage-collection,ghc,Haskell,Garbage Collection,Ghc,使用-S选项和一个简单的程序: main = do print "Hello" main 我可以看到它会产生一些垃圾: [...] 1024232 4904 45992 0.000 0.000 0.428 0.530 0 0 (Gen: 1) 0 0.000 0.000 1,242,080,056 bytes allocated in the heap

使用
-S
选项和一个简单的程序:

main = do
   print "Hello"
   main
我可以看到它会产生一些垃圾:

[...]
  1024232      4904     45992  0.000  0.000    0.428    0.530    0    0  (Gen:  1)
        0                      0.000  0.000

   1,242,080,056 bytes allocated in the heap
         271,656 bytes copied during GC
[...] 
但删除
print
后,它显然没有。是否有一个无alloc的核心库子集可用于编写无GC程序


编辑:最近也有关于线性类型的工作,似乎有可能启用这种功能。

您偶尔可以生成执行很少或没有垃圾收集的小程序。例如,以下程序:

main = print $ sum [(1::Int)..1000000000]
import Control.Monad
import qualified Data.Vector.Unboxed.Mutable as V

main :: IO ()
main = do
  v <- V.new 1000000
  forM_ [0..999999] $ \i -> do
    V.write v i i
  replicateM_ 999 $
    forM_ [0..499999] $ \i -> do
      V.swap v i (999999 - i)
  print =<< V.read v 123
如果使用
-O2
编译,则应在不分配太多或执行任何值得一提的GC的情况下运行

但是,这通常仅限于那些可以编译成具有“unbox”数据类型(在本例中为unbox
Int
值)且没有代数数据结构(在本例中,该列表已不存在)的紧循环的程序。有一组有限的更复杂的数据结构(例如,未装箱的
向量
s)也可以在不分配的情况下进行操作,如果您非常小心,您可能能够编写在此类结构上运行的算法,而无需分配太多

例如,以下程序:

main = print $ sum [(1::Int)..1000000000]
import Control.Monad
import qualified Data.Vector.Unboxed.Mutable as V

main :: IO ()
main = do
  v <- V.new 1000000
  forM_ [0..999999] $ \i -> do
    V.write v i i
  replicateM_ 999 $
    forM_ [0..499999] $ \i -> do
      V.swap v i (999999 - i)
  print =<< V.read v 123
import-Control.Monad
将限定的Data.Vector.unbox.Mutable导入为V
main::IO()
main=do
v do
写
复制项目uu999$
表格[0..499999]$\i->do
V.swap V i(999999-i)

print=我相信唯一诚实的答案是否定的,你不能在Haskell中写任何非平凡的东西而不引起GC。不过,您现在可以拥有,即内存中的区域将没有GC。