静态分析与静态类型

时间:2014-05-09 06:03:06

标签: erlang reduce elixir dialyzer

我正在学习Elixir,而'透析器'工具可以让你进行静态分析 - 用它所期望的参数的类型规范和它返回的输出来注释函数定义。它是完全可选的,但如果要尽可能地使用它,它如何与良好的静态打字相匹配?

3 个答案:

答案 0 :(得分:7)

我的印象是透析器不像静态类型那么精确,这意味着它有时不报告错误,尽管它应该。

从好的方面来说,如果透析器抱怨,那几乎总是我的错。通常,错误通常是由于不正确的类型规范造成的。

所以,虽然我不认为透析器是静态打字的好工具,但它仍然有帮助。特别是,我发现typespecs非常有用,因为它们可以作为文档。最近我换了工作,我加入的项目是一个复杂的Erlang项目。由于类型规范,我很容易找到代码库。

所以我的建议是在大型项目中使用typespecs。我们只为出口(公共)功能和记录编写它们,这是一个很大的帮助,而不会占用太多时间。我通常首先使代码工作,当我对它感到满意时,添加规格,并运行透析器以验证一切正常。

答案 1 :(得分:2)

虽然静态类型可以解决一大堆错误,但透析器等静态分析工具可以告诉您更多关于代码中潜在陷阱的信息。假设你最大限度地使用了规格,透析器可能比静态打字更有用,至少与Go,C#等语言相比。像Haskell这样强大的类型系统的东西仍然可以受益于静态分析,但不像一个像Go这样天真类型系统的语言。静态分析在与静态类型系统结合时最有用,并且由于Erlang和Elixir都是动态语言,静态分析只能做很多事情。也就是说,透析器非常强大且有用,如果一直使用,应提供至少相同级别的保护,如果不是更多,则可能是您可能已经熟悉的类型系统。

我会看一下透析器文档(http://www.erlang.org/doc/man/dialyzer.html),它们可以告诉你更多关于Erlang和Elixir的工具的期望。希望这有帮助!

答案 2 :(得分:1)

一方面,静态类型内置于编译阶段 - 有点不可错过。另一方面,静态分析是开发人员必须自愿运行的。

同样,人们不必在Elixir中注释任何东西;它完全取决于程序员的自由裁量权。在静态类型的语言中,它是不可避免的。

我会说你的问题有点广泛,因此很难回答。你可能想把它放在Programmers.Stackechange上。