为什么OCaml不受欢迎?


86

我一直听说C是嵌入式系统或任何需要以最高速度运行语言的首选语言。我从来没有对C产生过浓厚的兴趣,主要是因为我不喜欢指针算术,并且该语言仅比汇编程序强。

另一方面,ML语言是功能强大的垃圾收集语言,OCaml甚至具有对象模型,但它们以与C一样快而享有盛誉。ML语言具有任何人都可以要求编写的抽象,简洁的语言代码,但它保留了编写高性能应用程序所需的速度。

特别是,OCaml可以在传统上使用C的任何地方使用,例如用于嵌入式设备,图形驱动程序,操作系统等。按权利,OCaml到现在应该已经占领了整个世界,但是几乎没有人听说过这种语言用过的。

这是一个主观的问题,但是为什么OCaml和ML其他语言仍然如此晦涩,而C和其他语言却变得流行呢?

Answers:


82

第一个答案是,没有人真正知道语言为什么会流行,而其他人则感到迷惑或有议程。(通常很容易确定为什么某种语言未能流行,但这是另一个问题。)

有了该免责声明,以下是一些建议性的要点,最重要的是首先:

  • 1974年出现了第一个成熟的C编译器。第一个成熟的OCaml编译器出现在1990年代后期。C有25年的领先优势。

  • C随Unix一起提供,这是有史以来最大的“杀手级应用”。长期以来,世界上每个CS部门都必须拥有Unix,这意味着每个讲师和参加CS课程的每个人都有机会接触C。OCaml和ML仍在等待他们的第一个杀手级应用程序。(MLdonkey很酷,但它不是Unix。)

  • C很好地填补了它的利基,我怀疑永远不会有用于系统编程的另一种低级语言。(要获得有利的证据,请阅读HOPL II中Dennis Ritchie的有关C历史的论文。)甚至还不清楚OCaml的利基是什么,而Standard ML的利基则更加清晰。因此,Caml和ML拥有很多竞争对手,而C击败了它的唯一竞争对手(BLISS)。

  • C的一个强大优势是其成本模型非常可预测:可以轻松查看C代码的任何小片段,即可立即准确地了解执行该代码必须执行哪些机器操作。OCaml的成本模型不太清楚,尤其是因为内存分配内存分配的总成本(相等的分配成本加上垃圾回收期间产生的成本)取决于紧急属性,例如对象的生存时间以及哪些对象引用其他对象。最终结果是性能很难预测,甚至很难分析。(OCaml的内存分析工具不是应该的。)因此,OCaml不适用于性能必须非常可预测的应用程序,例如嵌入式系统。

  • C是具有标准和许多编译器的语言。OCaml是软件构件:唯一的编译器来自单一来源,并且编译器标准的。而且该标准随每个发行版而改变。对于重视稳定性和向后兼容性的人们,单一源语言可能会带来无法接受的风险。

  • 任何具有中等程度的本科编译器课程并且具有很多持久性的人都可以编写能或多或少有效且具有适当性能的C编译器。为了使OCaml或ML的实现落地,需要更多的知识,而要获得与天真的C编译器可比的性能,则需要做大量的工作。这意味着很少有业余爱好者会喜欢OCaml之类的语言,因此很难使社区对如何利用它进行深入了解。


5
OCaml是相对较新的ML语言,与Java大约同时诞生。但是,ML可以追溯到1973年,是第一个主要的方言,SML于1978年开发。ML方言在定理证明和研究中占据一席之地,但此后一直是金融机构的行业标准。
朱丽叶2009年

15
我不会将ML称为“金融机构的行业标准”。(我之所以这样说是因为我用Haskell编写了金融应用程序。:-))在商业世界中,尽管金融业对函数式编程的使用比其他任何人都大得多,但它仍没有得到广泛的应用。 :以我的经验,C ++和Java占主导地位。像简街这样的公司是例外,而不是规则。

8
Perl是一个“软件工件”-Perl的唯一定义是“ perl(1)解释的语言”-但是它相当流行。长期以来,Python和Ruby都是“软件工件”。

5
@Chris:IMO,这是Perl失去思想份额的原因之一。
Norman Ramsey,

5
至于可预测性,我认为OCaml在C编译器方面的预期优化水平以及其中许多优化的易碎性实际上在该领域击败了C。OCaml的编译器非常直观地说明了将代码编译成什么内容。

63

我认为OCaml的问题在于“开箱即用”它不太有用。人们使用某种语言的最终原因是因为它拥有他们所需的库。但是,没有什么“开箱即用”的东西,没有人能深入到项目中来意识到他们需要编写一个库。结果是没有库的语言,这使得编写“真实应用”变得很困难。

我认为这就是OCaml所遭受的-没有人会费心地在其中启动“实际项目”,因为那里只有一种编程语言。是的,我可以加两个和两个并打印结果。结果是收集了大部分都是学术性的抛弃式软件的库(作者获得了博士学位并继续前进),这对实践程序员并不太有用。

(我知道有一些工作正在改变这种状况,例如“包括电池”之类的项目。再过5年再回到这里,也许OCaml会更受欢迎。)

此规则有一些例外。Java最初是没有库的,但是Sun付钱给人们内部编写它们,然后他们把它全部卖掉了。Java认证,特定于Java的硬件,Java书籍,Java类等。然后,即使说这不是一种用于学习编程的好语言,大多数大学还是说服了他们专门讲授它。

结果是受欢迎。钱可以解决很多问题。

在功能语言领域,我们可以看到Haskell变得非常流行。我认为大多数的流行是由于像dons这样的人编写了有用的库,并且从未停止过销售这种语言。每天您都可以看到Haskell上有关Programming Reddit的几篇文章。这使它一直困扰着人们,直到他们最终决定“我将尝试Haskell”。当他们这样做时,他们会看到有用的东西,例如Web框架,对象数据库,OpenGL库和XML处理库。这意味着他们实际上可以做一些有用的“立即行动”。因此,在具有潜力的生产能力和对其进行大量了解之间,Haskell获得了很大的知名度。

CL具有许多与Haskell相同的库,并且速度几乎一样快,但是没有人谈论它,因此它“感觉死了”。确实,#lisp比#haskell安静得多,但是Lisp仍然是一种非常有生产力的语言,具有许多库。没有其他语言具有SLIME。但是营销非常重要,Haskell的表现要比Lisp或OCaml更好(并争夺相同的用户群)。

最后,有些人永远不会“获得”编程,因此打破他们的思维模式(变量是带有值的框,代码从上到下执行)将确保他们不使用您的语言。这种类型的程序员在编程人员中占很大比例,因此这进一步限制了诸如Lisp,Haskell和OCaml之类的抽象语言的可能用户群。


45
这也许是十年前的事。让我知道何时可以“ cabal安装” OCaml库。无论如何,仅仅因为我对您喜欢的语言说了一些不好的话,并不意味着您必须停止使用它。因此,无需情绪激动。

5
不,我的意思是总体编程。如果您不理解函数式编程,那么您可能也不会理解其他概念。

8
我不买这个。OCaml有很多库供日常的基本编程工作使用,如果它变得更流行,人们将编写更多内容。每种语言都是从很少的库开始的。

8
如何链接到这些库?

4
为什么有超过0个人赞成某人声称某种语言没有可用的哈希表实现?我不能忍受在无用的废话中构建的语言(例如其中的正则表达式和字典),应该将这种语言与库尽可能地分离,以保持关键的TCB正常运行。依靠字典来完成任何事情的语言是完全废话。
Longpoke 2011年

22

我喜欢OCaml的很多作为一门语言。但...

工具支持不存在。调试器只能正常运行,但不能在Windows上运行(我最后检查过),而且没有太多可用的开发工具。

有时它的类型系统强大了。对于不了解类型推断工作原理或ML类型系统的人而言,他不能立即将整数添加到浮点数这一事实马上就成为了主要的选择。

标准库有时可能会有不一致的感觉。

对象模型似乎有些固定,标准库几乎没有使用它,而是选择了基于模块的库。

还有很多其他事情,基本上等于该语言没有被“磨光”,并且在人们选择一种语言并试图决定他们是否喜欢它的非常关键的时期将其赶走了。

我认为它最重要的遗产将是它与其他ML方言一起对其他功能语言产生了很大的影响。当前的大多数功能语言都采用了ML方言中最好的元素,并改善了一些烦恼。


3
我不会说它的类型系统太强大,但是表现力不够,类型类ala Haskell会有所帮助。

2
是的,但是其中大多数关于不感到礼貌的评论都更加强烈地适用于C ++!我认为这会削弱您的论点(尽管我同意)。
Yttrill 2011年

2
OCaml调试器是我所知道的唯一可以后退和前进的调试器。
ocodo

21

嵌入式系统通常需要两件事:速度和确定性。OCaml可以提供速度,但是它具有垃圾收集器的事实使其固有地不确定性,而对于实时系统而言,简单是无法做到的。


1
可以,但是Java和PHP很流行,您不能在嵌入式系统中使用它们。嵌入式系统中的可用性对语言受欢迎程度影响不大。

3
最初的问题是关于嵌入式系统的,所以我提供了一个可能不使用嵌入式系统的具体原因。另外,您可以使用Java-不能用于实时(对于C#也是如此)。

2
Java本身不是实时的。具有垃圾收集机制的任何东西都不可能。

3
@ctacke:那根本不是真的。有许多实时垃圾收集器。Java实现确实使用它们,而Java用于实时应用程序中。
乔恩·哈罗普


18

这有点像橘子的比较。OCaml是一种相当年轻的语言[1],并且从未进行过认真,持续的努力将其推向主流(微软目前与F#的合作除外)。与C不同,它不是最受支持和模仿的企业操作系统(即UNIX)的通用语言。与Java不同,它没有一家大型公司将其推向下一代计算平台。与Perl,Python和Ruby不同,它并没有占据一个备受瞩目的有影响力的利基市场(即,其利基市场是编程语言和自动推理研究,与Web开发相比并不十分引人注目)。因此,它不是超级受欢迎。

[1]公平地说,原始的ML语言自70年代就存在。但是OCaml直到1996年才出现,并且没有继承Standard ML库。实际上,它是比C,C ++,Java,Python,Haskell甚至Ruby更年轻的语言。


根据Wikipedia的说法,ML并不年轻,它只有一岁(C的1972年诉ML的1973年)。我认为您的其余解释对您来说都是正确的。

1
嗯 我可以将C追溯到60年代末,将ML追溯到80年代初(尤其是OCaml,要追溯到90年代末……比Java,Python甚至Ruby还要年轻),但我想我还有点不足。

ML的历史可以追溯到1973年,OCaml是从1996
。– ocodo

15

OCaml社区未能开发一个大型且可靠的标准库(超出了当今OCaml附带的库),该库使应用程序开发变得容易。有几种尝试解决该问题的方法,但是只需看一下Python或Ruby来查看缺少的内容。如果您想解决一个算法问题,而OCaml是一种很棒的语言,那么该算法问题并不需要过多地与XML,网络,数据计算等高级标准模块进行交互,而您不希望自己实现。

我相信问题的一部分是OCaml如何将模块映射到文件:从概念上讲,所有* .ml文件都位于相同的名称空间中,目录没有意义。这使得社区很难发展图书馆。如果编译器将目录层次结构映射到模块层次结构中,我会看到标准库会更好地发展。但是,这将需要核心编译器开发人员付出巨大的努力。(我知道打包模块,但是我认为这很麻烦。)

另一个库问题是编译器版本之间的二进制兼容性。可以肯定地说,在升级编译器后必须重新编译所有库代码。这使得很难提供模块或库的二进制发行版。


真的很好
cnd 2011年

11

可能是因为过多的人接受过ML知识的学习,这是对类型的怪异和令人困惑的理论介绍的一部分。那就是我发生的事情。

大约在同一时间向我展示了ML和Smalltalk。Smalltalk 看起来简直太酷了,立即可以理解OO的用途以及在这种环境下如何制作漂亮的交互式内容。ML是关于抽象的数学事物,似乎与我想做的事情无关。而且与C不同,我没有保证让我在16位micros上编写快速游戏。

当然,这是非常不公平和主观的。但这对于大多数人来说可能是真实的故事。

这些天来,我想问题应该是:现在,我确实确实需要了解关于类型的奇怪且令人困惑的理论知识,为什么我选择ML而不是Haskell或Erlang?


好吧,您可以选择Haskell而不是ML,因为从很多方面来说,Haskell都是改进的ML。为什么不确定我为什么选择Erlang呢?我不确定:Erlang不是静态类型的,对我来说,经过一些令人沮丧的经历之后,我每天都会接受ML。

我在1996年在剑桥大学接受了标准ML的教学,但实际上不喜欢它的部分原因是因为这些示例都是理论计算机科学(而且我是物理学家)并且因为其实现很烂(当我抱怨说它们给了我100kLOC的ML编译器源代码时)甚至没有编译,并告诉我自己修复它)。在攻读博士学位后,我选择了OCaml,发现它实际上更加可行。至于ML vs Haskell / Erlang,则取决于哪个ML。OCaml显然具有Haskell和Erlang缺少的许多功能。而且,这些功能在实践中被证明是必不可少的。
乔恩·哈罗普

9

我认为主要问题是缺少实际的标准库。因此,项目“ 包含OCaml电池”有望大大改善这种状况。它应该会在几天内进入Beta阶段,因此您必须在一年左右的时间内再次提出问题。


10
两年后,OCaml似乎不再流行。

5
四年后,OCaml似乎不再流行。
卡米洛·马丁

8

我同意过去Windows的差劲支持,陡峭的学习曲线和纤薄的标准库都抑制了OCaml的普及,但是我要补充说,与Java之类的主流语言相比,关于OCaml的教程信息(例如书籍)非常缺乏。

同样,知道像OCaml之类的语言的人也非常不同。在网络程序员中,可能有千分之一的人听说过OCaml。在剑桥大学从事科学计算的人员中,据我了解,大约90%的人精通OCaml。的确,我是我的最后一个学习OCaml的朋友之一。我们甚至在256 CPU超级计算机上运行OCaml ...

我还应该提到,这些问题正在迅速得到解决。OCaml最近通过Ocsigen之类的项目为网络编程重塑了自己,并且在这种情况下至少已经取得了两个主要的工业成功案例。现在有另一本关于OCaml的新书。社区正在合作开发一个名为“包括电池”的综合标准库,该库刚刚进入beta版本,看上去很棒。OCaml的多核友好版本即将发布。OCaml的最新版本还包含许多出色的新功能,例如惰性模式和动态加载的本机代码OCaml库。


“陡峭的学习曲线”:从0开始掌握C ++需要多长时间?我认为,如果OCaml更受欢迎,更多的人会发现努力学习它是正常的。
乔治

@乔治(Giorgio)“我认为,如果OCaml更受欢迎,更多的人会发现努力学习它是正常的”。我认为更多的人学习Python和Ruby,因为它们相对容易学习。
乔恩·哈罗普

当然,人们更喜欢学习更简单的语言(顺便说一句,我不认为Ocaml会比Ruby复杂得多,并且绝对不会比C ++复杂得多),关键是一旦一种语言成为主流/流行语言,那么它就是复杂的事实就是不再被视为大问题。OCaml并不流行,因此人们认为它不值得学习。
乔治

我同意,除了我当然已经意识到C ++的复杂性是一个主要问题之外,我认为我遇到的大多数人也对此深信不疑。特别是,以编程方式操作C ++代码的困难是巨大的机会损失。
乔恩·哈罗普

我发现您的陈述是:“在剑桥大学从事科学计算的人中,约90%的人精通OCaml。” 非常令人惊讶 作为从事大量建模工作的物理学家,我看到同事使用许多不同的语言:C,C ++,Fortran,Java,Python,Perl,MATLAB,Mathematica,R很常见,其他几种也是如此。但是我从未见过有人使用OCaml。我听到人们谈论关于也许学习,但我从来没有见过任何人使用它。在scicomp.stackexchange.com上搜索几乎没有任何结果。您对ML使用的提倡确实做到了
Szabolcs

6

我认为部分问题在于函数编程不是大多数人思考的自然方式(我说这是对函数编程非常感兴趣并赞赏的人)。如今,绝大多数程序员开始学习过程编程(大多数流行的OOP语言仍是过程的核心),因此功能语言一开始就很难适应,这使情况更加复杂。

当我上大学时,我已经知道相当数量的BASIC,C ++和Java以及一些Pascal和x86汇编语言。我不是专家,但得出的结论是(一点点天真)所有编程语言基本上都相同,但语法略有不同。我们对编程课程的介绍使用了ML,这使我很快没想到这一点。在编程生涯的那个阶段,我很难掌握ML,也没有真正看到函数式编程的意义。我认为要真正了解功能方法的好处,需要更多有关过程编程问题的经验。

我们的ML讲师经常声称,与使用循环或其他过程概念相比,递归表达问题更“自然”且容易。我从来没有被那个说法说服,现在仍然不买它。递归函数有时可以为问题提供特别优雅和简洁的解决方案,但我仍然认为这是思考问题的不自然方法。也许如果您具有很强的数学背景,那么它似乎会更直观,但我认为大多数人都不容易进行递归思考。考虑到递归函数在函数式编程范例中的中心地位,我认为这也可能是函数式语言普及率较低的原因。

对语言流行度也有反馈作用。当我开始编程时,我想知道如何对图形效果和游戏进行编程。在学习了一些BBC BASIC和后来的QBASIC之后,我自然地研究了演示场景和游戏程序员使用的最常见的语言,并着手学习C ++和x86汇编。如今,一些新的程序员可能想知道如何生成Web应用程序,因此会倾向于学习PHP,Ruby或C#。对于自我激励的初学者程序员,几乎没有什么应用领域,其中“什么是学习像X这样的东西的最佳语言”的答案将是“ Ocaml”。

Microsoft对F#作为一流的.NET语言的官方支持解决了Ocaml受欢迎程度有限(缺少成熟的库,调试器,IDE等)的许多实际原因。有趣的是,看看F#是否有助于为函数式编程带来更大程度的普及。


重复关系是总是很好地映射到FP的事物之一。
乔恩·哈罗普

3
“对于大多数人来说,函数式编程并不是一种自然的思考方式”:只要我使用Basic进行编程,结构化编程就不是一种自然的思考方式。然后我搬到帕斯卡。只要我使用Pascal和C进行编程,面向对象的编程就不是我思考的一种自然方法。然后我转向了C ++和Java。在我开始学习Haskell和其他FP语言之前,函数式编程对我来说似乎还很奇怪,现在C ++对于某些任务显得如此尴尬。:-)
乔治

6

我认为问题的核心是政治。Ocaml开发人员主要对研究感兴趣,并且没有资源来提供和维护丰富的库。但是,他们也不愿意将产品的控制权释放给拥有这些资源的社区,结果是解决该问题的几次尝试都依赖于第三方图书馆的不存在的合作和资助,而这些尝试都失败了。除非Ocaml开发人员改变态度,否则电池也会因为相同的原因而失效。

我使用Ocaml开发产品,并且有一个简单的规则:最小化对第三方代码的依赖。当第三方项目有用时,请尽可能将源代码直接包含在包装中。例如,OCS Scheme和Dypgen是Felix解析器的重要组成部分,因此它们被复制到我们的源代码中,因此我们可以对其进行控制。控件有点虚幻(因为Dypgen至少是如此复杂,以至于我们不太可能维持它,但至少我们有一个我们认为可行的副本:)

我不会使用电池,因为许可证是限制性的,所以我无法复制来源,并且我不认为电池作为独立产品具有长期的可用性:我只能使用电池直接合并到Ocaml的标准发行版中。

在C ++世界中,我可能会考虑使用Boost:尽管它是第三方库,但不是标准的一部分,但它得到了社区的大力支持,并且实际上与标准开发过程完全同步。在Boost中开发和测试的想法成为可以标准化的现有实践,并且标准过程足够开放以允许社区参与。

Ocaml之所以获得了真正的普及,是因为它是一款出色的产品,但这还不足以使其成为主流语言。Java很简陋,它在数十亿美元的市场营销和库开发中广受欢迎,但最终必须向社区发布才能生存。


5

我很喜欢用ML和C编写各种项目的代码。阻止我在嵌入式项目中使用ML的原因是垃圾回收(其中大多数项目具有实时限制,需要验证)。

对具有区域的内存管理进行了研究(请参阅MLKit),但是正确使用它们(以及随之而来的风险)所需的实现和培训的复杂性已成为使用它们的障碍。


3

恕我直言,我认为OCaml的一个大问题不是语言(很棒),而是开发它的人,因此,他的许可证是:

http://caml.inria.fr/ocaml/license.en.html

他们使用Q Public许可证进行编译!是的,用于Qt库的前Trolltech许可证!忘记使用此类许可证进行任何贡献。

如果您是在7到8年前检查Language Shootout(http://shootout.alioth.debian.org/)的,那么OCaml在执行速度上就落后于C和C ++。在此期间,其他语言(例如Haskell)获得了更好的编译器(我想是由于采用了不同的社区方法),现在OCaml的执行速度已不如过去。

很快,我不会使用OCaml,因为如果没有一些非常好的黑客创建一个具有真正开源许可证和一个具有真正开源行为的社区的OCaml编译器,我看不到它会更好。


不久前,在邮件列表上进行了一次讨论,讨论有关OCaml在“语言大战”中的表现不佳的问题。令人惊讶的是,类似于C的语言被允许使用非标准的内存分配器,而不允许垃圾收集的语言调整其自己的垃圾收集器...而且IIRC OCaml的默认设置对于当今的CPU来说有点过时了。
bltxd 2011年

3

好吧,如果像@jrockway所说的关于金钱的话,我们将看看F#是否会像java或C#那样流行。

对我来说,我想开发人员对功能的工作方式并不满意(那是在2009年Techday的F#会议上,大约有10个人说他们了解近100个人中的功能编程)。

我是从今年开始OCAML的,我从没对函数式编程感到不满,但是现在我真的总是从OCAML和解决问题的函数式方法中学到新东西(但是我不能说我会放弃C#使用OCAML :))。


10年前,了解FP的人数可能超过100人中的1人。;-)
乔恩·哈罗普

2

好吧,也许F#变得流行了。


2

c-> ocaml比c-> lisp更大的心理转变没有帮助。我已经考虑过ocaml几次,并且总是发现成本/收益对我而言并不存在,因此请再次搁置。不是让构造看起来很难,而是实际上看起来真的很整洁。它试图学习“!”的完全不同的含义。Lisp至少看起来如此不同,很容易避免将其中的小片段误解为c。



1

我认为主要原因是开发人员不了解OCaml。

当与其他开发人员(听说过Ocaml的开发人员)交谈时,我总是给人一种印象,他们认为OCaml是一种“仅用于教育”的语言……可悲但真实


我相信现在有2家公司的OCaml开发人员超过20个(Jane St.和Citrix)。
乔恩·哈罗普

3
哇!整个两家公司?:)
Yttrill 2011年

0

我非常喜欢O'caml ...我已经使用它,编译器,解释器,与C通信的系统实现了很多东西...

当我了解它时,主要的问题是错误消息不是很清楚...例如,一开始我不确定是什么时候放';' 真的很难找到那个; 被放错了位置...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.