- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
问题 1
出于改进 haskell 编译时间的原因(任何包含的模块都会被编译,无论是否使用底层功能),是否有任何工具可以警告 haskell 程序员包含了不必要的模块?例如,假设我们有以下设置:
NecessaryModule1.hs
module NecessaryModule1 where
addNumber1 :: Int -> Int -> Int
addNumber1 a b = a + b
NecessaryModule2.hs
module NecessaryModule2 where
addNumber2 :: Int -> Int -> Int
addNumber2 a b = a + b
Test.hs
module Test where
import NecessaryModule1
import NecessaryModule2
Main.hs
module Main where
import Test
myadd :: Int->Int->Int
myadd a b = a + b
main::IO()
main = print(myadd 5 6)
然后这样的工具会警告你有不必要的模块:
问题 2
如果我通过以下方式编译上面的代码:
ghc -o testProg Main.hs
然后我得到一个大小为 833504 字节的可执行文件。但是,如果我将 Main.hs 更改为:
Main.hs
module Main where
--import Test
myadd :: Int->Int->Int
myadd a b = a + b
main::IO()
main = print(myadd 5 6)
然后可执行文件的大小减少到 833057。鉴于 Main.hs 中未使用 Test 模块的功能,为什么可执行文件的大小存在差异?
最佳答案
Q1 Haskell 无法就未使用的模块向您发出警告,因为它们将来可能会被另一个包导入。但是,当您导入模块时,只有那些您导入的模块会被链接,因此如果您使用从未导入的模块创建可执行文件,除非您明确告诉 cabal
,否则该模块将不会包含在可执行文件中。链接它。
当您实际导入一个模块时,如果您通过了 -fwarn-unused-imports
参数,GHC 会警告您不要使用该模块。编译时标记。您还应该考虑使用 -Wall
,这将启用此警告和许多其他有用的警告。使用 -Werror
将使 GHC 拒绝编译带有警告的模块,例如未使用的导入或死代码。
你也可以传递标志-split-objs
到 GHC,这将使 GHC 每个函数(或多或少)创建一个目标文件,而不是每个模块一个目标文件,从而可以大大减少可执行文件的大小。
Q2 作为其某些功能的一部分,Template Haskell 语言扩展可以浏览模块的本地范围。因此,GHC 有必要在编译模块时包含显式导入的代码,因为可能有一些 TH 功能依赖于它。启用某些级别的优化(如 -O2
)可能应该再次删除未使用的代码,但不能保证。
您可能会考虑使用 -shared
进行编译编译标志,它将使用共享库进行编译并大大减少整体二进制文件的大小,缺点是如果您想在不同的计算机上使用编译后的二进制文件,则必须一起复制库文件。
关于linux - 在 Linux 中使用 GHC 的编译、依赖关系和可执行文件大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12019072/
runghc 和 ghc 有什么区别? 我运行了一个简短的程序,似乎可以用两者编译,除了我用 runghc 得到了以下内容,但不是普通的 ghc: error: Variable not in sco
如果 friend 想要运行我的 Haskell 二进制文件,他是否必须先安装 Haskell,还是可以立即自行运行二进制文件? Mac、Windows 和 Linux 上的答案相同吗? 最佳答案 G
ffunction glMultiDrawElements 需要一个指向指针的指针作为其参数之一。如何从 StorableArray Int a 获取 Ptr(Ptr a) ? 最佳答案 您需要先将索
module Has (r,p,s) where import Prelude ((==),Bool(..),otherwise,(||),Eq) import qualified Data.List
我已经构建了 ghc-HEAD,我想尝试构建所有的 stackage lts 或 nightly 看看它能做多少。 无论我说什么都无法说服 stack 使用我的新 ghc 构建任何东西。我尝试设置如下
我正在使用 Emacs (24.3.1) 在 haskell-mode 中与 ghc-mod 一起使用 Haskell。 现在除了一件烦人的事情外,一切都很好: GHC 信息缓冲区中的每个输出仅包含第
为什么升级到 OSX Mavericks 后我的 GHC 7.6.3 不能工作? 最佳答案 花了很长时间才弄清楚如何同时使用 OSX 10.9 和 GHC 7.6.3,这里有一些技巧可以帮助您重新构建
我有一个带有 cabal 文件的主要 Haskell 可执行程序。在那里,我指定 ghc-options . 这个可执行文件链接到野外的其他库。请问ghc-options忽略这些库的 cabal 文件
我有一个使用 -Wall 编译的库,并且我有一个使用 -Wall -Wno-incomplete-patterns 的测试套件 当我使用 stack ghci --test 启动 ghci 时,ghc
我正在尝试使用以下脚本在 Windows 上安装 GHC(并将 ghc 放在路径中),但是当我尝试运行 ghci --version 时它失败了。我认为脚本有问题。 install: - ps:
我在 $HOME 中安装了 ghc-7.2.2 unknown linux tar.bz2在archlinux上。 在使用 cabal-dev 成功安装多个软件包后,尝试安装例如。我得到的解析数字、文
想法 我正在写 DSL ,编译为 Haskell。 该语言的用户可以定义自己的不可变数据结构和相关函数。关联函数是指属于数据结构的函数。 例如,用户可以编写(在“pythonic”伪代码中): dat
(我的问题是在没有 haskell-platform、ghc、cabal 等的情况下分发二进制文件) 我需要部署一个结构良好的 haskell 应用程序(Yesod 脚手架),但我有磁盘空间限制。 G
我试图将 Cygwin 安装程序指向 http://haskell.org/ghc/cygwin ,但安装程序无法找到 setup.ini.sig。如果可能的话,我该如何编辑我的 .bashrc 以引
我有一个现有的 Haskell 函数,它使用 GHC API 从模块中动态加载已编译的代码。它基于博客文章中的代码 Dynamic Compilation and Loading of Modules
我使用:Ubuntu 上的 GHC 7.6.3(通过 apt-get install haskell-platform) 从当前存储库安装它。 正在尝试安装ghc-mod ,因为我的 ide 插件需要
AFAIK,有两种方法可以在 Haskell 中获取用于调试的调用堆栈: 添加 HasCallStack代码中的约束 使用 ghc -prof -fprof-auto-top 编译代码 我的测试代码:
我想用 64 位 GHC 构建 32 位 DLL。这是最小的例子。 测试.hs {-# LANGUAGE ForeignFunctionInterface #-} module Test where
ghc-gc-tune 0.2.1 可以与 ghc 7.4.1 一起使用吗?看来 ghc-gc-tune 已经有一段时间没有更新了,可能只适用于 ghc 6.x?我找不到任何可靠的信息。 我收到以下错
语言扩展 ExplicitForall 使得使用 forall 绑定(bind)类型变量成为可能但不是必需的。 例如,下面的程序可以编译 {-# LANGUAGE ExplicitForAll #-}
我是一名优秀的程序员,十分优秀!