首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用GHC API将Haskell源代码编译为CORE,并将CORE编译为二进制

使用GHC API将Haskell源代码编译为CORE,并将CORE编译为二进制
EN

Stack Overflow用户
提问于 2015-01-21 12:34:11
回答 2查看 979关注 0票数 20

Idea

你好!我想创建一个程序,这将生成Haskell核心,并将使用GHC API来进一步编译成一个可执行文件。但在我开始之前,我想构建一个非常基本的示例,展示如何将Haskell源代码编译成核心,然后再编译成二进制文件。

The problem

我已经阅读了大量的文档,并尝试了GHC Api的许多方法,但目前还没有成功。我从Official GHC Api introduction开始,并成功地编译了示例。这些示例显示了以下函数的用法:parseModuletypecheckModuledesugarModulegetNamesInScopegetModuleGraph,但没有涵盖最后的编译步骤。另一方面,api中有一些函数,其名称看起来与问题相关,如HscMain.{hscCompileOneShot, hscCompileBatch}GHC.{compileToCoreModule, compileCoreToObj}。我尝试使用它们,但得到了运行时错误,如下例所示:

import GHC
import GHC.Paths ( libdir )
import DynFlags
targetFile = "Test.hs"

main :: IO ()
main = do
   res <- example
   return ()

example = 
    defaultErrorHandler defaultFatalMessager defaultFlushOut $ do
      runGhc (Just libdir) $ do
        dflags <- getSessionDynFlags
        let dflags' = foldl xopt_set dflags
                            [Opt_Cpp, Opt_ImplicitPrelude, Opt_MagicHash]
        setSessionDynFlags dflags'
        coreMod <- compileToCoreModule targetFile
        compileCoreToObj False coreMod "foo" "bar"
        return () 

它可以用ghc -package ghc Main.hs编译,并在运行时导致以下错误:

Main: panic! (the 'impossible' happened)
  (GHC version 7.8.3 for x86_64-unknown-linux):
    expectJust mkStubPaths

另一个令人担忧的事情是文档中compileCoreToObj函数旁边的注释:

...到目前为止,这只是用一个自包含的模块进行了测试。

但我希望它不会带来任何进一步的问题。

question

创建此解决方案的最佳方法是什么?中间步骤是由自定义核心进一步替换所需的。

作为一个次要问题-目前是否可以为GHC提供外部核心文件,或者此功能尚未实现,我将不得不使用GHC.Api手动构建核心(相关:Compiling to GHC Core)

更新

我终于能够创建一个小示例,允许加载模块并将其编译为.hi.o文件。这不是问题的解决方案,因为它不允许我替换核心,并且它还没有将目标文件链接到可执行文件中:

import GHC
import GHC.Paths ( libdir )
import DynFlags
import Linker
import Module
targetFile = "Test.hs"

main :: IO ()
main = do
   res <- example
   return ()

example = 
    defaultErrorHandler defaultFatalMessager defaultFlushOut $ do
      runGhc (Just libdir) $ do
        dflags <- getSessionDynFlags
        let dflags2 = dflags { ghcLink   = LinkBinary
                             , hscTarget = HscAsm
                             }
        let dflags' = foldl xopt_set dflags2
                            [Opt_Cpp, Opt_ImplicitPrelude, Opt_MagicHash]
        setSessionDynFlags dflags'
        setTargets =<< sequence [guessTarget "Test.hs" Nothing]

        load LoadAllTargets
        return ()
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28059669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档