使用 GHC API 编译优化程序
Using GHC API to compile a program with optimisation
我想将 Haskell 模块编译为 GHC 核心,应用优化,并使用生成的核心输出。但是,当我使用 compileToCoreSimplified
时,它似乎并没有 运行 所有正常的优化。参加节目:
{-# OPTIONS_GHC -O2 #-}
module LensOpt(pick) where
import Control.Lens
data Record = Record {_field :: String}
field = lens _field $ \r x -> r{_field=x}
pick = Record "test" ^. field
当 运行 到 ghc -ddump-simple
时,我得到最佳输出:
LensOpt.pick1 :: GHC.Prim.Addr#
LensOpt.pick1 = "test"#
pick :: String
pick = GHC.CString.unpackCString# LensOpt.pick1
但是,当使用 compileToCoreSimplified
编译时,我得到输出:
s1 :: Addr#
s1 = "test"#
s2 :: [Char]
s2 = unpackCString# s1
s3 :: Record
s3 = Record s2
pick :: String
pick = case s3 of { Record ds -> ds }
我正在调用 compileToCoreSimplified
:
import GHC
import GhcPlugins
import GHC.Paths
main = runGhc (Just libdir) $ do
setTargets []
dflags <- getSessionDynFlags
setSessionDynFlags dflags{hscTarget = HscNothing}
res <- compileToCoreSimplified "LensOpt.hs"
liftIO $ writeFile "lens_api.txt" $ showSDoc dflags $ ppr res
如何驱动 GHC API 以应用完全优化?
您需要在 DynFlags
中启用您想要 运行 的优化。
您可以通过指定优化级别 (0..2) 并基于该级别设置优化来做到这一点 (updOptLevel
), or by turning on individual optimizations such as Opt_Specialise
:
main = runGhc (Just libdir) $ do
setTargets []
dflags <- getSessionDynFlags
setSessionDynFlags $ updOptLevel 2 $ dflags{hscTarget = HscNothing}
我想将 Haskell 模块编译为 GHC 核心,应用优化,并使用生成的核心输出。但是,当我使用 compileToCoreSimplified
时,它似乎并没有 运行 所有正常的优化。参加节目:
{-# OPTIONS_GHC -O2 #-}
module LensOpt(pick) where
import Control.Lens
data Record = Record {_field :: String}
field = lens _field $ \r x -> r{_field=x}
pick = Record "test" ^. field
当 运行 到 ghc -ddump-simple
时,我得到最佳输出:
LensOpt.pick1 :: GHC.Prim.Addr#
LensOpt.pick1 = "test"#
pick :: String
pick = GHC.CString.unpackCString# LensOpt.pick1
但是,当使用 compileToCoreSimplified
编译时,我得到输出:
s1 :: Addr#
s1 = "test"#
s2 :: [Char]
s2 = unpackCString# s1
s3 :: Record
s3 = Record s2
pick :: String
pick = case s3 of { Record ds -> ds }
我正在调用 compileToCoreSimplified
:
import GHC
import GhcPlugins
import GHC.Paths
main = runGhc (Just libdir) $ do
setTargets []
dflags <- getSessionDynFlags
setSessionDynFlags dflags{hscTarget = HscNothing}
res <- compileToCoreSimplified "LensOpt.hs"
liftIO $ writeFile "lens_api.txt" $ showSDoc dflags $ ppr res
如何驱动 GHC API 以应用完全优化?
您需要在 DynFlags
中启用您想要 运行 的优化。
您可以通过指定优化级别 (0..2) 并基于该级别设置优化来做到这一点 (updOptLevel
), or by turning on individual optimizations such as Opt_Specialise
:
main = runGhc (Just libdir) $ do
setTargets []
dflags <- getSessionDynFlags
setSessionDynFlags $ updOptLevel 2 $ dflags{hscTarget = HscNothing}