Haskell 的库可以二进制分发吗
题主应该明确下二进制分发的含义,如果是指分发生成的目标文件.a/.o,那么很抱歉Cabal并没有提供这样的分发机制,原因也很简单,目标文件的机器码是依赖操作系统环境、机器CPU架构的,这就需要一套类似大部分linux发行版的中心仓库,存放不同CPU下生成的目标文件以准备给不同的户,目前来看haskell社区还没有这么强力资源支持的。另外虽然Cabal走的是源码分发,不过用户下载了之后会被立刻编译成二进制的.a/.so/.hi文件缓存下来,这个应该去查阅Commentary/Compiler/Packages - GHC。这里面包括symbol对应的机器码(.a/.so),或者symbol的类型及其他信息(.hi)。取决于用户开启的优化等级,这些信息有可能被/不被用到。另外楼主也不用担心多态的问题,ghc实现typeclass是通过词典传递实现的,而specialize不过就是指定类型词典的内联,可以参考Instances and Dictionaries,所以如果不开启优化的话,和你自己多写一个参数没有区别,同时也不需要额外的模块信息。
■网友
01 用ghc生成的可执行文件原则上可以分发到对应操作系统直接执行02 ghc生成的o文件和hi文件只能保证与和它们使用同一套版本的ghc和依赖代码的程序相链接。haskell Platform 和 stackage 就是做这样的事情比如你用HP7.2生成的o和hi文件,在HP8.0下就未必能链接了,得在HP8.0下重新编译,再链接实际上,因为cabal下载,安装和编译软件的先后顺序不同,有时候会在同一个平台发生二进制文件之间的冲突,称为“cabal hell”所以除了HP这样的平台自己(保证软件相互之间同根同源),没人会编译好o和hi文件来分发软件,都是直接出cabal包
■网友
可以是可以,但是有些蛋疼,如果库是通过 二进制方式分发的话,那么你的可执行也就需要这样发行,,你在 系统下,启动动态库或共享库,然后你可以看一下动态库的依赖,只有全局方式才会不带着 哈希值,,我在折腾自己的博客的时候(用的 Yesod)曾经在 有 ghc 的docker 中编译了一份动态连接的,然后拷贝到宿主机上,唯一的坑就是 哈希码会使得,非全局编译的共享库几乎无法通用,其他的还好,但是总共的大小比静态的大了不少,但是这样可能是一种作死,然后就是说二进制分发虽然没啥,但是一方面Haskell 官方并不建议与期望这样玩,而当你需要 -02 的时候,很可能用到的二进制发行的 so/dll/dylib 啥的是 -O0 编译的。。
■网友
那个所谓的二进制说不定就是存了个语法树或者机么训的指令集(其实也就是一颗语法树)在里面,省去了前端的一些工作而已。最后弄成exe的那一刻才做全文优化。
推荐阅读
- 用泡沫箱来养多肉老桩?只要我们把细节做好,同样可以养出状态来
- ■养宠物真可以缓解孤独吗?一起来听听“铲屎官”的心声吧!
- 用EagleGet下载时总提示无效URL地址,无法下载,而用迅雷、QQ旋风则可以,咋回事~
- 银行的数据中心可以跳槽去互联网公司吗
- 银行高管的薪酬结构图表最新的,请问在哪里可以收集
- 医院|感染艾滋病毒初期有哪些征兆?可以自行检查吗?共用马桶会传染吗
- 电动车第一线|电动车配多大的电池,可以跑100公里以上?师傅告诉你真实答案!
- 有啥方法,网站,项目可以自己练习计算广告学
- 学图像处理有哪些不错的书推荐
- 宝马7系|可以说,这款数字化高尔夫,让人看到了未来大众所有车型的样子
