【问题标题】:How to ship an executable with Language.Haskell.Interpreter?如何使用 Language.Haskell.Interpreter 发布可执行文件?
【发布时间】:2015-03-28 02:29:30
【问题描述】:

我希望使用hint 嵌入一个 Haskell 解释器,这样我就可以在 Haskell 中编写插件来与我的程序一起使用。我不想为我的可执行文件提供整个 Haskell 平台。

通常,Haskell 可执行文件是相当独立的。例如,删除PATH 不会导致问题:

$ PATH=. Hello
Hello world

但是,如果我删除PATH,使用runInterpreter 的简单测试程序会爆炸:

$ PATH=. TryHint
GhcException "panic! (the 'impossible' happened)\n  (GHC version 7.8.3 for x86_64-apple-darwin):\n\tDynamic linker not initialised\n\nPlease report this as a GHC bug:  http://www.haskell.org/ghc/reportabug\n"

环境中必须有哪些库或可执行文件才能工作?

otool 没有给出太多指导:

otool -L TryHint
TryHint:
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)
    /usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)
    /usr/local/lib/libgmp.10.dylib (compatibility version 13.0.0, current version 13.0.0)

TryHint 的测试代码做的不多:

import Control.Monad
import Language.Haskell.Interpreter

main = do
  f <- runInterpreter $ loadModules ["Test"] >> setTopLevelModules ["Test"] >> interpret "f" (as :: Int -> Int)
  case f of
    Left e -> print e
    Right r -> mapM_ (print . r) [1..10]

它只是将f 绑定到Test.hs 中的一个函数,以便在运行时进行解释。 Test.hs 看起来像这样:

module Test where
f :: Int -> Int
f x = x + 1

【问题讨论】:

  • 我无法重现此问题。当我运行PATH= ./TryHint 时,一切都很顺利:它会打印一些数字,然后退出。我也在使用 GHC 7.8.3。您如何构建TryHint
  • 我也相信它可能是特定于 OSX 的。您可能想在 GHC 的 tracker 处开票,如错误消息中所述(毕竟,不可能的确实刚刚发生)。
  • 我不知道这个错误是怎么回事,但无论如何,GHC 依赖于很多资源,你没有用PATH=. 隐藏它,例如 Prelude 的接口文件以及它传递导入的所有内容,base 和 ghc-prim 和 integer-gmp 的实际库文件,以及 GHC settings 文件。 (基本上,所有东西都安装在/usr/lib/ghc 或您安装的等效目录下。)
  • @MichaelFox 静态链接 GHC API 不适用于 GHC 7.8 中引入的新动态链接器,我认为:| (交互式代码执行现在需要动态库)
  • @bennofs 如果您稍微改写一下,您的评论似乎几乎是一个答案!

标签: haskell packaging shipping


【解决方案1】:

使用Language.Haskell.Interpreter 发送可执行文件似乎与您展示的方式完美。您必须将 PATH 设置为您要执行的脚本。

另外,正如 @bennofs 在 cmets 中提到的那样,静态链接 GHC API 不适用于 GHC 7.8 中引入的新动态链接器(交互式代码执行现在需要动态库)。

【讨论】:

    猜你喜欢
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    • 2021-10-07
    • 1970-01-01
    • 2019-04-19
    • 2011-11-16
    相关资源
    最近更新 更多