1
3
2012
41

为什么业界很少使用 Haskell?

本文来自依云's Blog,转载请注明。

这是 Stackoverflow 中一篇答案的粗略翻译,原文地址 http://stackoverflow.com/a/2302230/296473已失效

  1. 没有人听说过它。没有人会使用他们根本不知道的东西。

  2. 不够流行。人们认为最流行的语言就是最好的语言,因为如果它不好的话,它就不会流行。实际上这根本不成立。最流行的语言最流行,仅此而已。Haskell 不流行是因为它不流行。这就是 Haskell 里经常用到的「递归」。不管来自命令式编程世界的人们怎么说,递归在现实世界中非常常见。

  3. 它不一样。人们总是害怕新事物。

  4. 它很难。人们认为 Haskell 难学难用。这显然和第三点有关。Haskell 里充斥着一些高深晦涩的术语,如「单子就是自函子范畴中的独异点,有什么问题吗?」(译注:这句话真难译 :-( )。普通人可理解不了这个。

  5. 有风险。大多数公司不想第一个吃螃蟹。Haskell 的用户太少了,所以很少有用户愿意尝试它。(看吧,又是递归。)

  6. 招不到程序员。首先,按第二点,会 Haskell 的人很少。然后,大多数人相信第四点,所以找不到愿意学习的程序员。使用一门招不到程序员的编程语言风险太大了。(好吧,我们回到第五点了。)

  7. 库。这可能是最重要的一点,所以我多说一些。

    A. 质量。有很多库,可是质量参差不齐。大多数 Haskell 库(Hackage)是个人的业余项目,文档欠缺。有些不完整,有些已经不再能用,有些在特定情况下会出错。

    B. 多个不兼容的库。能够使用 Haskell 连接到数据库。但问题是,存在一堆这样的库,让人很难分辨出哪些是被支持的库,哪些在几年前就已经烂掉了。而且,在 Haskell 中连接数据库也不像开个 ODBC 连接那样简单。针对每种数据库,每个库都用不同的后端。在数据库支持的广泛性上 Haskell 做得不错,连新出现的 Mongo 或者 Cassandra 数据库都支持。开源可能没有给予 Haskell 以深度,但给予了其以广度。

    C. Windows。几乎所有重要的库(比如加密、二进制数据文件格式、网络协议、数据压缩、连接数据库等)是 C 语言库的包装。它们在 Windows 上编译不了。因为 Windows 是市场上最大的目标平台,这是个大问题

  8. 效率无法预测。由于对 Haskell 缺乏了解,很多人甚至都不知道这一点。很多人直接就认为「Haskell 效率低下」。这不对。事实是,很难预测一个 Haskell 程序的效率。微妙的、没有明显关联的不同有时可能导致效率的巨大差异。(译注:蝴蝶效应啊?)

  9. 正确性。大多数公司对正确性并不重视。它们不在意质量。它们只要尽可能迅速地把代码扔出去赚大把大把的钞票就好了。如果代码有 bug 的话,它们就向客户卖补丁。把代码写对没用;重要的是快速把代码写出来。Haskell 会用优美的解来回馈那些坐下来深入分析问题的人。大多数公司不喜欢这样;他们只要尽可能快地把产品搞出来,以后再修正它,如果还有以后的话。

的确有少数地方正确性很重要。这些地方基本上要么是级别甚高的安全系统,要么是金融系统。(译注:交集不为空?)就我所知,Haskell 在这些领域还是比较流行的。

最后说两点:

  • 我还记得不是太久前人们还叫嚷着「C++ 是给菜鸟的玩具!你应该用像 C 这样真正的编程语言。」现在再看看有多少大型 C++ 程序?

  • 人们总是在说 Lisp 是「下一个里程碑性语言」。他们说了多久?已经 40 年了?Lisp 比几乎所有主流编程语言都要老。现在看看有多少大型 Lisp 程序?

我不知道 Haskell 的命运终将如何。我觉得,Haskell 好的思想会被像 C# 或者 F#、OCaml 这样的杂交语言偷取。人们依旧不会使用 Haskell。它太不一样了。

不管怎么说,关于为什么业界不用 Haskell,见以上观点。它太罕见、太不流行、太奇特,库也不完善。大约就是这样。


后记:

也许,照耀大地的永远是在众恒星中普普通通的太阳,人们永远不会知道在宇宙的某个角落里曾经诞生过一颗绝美无比的小星星。这个世界是不完美的,否则如果它是完善的,缺少了不完美,它还完美吗?这个世界是不公平的,流星划过苍穹,带给多少人希望,而它自己却身殒,不留下一点痕迹。

Category: Haskell | Tags: Haskell 译作 | Read Count: 61980
Mike 说:
Jan 03, 2012 10:13:06 PM

“现在看看有多少大型 Lisp 程序?”
其实在40年前,Lisp程序是满天飞的,连shell都是Lisp。

不记得是谁说的”Lisp真的是给天才程序员用的语言“

Avatar_small
依云 说:
Jan 03, 2012 10:21:16 PM

你找原文作者说去,别找我啊。
另外,作者这里说的是现在的情况,中文里没有时态的区分。。。

Fermat618 说:
Jan 03, 2012 10:31:27 PM

文艺青年你好

李帅 说:
Jan 03, 2012 11:03:05 PM

最近要玩这个了么?helloworld党?

INNOCENT 说:
Jan 04, 2012 12:13:13 AM

plan9也是.
流行归流行, 好归好, 两码事.

Avatar_small
Garfileo 说:
Jan 04, 2012 10:08:48 AM

Haskell 之父也为 Haskell 的“不流行”推波助澜,他带领的那个小圈子里的纲领是:不惜一切代价让 Haskell “不流行”,详见:http://www.computerworld.com.au/article/261007/a-z_programming_languages_haskell/?pp=10

Haskell 之父的理念与 Linus 对 Linux 的理念有些相似,前者提出 Just for research,后者提出 Just for fun。

Avatar_small
依云 说:
Jan 04, 2012 01:34:13 PM

明白了,比 Python 还绝。

Fermat618 说:
Jan 04, 2012 04:20:45 PM

哈,你就是空间里那么多haskell的文章啊,博主就是看了你的文章然后被鼓动起来搞haskell的吧 :)

Avatar_small
TBY 说:
Jan 04, 2012 08:29:46 PM

7中的c我觉得现在来看的话好许多了,ghc7.0以来对win的动态链接支持好不少了。
库的问题呢,现在一个是包系统的依赖分析不完美,二是缺少类似CPAN的评价体系。这两点社区已经重视起来了,有希望解决。
个人觉得问题最大的还是4和8,主要是因为绕不过去的。倒不是说Haskell很难,一方面是Paradim shift,过程式转函数式的问题。更严重的是8提出的问题,需要对整个Haskell实现细节(比如strictness analysis,Lisp类或者OCaml这点上比Haskell好)和函数式的基本概念很清楚(比如WHNF,HNF,NF概念之类)才能解决,无疑会加重4。

Avatar_small
TBY 说:
Jan 04, 2012 08:38:23 PM

对了,py之父在去年11月初的时候G+上留言表明其正在学Haskell,并喷过几口,有兴趣可以去翻这里http://bbs.chinaunix.net/thread-3621353-1-1.html

Avatar_small
依云 说:
Jan 04, 2012 09:24:14 PM

后边那些大写字母组成的单词我一个也不认识。。。。

Avatar_small
Garfileo 说:
Jan 05, 2012 08:51:46 AM

py 之父看了 LYAH 有 50 来页就去喷,太草率了啊。作为一本提供给 Haskell 学前班的书 LYAH,里面自然不可能写太多的 Haskell 细节。

args 说:
Jan 05, 2012 11:56:09 AM

对我来说就一点。语法丑陋,我简直无法想象这是一个委员会搞出来的东西,还有硕大无比的环境。

我无法带着一种愉悦的心情继续学下去了。

Avatar_small
TBY 说:
Jan 05, 2012 01:13:51 PM

每个人都是这么过来的,我觉得让很多程序员放弃的原因就是之前过程式编程的经验在最开始学haskell的时候完全无用,甚至反而有害。不过好处就是社区成员大都比较谦虚,因为每个人都有不懂的地方。stackoverflow上,我觉得http://stackoverflow.com/users/83805/don-stewart?tab=answers 这个链接比较值得看看,real world haskell的作者之一。很多问题回答的很详细,也很根本。

Avatar_small
TBY 说:
Jan 05, 2012 01:33:36 PM

额,其实一开始可能不习惯吧。就我个人来看,Haskell的语法设计是认真考虑过代码美感的..特别是当你把它的语法和Lisp以及Erlang来比。这两者比较有特色,Clojure就是要在Lisp基础上添加Haskell特性(partial apply和function curry,但还是要写许多无用的声明和关键词),你反过来再去看Lisp的话,就会发现它很多语法是比较冗余的,表达同样的语义要比Haskell长不少,特别是要写High Order Function的时候(事实上大部分Lisp Macro作用差不多类似个高阶函数)。Erlang语法上看上去完全是杂合产物(不知道为什么我觉得很恶心,pattern match加上各种类型括号,很不协调)。

Avatar_small
依云 说:
Jan 05, 2012 02:10:58 PM

Erlang 的语法我差不多都忘了,呜呜呜……

Haskell 编译的文件大小太大了有什么办法没?我想把共同的部分单独放 .so 里还得依赖 ghc 的库或者自己拿 C 粘吗?

Avatar_small
TBY 说:
Jan 05, 2012 06:29:27 PM

默认Haskell编译的时候是静态链接所有的Haskell库的...一个带gui的HelloWorld > 5M... 办法有两种:
1、strip,小文件手动,模组的话,设置~/.cabal/config,把executable-stripping: True设置了。(这个默认没设置,我觉得设了挺好的documentation: True)
2、编译的时候,设置动态链接的flag,这个方法出来的二进制文件很小,如果只是本机上编译了跑的话,问题不大,不过我觉得还是默认的静态比较好.各个不同版本的库,二进制接口很可能不兼容.

Avatar_small
TBY 说:
Jan 05, 2012 06:30:41 PM

默认Haskell编译的时候是静态链接所有的Haskell库的...一个带gui的HelloWorld > 5M... 办法有两种:
1、strip,小文件手动,模组的话,设置~/.cabal/config,把executable-stripping: True设置了。(这个默认没设置,我觉得设了挺好的documentation: True)
2、编译的时候,设置动态链接的flag,这个方法出来的二进制文件很小,如果只是本机上编译了跑的话,问题不大,不过我觉得还是默认的静态比较好.各个不同版本的库,二进制接口很可能不兼容.

args 说:
Jan 06, 2012 02:30:18 PM

我只学过scheme,我觉得很符合我的审美。

Avatar_small
TBY 说:
Jan 06, 2012 04:29:47 PM

我今天reddit上发现了个好链接,讲Haskell的数据结构和内存模型上进行性能优化的,是一位Google工程师(也算是N多著名Haskell包作者)在斯坦福Haskell课程上一个讲座,斯坦福的网站上倒没有这个链接。这个讲座对数据结构的pack和unpack将的挺好的,图文并茂。
其他函数编程语言的爱好者也可以看看,也可以借鉴的。
http://johantibell.com/files/stanford-2011/performance.html

Avatar_small
依云 说:
Jan 06, 2012 07:17:16 PM

看不太懂。String 原来是链表……Data.Text 怎么用呢?我是说,没看到 interact 这种 IO 函数。

Avatar_small
TBY 说:
Jan 06, 2012 08:07:39 PM

http://hackage.haskell.org/packages/archive/text/0.11.1.12/doc/html/Data-Text-IO.html

Data.Text这个包“很新”的,ghc7.0的时候飞速地通过审查加入了haskell-platform,当时reddit上一堆人喷偏心.....我自己没怎么用过,一般都是String或者ByteString。haskell现在在演进的很激进的,包的接口很多都是experimental。

Avatar_small
依云 说:
Jan 06, 2012 08:34:25 PM

Thanks, 不过发现影响不是很大,对一个近十万行的文件处理,也只快了 0.4 秒(5.5%)。反而是 map 不能用了……
http://p.vim-cn.com/cxc/hs

Avatar_small
依云 说:
Jan 06, 2012 08:34:55 PM

错了,是 0.04 秒。。。。

Avatar_small
TBY 说:
Jan 06, 2012 08:54:44 PM

我觉得不能这样比,因为除非单行是很长的那种,否则这种按行缓冲的IO提速效果不会很明显的,瓶颈不在那里。你要快速读写的话,个人觉得还是用ByteString+utf8-string,那个默认按64kb的块来缓冲的,速度几乎等同于c。

Avatar_small
TBY 说:
Jan 06, 2012 09:03:49 PM

可以试试看用Data.ByteString.Lazy中的IO函数来读,Data.ByteString.Lazy.UTF8中的来解码并处理,然后做成个类似interact的流处理,这样的话因为读写都是Lazy的,内存占用也比较少的,而且有速度保证。

Avatar_small
依云 说:
Jan 06, 2012 09:45:02 PM

我表示不会写了。。。
另外,内存占用怎么看?我现在测时间用的是 Perl 脚本,要测内存我压力巨大啊。。。

Avatar_small
TBY 说:
Jan 06, 2012 10:18:16 PM

编译的时候开Profiling参数,运行二进制的时候加上RTS选项,具体参考这里:http://www.haskell.org/ghc/docs/7.0-latest/html/users_guide/prof-heap.html#rts-options-heap-prof

Avatar_small
TBY 说:
Jan 06, 2012 10:22:36 PM

这份是斯坦福教程里profiling相关的一些资料:
http://www.scs.stanford.edu/11au-cs240h/notes/perf-slides.html#%2813%29

Avatar_small
依云 说:
Jan 06, 2012 11:31:13 PM

你好厉害,谢谢啦!

Avatar_small
TBY 说:
Jan 06, 2012 11:39:10 PM

不敢当,我只是个想当文艺青年的普通青年,咳,然后发现了有同样兴趣的同伴了。。。。

Avatar_small
依云 说:
Jan 07, 2012 12:25:03 AM

哦~没想到我一开始学 Haskell 就遇到不少同伴~~
-s 选项的结果都看懂了,hp 的看不懂。。。

Avatar_small
TBY 说:
Jan 07, 2012 12:45:56 AM

要读懂那些就要读Core了,很多是编译中间过程重整后的符号和类型,可以用ghc-core xxx.hs去看,haskell的文艺工具的很多的,其中大部分质量都超过其他语言的同类工具,我特别推荐cabal install hlint,ghc-mod,ghc-mod应该有vim绑定的吧,配合hlint检查写的代码,可以有不少改进的。

Avatar_small
fenprace 说:
Jan 16, 2012 05:34:56 PM

其实说白了,叫好不叫座也是一种失败,叫座不叫好也是一种成功。

matrix 说:
Jul 22, 2013 08:12:16 PM

楼主对百度的看法,我不敢苟同,人人都有自己的选择,我是程序员,但我的脑袋里只有0和1

Mr.纯 说:
Jun 11, 2017 01:28:59 AM

那啥~来个解释呗?

Avatar_small
依云 说:
Jun 12, 2017 11:38:26 AM

没了。时光荏苒,物似人非。

Mr.纯 说:
Oct 06, 2017 11:43:49 PM

6年了,就等来一句 物是人非?


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

部分静态文件存储由又拍云存储提供。 | Theme: Aeros 2.0 by TheBuckmaker.com