如果朋友想要运行我的Haskell二进制文件,他是否必须先安装Haskell,还是可以立即自行运行二进制文件?
答案在Mac,Windows和Linux上是否相同?
有没有什么好方法可以制作小的haskell可执行文件?使用ghc6,一个简单的hello world程序似乎达到了370kB(在strip之前为523kB).C中的Hello世界大约是4kB(剥离前9kB).
使用GHC版本7.4.2和-O3之类的标志,我仍然可以获得巨大的可执行文件.我理解GHC做静态链接,二进制的依赖关系如下:
linux-vdso.so.1 (0x00007fff49bff000)
libpcre.so.1 => /usr/lib/libpcre.so.1 (0x00007fe658d6c000)
librt.so.1 => /usr/lib/librt.so.1 (0x00007fe658b64000)
libutil.so.1 => /usr/lib/libutil.so.1 (0x00007fe658961000)
libdl.so.2 => /usr/lib/libdl.so.2 (0x00007fe65875d000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007fe658541000)
libcurl.so.4 => /usr/lib/libcurl.so.4 (0x00007fe6582e3000)
libgmp.so.10 => /usr/lib/libgmp.so.10 (0x00007fe658074000)
libm.so.6 => /usr/lib/libm.so.6 (0x00007fe657d7a000)
libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007fe657b65000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007fe6577be000)
/lib/ld-linux-x86-64.so.2 (0x00007fe658fca000)
libssh2.so.1 => /usr/lib/libssh2.so.1 (0x00007fe657595000)
libssl.so.1.0.0 => /usr/lib/libssl.so.1.0.0 (0x00007fe65732b000)
libcrypto.so.1.0.0 => /usr/lib/libcrypto.so.1.0.0 (0x00007fe656f22000)
libz.so.1 => /usr/lib/libz.so.1 (0x00007fe656d0c000
Run Code Online (Sandbox Code Playgroud)
到目前为止它看起来相当不错,但是在二进制文件中我可以看到这些行:
GHCi runtime linker: fatal error: I found a duplicate definition for symbol
* Specifying the same object file …Run Code Online (Sandbox Code Playgroud) 可能重复:
用GHC编译成小二进制的小Haskell程序
最近我注意到Haskell可执行文件有多大.下面的所有内容都是-O2在Linux 上用GHC 7.4.1编译的.
Hello World(main = putStrLn "Hello World!")超过800 KiB.strip在它上面运行会将文件大小减少到500 KiB; 甚至添加-dynamic到编译中也没有多大帮助,让我在400 KiB附近删除了一个可剥离的可执行文件.
编译涉及Parsec的非常原始的示例产生1.7 MiB文件.
-- File: test.hs
import qualified Text.ParserCombinators.Parsec as P
import Data.Either (either)
-- Parses a string of type "x y" to the tuple (x,y).
testParser :: P.Parser (Char, Char)
testParser = do
a <- P.anyChar
P.char ' '
b <- P.anyChar
return (a, b)
-- Parse, print result.
str = "1 2"
main = print $ …Run Code Online (Sandbox Code Playgroud)我已经为我的Main.hs模块实现了一个简单的加载器用于haskell插件.我现在使用的唯一功能是load来自这个网站
查看我编译的应用程序大小,向我展示了x86架构上超过53 MB的可执行文件.我知道GHC的大部分内容都是链接的(由于haskell-source-to-binary-plugin功能),但这对我的目的来说太过分了.
是否有官方批准的方式来削减额外的功能,只保留(dyn-)load?
尝试按照减少haskell的二进制问题的答案中提出的解决方案,当我使用选项安装时,我不断收到错误:--enable-shared
> cabal install opengl --enable-shared --reinstall
...
Could not find module `Prelude'
Perhaps you haven't installed the "dyn" libraries for package `base'?
Run Code Online (Sandbox Code Playgroud)
尝试了一切.我正在使用apt-get installedhaskell-platform(使用ghc 7.4.1),在Ubuntu 12.04,64bit上.
有小费吗?
当我通过以下方式之一将(大)模块导入主模块时:
import Mymodule
import qualified Mymodule as M
import Mymodule (MyDatatype)
Run Code Online (Sandbox Code Playgroud)
与不导入该模块时相比,编译后的二进制文件增长量相同.无论我是否在主模块中使用该模块内的任何内容,都会发生这种情况.不应该编译器(我在Debian测试中使用GHC)只添加运行它所需的二进制文件吗?
在我的具体情况下,我在Mymodule中有一个巨大的Map,我没有在Main模块中使用它.有选择地导入我真正需要的东西,并没有改变编译二进制文件的增长.
(我的问题是关于没有haskell-platform,ghc,cabal等的分发二进制文件)
我需要部署一个良好的cabal形成haskell应用程序(一个Yesod脚手架),但我有磁盘空间限制.
GHC大小约为1Gbytes,存储所有cabal源代码,包等...需要更多磁盘空间等...
显然,haskell-platform,ghc,...是关于开发(不是部署).
在我的具体情况下,我可以生成
cabal clean && cabal configure && cabal build
Run Code Online (Sandbox Code Playgroud)
并成功运行(有些像)
./dist/build/MyEntryPoint/MyEntryPoint arg arg arg
Run Code Online (Sandbox Code Playgroud)
但是,依赖关系呢?如何将其转移到生产环境?(连同我的"dist"汇编)
我可以在没有cabal的情况下放置二进制依赖项 怎么样?
非常感谢你!
有一次我问为什么简单的“times 2”程序的 Haskell 二进制文件这么大(例如 C++)?,但这被欺骗了用 GHC 编译成巨大的二进制文件的小型 Haskell 程序。
\n我决定问一个类似的问题,但重点是代码的实际作用,因此是它的汇编形式,而不是二进制文件。我还没有找到我的问题的现有答案。
\n所以不,这不能回答我的问题。
\n这是 C++(实际上是 C)的哑程序,它假设给出了 1 个表示数字的命令行参数,将其转换为 anint并将return其乘以 2 作为可执行文件的退出代码(是的,我可以\不超过 255)
int main(int argc, char * argv[]) {\n int r{0};\n int c{0};\n while (argv[1][c] != \'\\0\') {\n r *= 10;\n r += argv[1][c++] - \'0\';\n }\n return r*2;\n}\nRun Code Online (Sandbox Code Playgroud)\n\nmain: # @main\n mov rcx, qword ptr [rsi + 8]\n movzx …Run Code Online (Sandbox Code Playgroud) 我发现Haskell中的Hello World可执行文件是1.3 MB,我感到非常失望.这对我来说真是不可接受.难道我做错了什么?让hello world可执行文件如此庞大有什么借口?是否有合理的方法来减少这种情况?C中的相同内容是8 kb.
main = print "Hello, worlds"
Run Code Online (Sandbox Code Playgroud) haskell ×10
ghc ×4
executable ×2
linker ×2
assembly ×1
binary ×1
c ×1
cabal ×1
compilation ×1
deployment ×1
footprint ×1
gcc ×1
plugins ×1
yesod ×1