大数据类型:为什么像花哨类型这样的代码工具喜欢被编写

主要观点:具有 ML 风格类型系统的语言(如 Haskell 和 OCaml)在“代码工具”类软件项目中特别成功,而在 Web 应用中相对不那么受欢迎。原因可能是社会学因素(如理想主义开发者)、路径依赖和网络效应,且在“代码工具”中类型化函数式编程有其内在优势,如“Big Datatype”现象,能让类型系统更好地指导重构。
关键信息:

  • 在 Haskell 中:有 Purescript、Elm、Unison、Agda 等编程语言,Github 的 Semantic 库用于多种编程语言的代码导航,ShellCheck 是 shell 脚本的 linter。
  • 在 OCaml 中:有 Comby、Semgrep、Flow、Hack 等工具。
  • 除代码工具外,这些语言在其他领域较罕见,如 Mercurv 用 Haskell 做后端,Jane Street 用 OCaml,还有一些区块链项目。
  • 对于“Big Datatype”,在代码工具中源代码围绕少数重要的集中式数据类型组织,如编译器的抽象语法树等;而 Web 应用中没有这么明显的“Big Datatype”,如典型的 Web 后端有多个独立的类。
  • 表达性类型系统在有“Big Datatype”的代码库中更有优势,能让类型系统更好地指导重构,如在“Big Datatype”代码库中平均每次类型更改会引发更多级联的类型错误,更多表达性能让类型系统更集中地指导推理。
  • 专业上大部分写的是 Typescript,它也可用于写代码工具,若有意为之,也能体验到“类型错误级联”,虽不像 Haskell 那样强制,但也能让人受益。

重要细节:

  • 在 Haskell 中,许多语言都具有 ML 风格类型系统,Semantic 库是 Github 为多种语言的代码库实现代码导航而建,ShellCheck 用于检查 shell 脚本错误。
  • 在 OCaml 中,Comby 用于 codemods,Semgrep 用于搜索代码模式,Flow 是 Meta 的 Javascript 类型检查器,Hack 是 Meta 对 PHP 的分支。
  • 对于“Big Datatype”,在编译器等代码工具中,有抽象语法树等重要数据类型,而在 Web 后端的models/目录中是多个独立的类。
  • 以“likes”服务为例说明在 Web 后端可以用不同语言和数据库,因为各服务解决的问题相对独立,但在编译器中不同部分的功能相互关联。
  • 在 Typescript 中,若有意为之,也能利用其表达性类型系统进行代码工具开发,虽不像 Haskell 那样强制,但也能体验到“类型错误级联”。
阅读 12
0 条评论