Подтвердить что ты не робот

Каковы преимущества OCaml как языка программирования Hacklang и Flow?

В последнее время Facebook анонсировал Flow, статический тип проверки JavaScript, который реализован в основном в OCaml (https://code.facebook.com/posts/1505962329687926/flow-a-new-static-type-checker-for-javascript/).

Hacklang (PHP со статическим типом проверки) также в основном написан в OCaml. Итак, интересно, какие отличительные преимущества OCaml для создания проверки статического типа?

4b9b3361

Ответ 1

"Каковы преимущества OCaml как языка программирования" - это действительно вопрос, основанный на мнениях, и тот, который я не буду решать здесь. Тем не менее, я работаю над командой Hack в Facebook и тесно сотрудничал с командой Flow, поэтому я могу ответить на вопрос, который, как я думаю, вы намеревались спросить: "Почему Facebook выбрал OCaml для создания Hack and Flow?"

  • Самая большая причина в том, что OCaml имеет блестящую поддержку определения ваших собственных типов данных, а затем сопоставление шаблонов с ними. Большинство из того, что делают Hack и Flow, являются операциями над различными формами AST и имеют действительно хороший способ выразить "если вы видите этот вид node с этим видом node внутри него, сделайте это", это неоценимо, Взгляните на определение подтипирования в Hack - это, конечно, сложно, но в основе его лежит просто большое совпадение шаблонов по паре типов и будет непроницаемо комплекс на любом языке без соответствия шаблону.
  • OCaml в значительной степени является функциональным языком, с большой поддержкой первоклассных функций и неизменных структур данных. Подобно тому, как вы это делали, когда вы выполняете проверку типов, вы в конечном итоге делаете много разных видов карт и сгибов по узлам AST, а функциональные языки выражают это очень сжато. Например, набрав блок кода, буквально просто fold_left над содержащимися в нем операторами.
  • Но это не чисто функционально. Это "нечисто" - иногда, изменяемое состояние, с использованием исключений, или аналогичный - это самый лучший способ выражать что-то. Но самое главное, это означает, что вам не нужна какая-либо сложная акробатика или ментальная модель или что-либо, чтобы вызвать функции C через FFI. Как Hack, так и Flow используют одну и ту же модель для многопоточности: специально область mmap 'd, разделяемая между различными процессами fork' d, содержащая общую, заблокированную хеш-таблицу. Это то, что я бы не хотел выражать на любом языке, кроме C - и это именно то, что мы делаем. Код OCaml может вызвать пару магических функций, не будучи более мудрым, чем на самом деле C под капотом. (В стороне, я собираюсь сделать технический разговор в январе о том, как точно работает наш многопоточность, а также некоторые другие детали реализации Hack - это действительно здорово, но трудно понять без ввода, даже если код является открытым исходным кодом!)