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

时间:2014-11-19 17:11:45

标签: javascript ocaml flowtype hacklang

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

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

1 个答案:

答案 0 :(得分:47)

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

  • 最大的原因是OCaml对defining your own datatypes以及pattern matching on them有很好的支持。 Hack和Flow的大多数操作都是针对各种形式的AST进行操作,并且有一种非常好的方式来表达"如果你看到这种节点里面有这种节点,那么就做这件事"非常宝贵。看一下definition of subtyping in Hack - 它确实很复杂,但从本质上说它只是一种类型的大型模式匹配,并且在没有模式的任何语言中都是难以理解的复杂匹配。
  • OCaml在很大程度上是一种函数式语言,对一流函数和不可变数据结构有很大的支持。与上述类似,当您进行类型检查时,您最终会在不同类型的地图上进行批次并在AST节点上进行折叠,而功能语言则非常简洁地表达。例如,键入代码块实际上是just a fold_left over the statements it contains
  • 但它不是纯粹的功能。它不纯洁" - 有时,mutable stateusing exceptions或类似内容只是表达某些内容的最佳方式。但最重要的是,意味着您不需要任何复杂的杂技或心理模型切换或任何通过FFI调用C函数的东西。 Hack和Flow都使用相同的模型进行多线程处理:在不同的mmap进程之间共享的特殊fork区域,包含共享的无锁哈希表。这是我不想用C - and that's exactly what we do之外的任何语言表达的那种东西。 OCaml代码可以调用几个神奇的函数,而不是任何明智的,它实际上是C的底层。 (顺便说一下,我将在1月份做一个关于我的多线程如何工作的技术讲座,以及其他一些Hack实现细节 - 它真的很酷,但很难掌握介绍,即使代码是开源的!)