我从不理解这种说法。老实说,即使您声明了函数的返回类型,在编写了许多行代码之后,您也可能会忘记它,而您仍然必须返回到使用的搜索功能声明它的行。您的文本编辑器进行检查。
这与您忘记返回类型无关,这总是会发生。关于该工具能够让您知道您忘记了返回类型。
另外,由于函数是用type声明的funcname()...
,因此要知道类型,您将不得不在调用该函数的每一行中进行搜索,因为您只知道funcname
,而在Python之类的语言中,您只能搜索def funcname
或function funcname
仅发生一次,在声明中。
这是语法问题,与静态类型完全无关。
当您想要查找声明而无需使用专用工具时,C系列语法确实是不友好的。其他语言没有这个问题。请参阅Rust的声明语法:
fn funcname(a: i32) -> i32
此外,使用REPL可以很容易地测试一个函数是否具有不同输入的返回类型,而对于静态类型的语言,您需要添加一些代码行并重新编译所有内容才能知道所声明的类型。
可以解释任何语言,并且任何语言都可以具有REPL。
因此,除了知道函数的返回类型显然不是静态类型语言的要点之外,静态类型在大型项目中真的有什么帮助?
我将以抽象的方式回答。
程序由各种操作组成,由于开发人员的某些假设,这些操作按其方式进行了布局。
有些假设是隐式的,有些则是显式的。一些假设涉及靠近它们的操作,一些假设涉及远离它们的操作。假设在明确表达时应易于识别,并尽可能接近其真值所在的地方。
错误是程序中存在的假设的表示,但在某些情况下不成立。要查找错误,我们需要确定错误的假设。要删除该错误,我们需要从程序中删除该假设或进行一些更改以使该假设真正成立。
我想将假设分为两种。
第一种是可能成立的假设,也可能不会成立,这取决于程序的输入。为了确定这种错误假设,我们需要在程序所有可能输入的空间中进行搜索。使用有根据的猜测和理性思考,我们可以缩小问题的范围,并在更小的空间内进行搜索。但是,尽管程序甚至增长了一点,但它的初始输入空间却以极大的速度增长-到了可以将其视为所有实际目的无限的程度。
第二类是对所有输入绝对成立的假设,或者对所有输入绝对错误的假设。当我们认为这种假设是错误的时,我们甚至不需要运行程序或测试任何输入。当我们确定这种假设是正确的时,当我们追踪一个错误(任何错误)时,我们就不用担心什么了。因此,有尽可能多的假设属于这种价值。
要将假设置于第二类中(与输入无关,始终为true或始终为false),我们需要在进行假设的地方提供最少的信息。在整个程序的源代码中,信息很快就会过时(例如,许多编译器不进行过程间分析,这使得大多数信息的调用都难以进行)。我们需要一种方法来使所需的信息保持最新(有效且邻近)。
一种方法是使此信息的源尽可能靠近要使用的地方,但是对于大多数用例而言,这是不切实际的。另一种方法是经常重复信息,从而在源代码中更新其相关性。
您已经猜到了,静态类型就是这样-散布在源代码中的类型信息信标。该信息可用于将关于类型正确性的大多数假设放在第二类中,这意味着就类型兼容性而言,几乎所有操作都可以归类为始终正确或始终不正确。
当我们的类型不正确时,该分析通过尽早而不是迟早地引起我们的注意来节省我们的时间。当我们的类型正确时,通过确保在发生错误时可以立即排除类型错误,该分析为我们节省了时间。