OCaml作为Hacklang和Flow背后的编程语言有什么好处?

Sup*_*ate 34 javascript ocaml hacklang flowtype

最近,Facebook宣布了Flow,一种用于JavaScript的静态类型检查器,主要在OCaml中实现(https://code.facebook.com/posts/1505962329687926/flow-a-new-static-type-checker-for-javascript/).

Hacklang(带静态类型检查器的PHP)也主要用OCaml编写.所以,我想知道OCaml制作静态类型检查器的独特优势是什么?

Jos*_*man 47

"OCaml作为一种编程语言有什么好处"确实是一个基于意见的问题,而且我不打算在这里解决.但是,我在Facebook的Hack团队工作,并与Flow团队密切合作,所以我可以回答我认为你打算问的问题:"为什么Facebook选择OCaml来构建Hack和Flow?"

  • 最大的原因是OCaml非常支持定义自己的数据类型,然后对它们进行模式匹配.Hack和Flow的大多数操作都是针对各种形式的AST进行操作,并且有一种非常好的方式来表达"如果你看到这种节点里面有这种节点,做这件事"是非常宝贵的.看看Hack中子类型定义 - 它确实很复杂,但从本质上说它只是一对类型的大模式匹配,并且在没有模式匹配的情况下在任何语言中都是不可读的复杂.
  • OCaml在很大程度上是一种函数式语言,对一流函数和不可变数据结构有很好的支持.与上面类似,当你进行类型检查时,你最终会在AST节点上做很多不同类型的地图和折叠,而功能语言则表达得非常简洁.例如,键入一个代码块实际上只是fold_left它包含的语句.
  • 但它不是纯粹的功能.它是"不纯的" - 有时,可变状态,使用异常或类似只是表达某些东西的最好方式.但最重要的是,这意味着您不需要任何复杂的杂技或心理模型切换或任何通过FFI调用C函数的东西.Hack和Flow都使用相同的模型进行多线程处理:一个mmap在不同fork的进程之间共享的特殊区域,包含一个共享的无锁哈希表.这是我不想用除C之外的任何语言表达的那种东西 - 而这正是我们所做的.OCaml代码可以调用几个魔术函数,而不是任何更明智的,它实际上是C引擎盖.(顺便说一下,我将在1月份做一个关于我的多线程如何工作的技术讲座,以及其他一些Hack实现细节 - 它真的很酷,但很难掌握没有介绍,即使代码是开源的!)

  • 几周前我就Hack内部进行了一次演讲; 它的第三部分是在神奇的mmap'd区域.我建议观看整个演讲,但是如果你想直接跳到那个部分,这里是带时间戳的链接:https://youtu.be/aN22-V-b8RM?t = 39m (2认同)